Как программно проиграть рингтон из raw папки?

211
24 мая 2017, 05:29

Я делаю пользовательский DialogPreference, который выводит окно выбора рингтона. Кроме списка доступных в системе рингтонов, в окне выводятся дополнительные .mp3 файлы приложения, находящиеся в папке raw. В обработчике нажатия я проигрываю выбранную мелодию. Установленные рингтоны проигрываются без проблем, а вместо моих raw файлов проигрывается мелодия по умолчанию.

Проигрывание mp3 файлов:

try{
   int resId = mContext.getResources().getIdentifier("name_of_my_mp3", "raw", 
   mContext.getPackageName());
   Uri uri=Uri.parse("android.resource://" + mContext.getPackageName() + "/"+resId);
   Ringtone ringtone = RingtoneManager.getRingtone(mContext, uri);
   ringtone.play();
catch (Exception e) {
  e.printStackTrace();
}

Ошибок не вызывает, идентификатор находит, но играет дефолтную мелодию. Может подскажете, где копать?

Answer 1

Проблема решена заменой Ringtone на MediaPlayer.

private MediaPlayer mPlayer;
//конструктор
public ExtraRingtonePreference(Context context, AttributeSet attrs) {
mPlayer=new MediaPlayer();
}
//проигрывание при нажатии на строчку списка с мелодией
 public void onClick(DialogInterface dialog, int which) {
            if ( mPlayer.isPlaying()) {
                mPlayer.stop();
            }
            int resId = mContext.getResources().getIdentifier("name_of_pressed_sound", "raw", mContext.getPackageName());
            Uri uri = Uri.parse("android.resource://" + mContext.getPackageName() + "/" + resId);
            if (uri != null) {
                if (uri.toString().length() > 0) {
                    try
                    {
                        mPlayer.reset();//очистить от предыдущей мелодии, иначе выдаст ошибку ввода/вывода
                        mPlayer.setDataSource(mContext, uri);
                        mPlayer.prepare();
                        mPlayer.start();
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } 
        }
Answer 2

RingtoneManager если не может найти файл подсовывает стандартный рингтон, попробуйте в таком формате

android.resource://com.example.package/raw/name_of_my_mp3
READ ALSO
Перевод числа в массив байтов

Перевод числа в массив байтов

Как представить число (int, float) в виде массива байтов в Java?

482
Как получить значение из ячейки JTable

Как получить значение из ячейки JTable

Использую метод getValueAt() чтобы получить значение числа из ячейки JTable но возвращается почему то 0

276
Как запустить java-файл с помощью javac

Как запустить java-файл с помощью javac

Как запустить java-файл без среды разработки? Выдает ошибку:

338
no multi-part configuration has been provided

no multi-part configuration has been provided

Пишу сайт на java + SpringНеобходимо добавить загрузку фото, документов на сайт

805