2016-10-26 5 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 этого звука уведомления?

EDIT: Когда я попытался напечатать URI от курсора запроса, упомянутого выше, я получаю тот же результат:

content://media/internal/audio/media 

для всех звуков имеющихся уведомлений.

Предполагаем ли мы добавить звуковое название уведомления к этому и передать результат как Uri?

Код для воспроизведения уведомления:

Ringtone r = RingtoneManager.getRingtone(getApplicationContext(),uri); 
r.play(); 
+0

«Я получаю сообщение об ошибке говорящее этот источник данных недействителен »- что такое' Uri'? Как вы его используете? – CommonsWare

+0

Редактирование моего вопроса :) – SoulRayder

+0

@CommonsWare: Посмотрите сейчас. – SoulRayder

ответ

1

Найдено решение моей проблемы.

Мне нужно добавить идентификатор звука уведомления в 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); 
}