我使用以下代码获取Android设备上可用的通知声音列表:
public static ArrayList<String> getNotificationSounds(Activity curActivity) {
RingtoneManager manager = new RingtoneManager(curActivity);
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
Cursor cursor = manager.getCursor();
ArrayList<String> list = new ArrayList<>();
while (cursor.moveToNext()) {
String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX);
String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
String name = cursor.getString((RingtoneManager.TITLE_COLUMN_INDEX));
list.add(name);
}
return list;
}
现在我想播放其中一种通知声音(没有图像或标题),只是声音 ,而不将其设置为默认值。
我见过很多解决方案,建议使用
将声音设为默认值RingtoneManager.setActualDefaultRingtoneUri(this,RingtoneManager.TYPE_NOTIFICATION,soundClipUri);
使用我从上述方法获得的URI
String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
我收到错误消息,指出数据源无效。
所以,总结一下,
1)如何在不将其设为默认声音的情况下播放通知声音?
2)如何获取和使用该通知声音的Uri?
编辑:当我尝试从上面提到的游标查询中打印URI时,我得到了相同的结果:
content://media/internal/audio/media
所有可用的通知声音。
我们是否应该将通知声音标题附加到此并将结果作为Uri传递?
播放通知的代码:
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(),uri);
r.play();
答案 0 :(得分:2)
找到解决我问题的方法。
我需要将通知声音的ID附加到该方法返回的URI中,以便正确定位内部通知声音。
以下是解决方案,我收到通知声音的URI并使用以下代码播放:
try
{
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), PhoneUtils.getNotificationSoundUri(getApplicationContext(), getSoundClipID()));
r.play();
}
catch (Exception e)
{
e.printStackTrace();
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), getSoundClipID()));
r.play();
}
getNotification声音URI方法的代码:
public static Uri getNotificationSoundUri(Context context,String soundClipId)
{
RingtoneManager manager = new RingtoneManager(context);
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
Cursor cursor = manager.getCursor();
ArrayList<NotificationSound> list = new ArrayList<>();
while (cursor.moveToNext()) {
if(soundClipId.equals(cursor.getString(RingtoneManager.ID_COLUMN_INDEX)))
{
return Uri.parse(cursor.getString(RingtoneManager.URI_COLUMN_INDEX)+"/"+cursor.getString(RingtoneManager.ID_COLUMN_INDEX));
}
}
return RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
}