更改android中的通知铃声

时间:2013-09-08 12:19:47

标签: android notifications ringtone

我已经自己实施了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());

2 个答案:

答案 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。

Here is the complete sample (for uri selection).

答案 1 :(得分:2)

这是让您设置基调的代码:

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

//custom sound
notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);