我已经自己实施了preference screen
,即我准备了custom listview
并管理了我的应用所需的所有内容。但我被困在如何给用户改变通知铃声的设施。通常我们可以通过RingtonePreferece
来实现这一点。
但是如何在不使用偏好设置屏幕的情况下实现它,以便通过单击该列表项目,它应该将用户重定向到铃声列表,当他选择该特定铃声时,铃声的标题应该显示在该特定列表上行,必须用作通知的铃声。有人可以建议如何实现这一目标吗?以下是我的通知代码。
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker(msg)
.setContentTitle(title)
.setContentText(msg)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true);
NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(id, builder.build());
答案 0 :(得分:3)
好的第一步是允许用户选择他想要的铃声。我将帮助您实现列出可用铃声的活动,并允许用户选择一个。当然,此活动是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的回调中引用它。您也可以注意到我将listview的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。
注意:您可以使用theUri.toString()
将uri保存为字符串,然后加载此字符串并使用Uri.parse(theString)
将其转换回Uri。
答案 1 :(得分:2)
这是让您设置基调的代码:
Notification notification = new Notification(icon, text, time);
//custom sound
notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);