Изменение мелодии уведомления в андроид
Я реализовал 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)
,
Это код, который позволяет вам установить тон:
Notification notification = new Notification(icon, text, time);
//custom sound
notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);