Запуск медиаплеера с помощью Intent

Я разрабатываю свое первое приложение для Android . Это приложение для записи голоса. Я записываю голос с помощью MediaRecord следующим образом:

mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();

И у меня есть еще одно действие для воспроизведения этих записанных голосов (.3gpp файлов). В этом упражнении есть ListView, содержащий мои записанные голоса. Я хочу воспроизводить звук с помощью любого музыкального проигрывателя, установленного на телефоне. Вот мой код: (Источник для этого кода: https://stackoverflow.com/a/3367231/556169)

Intent intent = new Intent();  
intent.setAction(android.content.Intent.ACTION_VIEW);  
File file = new File((String) ((TextView) item).getText());  
intent.setDataAndType(Uri.fromFile(file), "audio/*");  
startActivity(intent);

Но я получаю сообщение об ошибке «Музыкальный проигрыватель не может воспроизводить этот тип мультимедиа».

Когда я просматриваю эти аудиофайлы и воспроизводю их через проводник, он работает отлично (это означает, что я успешно записываю голоса). Но когда я использую Intent внутри своего приложения, я получаю сообщение об ошибке.

ДОПОЛНИТЕЛЬНО Я не могу использовать MediaStore.INTENT_ACTION_MUSIC_PLAYER, потому что он устарел. Я не могу использовать Intent.CATEGORY_APP_MUSIC, потому что для этого требуется минимальный уровень API 15. Минимальный уровень API моего проекта должен быть 8.


person Eray    schedule 12.06.2013    source источник


Ответы (2)


Я думаю, что лучший вариант — использовать действие выбора, где пользователь может выбрать свой любимый медиаплеер.

Intent viewIntent = new Intent(Intent.ACTION_VIEW);
File file = new File((String) ((TextView) item).getText());
viewIntent.setDataAndType(Uri.fromFile(file), "audio/*");
startActivity(Intent.createChooser(viewIntent, null));

Кстати, такой способ передачи имени файла мне кажется немного странным. Я бы подумал о смене.

Я не уверен, но вы сможете увидеть своего собственного игрока в селекторе, если объявите соответствующие фильтры намерений.

person mdelolmo    schedule 12.06.2013

Вы по-прежнему можете использовать устаревшее намерение для целевых уровней API ниже 15, а затем использовать новое намерение для более новых уровней API. Для этого просто используйте проверку в своем коде следующим образом:

if ( Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 )  {
   // use the [MediaStore.INTENT_ACTION_MUSIC_PLAYER] intent
}
else  {
   // use the [Intent.CATEGORY_APP_MUSIC] intent
}

Просто убедитесь, что ваш TargetAPI равен 15 или выше; ваш MinAPI может быть 8.

person free3dom    schedule 12.06.2013
comment
Я вчера попробовал, есть проблемы. На Galaxy Note 2 (Android 4.1.2) я получаю No Activity found to handle Intent { act=android.intent.category.APP_MUSIC dat=file:///audiorecordtest20130612145343.3gp typ=audio/* } . И на Galaxy S2 (Android 4.1.2) мой музыкальный проигрыватель запускается, а затем внезапно выключается. - person Eray; 13.06.2013
comment
` ‹uses-sdk android:minSdkVersion=8 android:targetSdkVersion=17 /›` - person Eray; 13.06.2013
comment
Похоже, это проблема, связанная с тем, что некоторые устройства Samsung не регистрируют музыкальный проигрыватель должным образом. Подробнее см. здесь. - person free3dom; 13.06.2013