如何使用URI以编程方式播放通知声音而不将其设置为默认值?

时间:2016-10-26 14:03:05

标签: android uri android-notifications

我使用以下代码获取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();

1 个答案:

答案 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);
}