Как открыть музыкальный сборщик?

В моем приложении я хочу сделать подборщик, который предлагает пользователю выбор для выбора музыки. Я хочу использовать собственный сборщик андроидов. Я использовал следующий код, чтобы открыть собственный сборщик музыки для Android:

final Intent intent2 = new Intent(Intent.ACTION_PICK);
intent2.setType("audio/*");
startActivityForResult(intent2, 1);

Но когда я его выполню, я получаю ActivityNotFoundException и это сообщение об ошибке:

"В вашем телефоне нет музыкальной галереи, которая может использоваться для выбора файла. Попробуйте отправить файлы разных типов"

Я делаю что-то не так?

Ответ 1

Это сработало для меня:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i,1);

Более общая цель с Intent.ACTION_GET_CONTENT может предоставить пользователю несколько вариантов действий для выбора аудиофайла (диспетчер файлов Astro и т.д.). Однако пользователь может выбрать любой файл, не обязательно аудиофайл. Мне нужен тот, который просто позволил пользователю выбрать аудиофайл со своего носителя. Это сделало трюк.

Ответ 2

Если вы посмотрите на AndroidManifest.xml файл для новейшего основного музыкального приложения, он может пролить свет на параметры, которые вы иметь. Например:

<activity android:name="com.android.music.MusicPicker"
        android:label="@string/music_picker_title" android:exported="true" >
    <!-- First way to invoke us: someone asks to get content of
         any of the audio types we support. -->
    <intent-filter>
        <action android:name="android.intent.action.GET_CONTENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.OPENABLE" />
        <data android:mimeType="audio/*"/>
        <data android:mimeType="application/ogg"/>
        <data android:mimeType="application/x-ogg"/>
    </intent-filter>
    <!-- Second way to invoke us: someone asks to pick an item from
         some media Uri. -->
    <intent-filter>
        <action android:name="android.intent.action.PICK" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.OPENABLE" />
        <data android:mimeType="vnd.android.cursor.dir/audio"/>
    </intent-filter>
</activity>

Поэтому на основе этого вы можете сначала попробовать

final Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT);
intent2.setType("audio/*");
startActivityForResult(intent2, 1);

и посмотреть, соответствует ли оно вашим потребностям. Вы также можете посмотреть добавление флагов категории, отмеченных в приведенном выше примере, чтобы сузить результаты (например, OPENABLE следует фильтровать только контент, который можно открыть как поток.

Ответ 3

Что-то вроде этого может работать

// some Intent that points to whatever you like to play
Intent play = new Intent(Intent.ACTION_VIEW);
play.setData(Uri.fromFile(new File("/path/to/file")));
// create chooser for that intent
try {
    Intent i = Intent.createChooser(play, "Play Music");
    c.startActivity(i);
} catch(ActivityNotFoundException ex) {
    // if no app handles it, do nothing
}