Зарегистрируйтесь как музыкальный плеер

Я хотел бы увидеть свое приложение в списке игроков («продолжить действие с использованием …»), которое появляется, когда я пытаюсь открыть аудиофайл (т. Е. Из файла браузера или вложения gmail). Вот фильтры намерений, которые я пробовал для своей MainActivity:

<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MUSIC_PLAYER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.CATEGORY_APP_MUSIC" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:mimeType="audio/mpeg" /> </intent-filter> 

Спасибо за вашу помощь !

Вы всегда нуждаетесь в <category> в <activity> <intent-filter> , так как в Intent используемом с startActivity() всегда есть как минимум одна категория.

Вот что использует приложение AOSP Music :

  <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file"/> <data android:mimeType="audio/*"/> <data android:mimeType="application/ogg"/> <data android:mimeType="application/x-ogg"/> <data android:mimeType="application/itunes"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" /> <data android:mimeType="audio/*"/> <data android:mimeType="application/ogg"/> <data android:mimeType="application/x-ogg"/> <data android:mimeType="application/itunes"/> </intent-filter> <intent-filter android:priority="-1"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="content" /> <data android:mimeType="audio/*"/> <data android:mimeType="application/ogg"/> <data android:mimeType="application/x-ogg"/> <data android:mimeType="application/itunes"/> </intent-filter> 

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

AndroidManifest:

  <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="file" android:pathPattern=".*mp3" android:mimeType="audio/mpeg" /> </intent-filter> 

Основная деятельность:

  @Override protected void onCreate(Bundle savedInstanceState) { if (Intent.ACTION_VIEW.equals(getIntent().getAction())) { File file = new File(getIntent().getData().getPath()); // do what you want with the file... } 

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

 <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="content"/> <data android:scheme="file"/> <data android:mimeType="application/x-flac"/> <data android:mimeType="audio/*"/> <data android:mimeType="application/ogg"/> <data android:mimeType="application/x-ogg"/> <data android:mimeType="application/itunes"/> </intent-filter> 

Ответ CommonsWare в отношении Manifest хорош, и он работает.

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

Если ваше приложение не находится в фоновом режиме, в вашей деятельности OnCreate вы можете сделать

  Uri data = getIntent().getData() if (data!=null){/*use this Uri like you want*/} 

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

Вот полный пример кода:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*...*/ interceptExternalIntentAndPlaySongFromUri(getIntent()); } @Override protected void onNewIntent(Intent intent) { interceptExternalIntentAndPlaySongFromUri(intent); } private boolean interceptExternalIntentAndPlaySongFromUri(Intent intent){ Uri data = intent.getData(); if (data != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_VIEW)){ String scheme = data.getScheme(); String filename = ""; if ("file".equals(scheme)) { filename = data.getPath(); } else { filename = data.toString(); } player.setDataSource(filename); setIntent(new Intent()); //this is to remove the last intent //without the above line, last request is reloaded when the user open another app //and return in this return true; //has intercepted an external intent } return false; //has not intent to intercept }