如何在不将其设置为默认值的情况下使用 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);
}