3

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

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 lvl 15. Минимальный уровень API моего проекта должен быть равен 8.

ответ

5

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

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)); 

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

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

2

Вы все равно можете использовать устаревшее намерение для целевого уровня 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.

+0

Я пробовал это вчера, есть проблемы. На Galaxy Note 2 (Android 4.1.2) я получаю 'No Activity found для обработки Intent {act = android.intent.category.APP_MUSIC dat = file: ///audiorecordtest20130612145343.3gp typ = audio/*}'. И на Galaxy S2 (Android 4.1.2) мой музыкальный проигрыватель запускается, а затем внезапно отключается. – Eray

+0

'' – Eray

+0

Похоже, что некоторые устройства Samsung неправильно регистрируют свой музыкальный плеер. См. [Здесь] (http://stackoverflow.com/questions/12532207/open-music-player-on-galaxy-s3) для получения дополнительной информации. – free3dom