如何在不将其设置为默认值的情况下使用 URL 以编程方式播放通知声音?
How to play a notification sound programatically using the URI without setting it to default?
我正在使用以下代码获取 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();
找到了解决我的问题的方法。
我需要将通知声音的 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);
}
我正在使用以下代码获取 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();
找到了解决我的问题的方法。
我需要将通知声音的 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);
}