изменить мелодию уведомлений в андроиде

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

person rick    schedule 08.09.2013    source источник


Ответы (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 представления списка значение 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, используя Uri.parse(theString).

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

person Sherif elKhatib    schedule 11.09.2013
comment
Привет, спасибо за ваш ответ. Как получить режим единого выбора для этого списка, чтобы пользователь мог выбирать? Я пробовал с getListView().setSingleChoicemode(...); это не сработало. Пожалуйста, предложите. - person rick; 12.09.2013
comment
Большое спасибо, я понял это. Кстати, для получения мелодий требуется много времени. Конечно, я запускал его в фоновом режиме, но это требует времени. - person rick; 12.09.2013

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

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

//custom sound
notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);
person Stefano Munarini    schedule 08.09.2013
comment
Спасибо за Ваш ответ. Я знал это. Ваш код устанавливает мелодию звонка, которая находится в исходной папке, но мне нужно показать список мелодий звонка, присутствующих в устройстве, как это делают настройки мелодии звонка. - person rick; 08.09.2013
comment
Создайте список, в котором пользователь может выбрать рингтон. Вы вводите имя em - person Stefano Munarini; 08.09.2013
comment
Да, но нужно ли мне снова составлять список? Или есть какой-нибудь провайдер, чтобы я мог получить к ним доступ прямо в списке, как в списке контактов, без дополнительной работы? - person rick; 08.09.2013