好的,第一步是允许用户选择他想要的铃声。我将帮助您实现一个列出可用铃声并允许用户选择一个的活动。自然地,这个活动是一个ListActivity。
首先为铃声创建一个容器。我称它为 RingtoneObject,它包含铃声的名称以及铃声的 uri:
private static final class RingtoneObject {
private String name;
private Uri uri;
public RingtoneObject(String name, Uri uri) {
this.name = name;
this.uri = uri;
}
@Override
public String toString() {
return name==null?"":name.toString();
}
}
在 onCreate 中,您应该向 RingtoneManager 查询可用的铃声,然后对其进行迭代并将它们添加到 RingtoneObject 类型的列表中。代码很简单:
ArrayAdapter<RingtoneObject> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RingtoneManager ringtoneMgr = new RingtoneManager(this);
ringtoneMgr.setType(RingtoneManager.TYPE_ALARM);
Cursor alarmsCursor = ringtoneMgr.getCursor();
int alarmsCount = alarmsCursor.getCount();
RingtoneObject[] alarms = new RingtoneObject[alarmsCount];
int index = 0;
while(alarmsCursor.moveToNext()) {
alarms[index] = new RingtoneObject(ringtoneMgr.getRingtone(index).getTitle(this), ringtoneMgr.getRingtoneUri(index));
index++;
}
alarmsCursor.close();
adapter = new ArrayAdapter<MainActivity.RingtoneObject>(this, android.R.layout.simple_list_item_1, alarms);
setListAdapter(adapter);
getListView().setOnItemClickListener(this);
}
您会注意到适配器的范围超出了 onCreate 函数。我需要在 OnItemClickListener 的回调中引用它。您还可以注意到,我将列表视图的 OnItemClickListener 设置为this,在这种情况下,它就是活动本身。因此,该活动应该实现OnItemClickListener
,并且当单击一个项目时:我只是播放了铃声。
MediaPlayer md;
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if(md != null) {
if(md.isPlaying())
md.stop();
md = null;
}
md = MediaPlayer.create(this, adapter.getItem(position).uri);
md.start();
}
同样,MediaPlayer
因为我想停止播放时需要参考,所以它不在功能范围内。
无论如何,在您自己的 onItemClick 函数或您为用户选择铃声提供的某种其他机制中,您必须将铃声的 Uri 保存在一些持久存储(例如 SharedPreferences)中,然后当您想要显示通知时,使用保存的 uri。
注意:您可以使用将 uri 保存为字符串,theUri.toString()
然后加载此字符串并将其转换回使用Uri.parse(theString)
.
这是完整的示例(用于 uri 选择)。