我正试图根据所选列表视图项的位置将所选声音保存为铃声/通知声音,但我在查找相关教程(如果有的话)时遇到了严重问题。以下是我到目前为止的代码,但我希望以最简单的方式/尽可能少的代码行来实现这一点,因此为了简单起见,我使用了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);
}
}
}
}
希望这能奏效。。。。(如果有用的话,请投票支持)。。。