根据所选列表视图项的位置设置铃声



我正试图根据所选列表视图项的位置将所选声音保存为铃声/通知声音,但我在查找相关教程(如果有的话)时遇到了严重问题。以下是我到目前为止的代码,但我希望以最简单的方式/尽可能少的代码行来实现这一点,因此为了简单起见,我使用了1个上下文菜单。理想情况下

public void function1(int id){
    }

是设置铃声和的代码所在的位置

public void function2(int id){
    }

是用于设置通知声音的代码的位置。

例如(试图在设置铃声时实现这一点)点击&按住"铃声"列表项>显示上下文菜单>选择"设置为铃声"上下文菜单项>显示"电话铃声"窗口("铃声"是可用选项之一)>用户单击确定或取消>如果用户单击确定,返回我的应用程序并显示祝酒词通知("铃声已保存")或如果用户单击取消,返回我的应用程序并显示toast通知("铃声未保存")。

我们将非常感谢您的帮助。

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {
    private ListView mainList;
    private MediaPlayer mp;
    private final String[] listContent = {
            "chimes", "chord", "ding", "notify", 
            "recycle", "ringin", "ring out","tada"
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = new MediaPlayer();
        mainList = (ListView) findViewById(R.id.main_listView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, listContent);
        mainList.setAdapter(adapter);
        registerForContextMenu(this.mainList);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, v.getId(), 0, "Action 1");
        menu.add(0, v.getId(), 0, "Action 2");
    }
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getTitle().equals("Action 1")){
            function1(item.getItemId());
        } else if (item.getTitle().equals("Action 2")){
            function2(item.getItemId());
        } else {
            return false;
        }
        return true;
    }
    public void function1(int id){
    }
    public void function2(int id){
    }
}

要设置铃声或通知声音,请使用RingToneManager。

特别是你使用

RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri);

用于设置默认铃声。你使用

RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_NOTIFICATION, newUri);

用于设置默认通知声音。

这需要一个URI(统一资源标识符),它不是像函数当前采用的那样的整数或ItemId。

从您的示例代码中,可以选择一些可能的选项。

第一种方法是将铃声的标题作为字符串而不是ID传递到函数中,然后调用RingtoneManager.getCursor()以获得所有可能铃声的列表,并检查每个铃声以查看标题是否匹配,如果匹配,则为匹配的标题设置URI。

第二种方法是根据所有可用铃声的光标和id中的通行证列出选择列表,并使用RingtoneManager.getRingtoneUri(id)获取URI。一种方法在使用SimpleCursorAdapter在Android中使用ListView模板显示来自RingtoneManager的铃声中进行了详细介绍

第三个是使用ACTION_RINGTONE_PICKER,它有一个相关的StackOverflow问题。

对不起,这可能是一条评论。我现在没有足够的权限发表评论。请告诉我这对你来说是怎么回事…

要获取铃声选择器,

Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
startActivityForResult(intent,999);

现在覆盖activityfragment中的onActivityResult()。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK
            && requestCode == 999)
        if (data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) != null) {
            Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            if (uri != null) {
                RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_NOTIFICATION, uri);
            }
        }
    }
}

希望这能奏效。。。。(如果有用的话,请投票支持)。。。

最新更新