Изменение мелодии уведомления в андроид

Я реализовал 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 ответа

Хорошо, первый шаг - позволить пользователю выбрать мелодию, которую он хочет. Я помогу вам реализовать занятие, которое перечисляет доступные мелодии и позволяет пользователю выбрать один из них. Естественно, это действие 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 списка, который в этом контексте является самой деятельностью. Поэтому деятельность должна осуществлять 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, используя Uri.parse(theString),

Вот полный образец (для выбора URI).

Это код, который позволяет вам установить тон:

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

//custom sound
notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);
Другие вопросы по тегам