Зарегистрируйтесь как музыкальный плеер
Я хочу увидеть свое приложение в списке игроков ( "продолжить действие с использованием..." ), которое появляется, когда я пытаюсь открыть аудиофайл (т.е. из файла браузера или вложения 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>
спасибо за вашу помощь!
Ответы
Ответ 1
Вам всегда нужно <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>
Ответ 2
Это сработало для меня:
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>
MainActivity:
@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...
}
Ответ 3
Это работает для меня
<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>
Ответ 4
Ответ 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. so you can load this uri.
}
return false; //has not intent to intercept
}