2016-10-26 36 views
0

我用下面的代码获取通知的清单听起来可用的Android设备上:如何使用URI以编程方式播放通知声音而不将其设置为默认值?

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

“我得到一个错误说该数据源无效“ - ”Uri“是什么?你怎么使用它? – CommonsWare

+0

编辑我的问题:) – SoulRayder

+0

@CommonsWare:请现在看看。 – SoulRayder

回答

1

找到了解决我的问题。

我需要通知声音的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); 
} 
相关问题