1

我自己实现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());
4

2 回答 2

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 的回调中引用它。您还可以注意到,我将列表视图的 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 选择)。

于 2013-09-11T14:27:35.307 回答
2

这是让您定调的代码:

Notification notification = new Notification(icon, text, time);

//custom sound
notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);
于 2013-09-08T12:33:04.543 回答