我自己实现了 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());
最佳答案
好的,第一步是让用户选择他想要的铃声。我将帮助您实现一个列出可用铃声并允许用户选择一个的 Activity 。当然,这个 Activity 是一个 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,在此上下文中,它是 Activity 本身。因此,该 Activity 应实现 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 >.
关于android - 更改android中的通知铃声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18683608/