Зарегистрируйтесь как музыкальный плеер и сыграйте песню
Я создаю приложение для музыкального плеера, и я хочу зарегистрировать приложение в качестве музыкального проигрывателя. Так что, когда пользователь нажимает на любую песню для воспроизведения, мое приложение должно предлагаться в качестве одного из музыкальных плееров. Я последовал за этим руководством.
После того, как я добавил необходимый код в файл manifest.xml, он показывает только мое приложение в предложениях. Когда я выбираю свое приложение, ничего не воспроизводится. Я думаю, что в основной деятельности должно быть что-то вроде приемника, чтобы получить медиа-путь для воспроизведения выбранной песни. Но я не знаю, как это реализовать.
Я добавил следующий код в свой файл manifest.xml(для справки):
<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>
Ответы
Ответ 1
После того, как вы добавили IntentFilters, используйте getIntent(), чтобы получить данные из него
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(@NonNull final Intent intent) {
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
try {
IntentHandler.onActionView(intent);
} catch (IOException e) {
// Handle error
}
}
}
IntentHandler.java
final class IntentHandler {
private static final String TAG = "IntentHandler";
private IntentHandler() {
}
static void onActionView(@NonNull final Intent intent) throws IOException {
final Uri data = intent.getData();
if (data == null) {
Log.w(TAG, "Intent data is null");
throw new IOException("Intent data is null");
}
final String scheme = data.getScheme();
if (scheme == null) {
Log.w(TAG, "Uri scheme is null");
throw new IOException("Uri scheme is null");
}
switch (scheme) {
case "file":
playFile(data);
break;
case "content":
playContent(data);
break;
case "http":
playHttp(data);
break;
default:
Log.w(TAG, "Unhandled Uri scheme: " + scheme);
throw new IOException("Unhandled Uri scheme: " + scheme);
}
}
private static void playFile(@NonNull final Uri data) throws IOException {
Log.d(TAG, "playFile() path = " + data.getPath());
// Play a plain file
}
private static void playContent(@NonNull final Uri data) throws IOException {
Log.d(TAG, "playContent() " + data);
// Use ContentResovler to query the Uri
}
private static void playHttp(@NonNull final Uri data) throws IOException {
Log.d(TAG, "playHttp() " + data);
// Play from network
}
}
Если вы не поддерживаете игру из ContentProvider или из сети, удалите IntentFilter для схемы "http" или "content" соответственно из AndroidManifest.xml
Ответ 2
Пробовали ли вы эти фильтры?
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file"/>
<data android:scheme="content"/>
<data android:host="*"/>
<data android:mimeType="audio/*"/>
<data android:mimeType="application/ogg"/>
<data android:mimeType="application/x-ogg"/>
...
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file"/>
<data android:scheme="content"/>
<data android:host="*"/>
<data android:pathPattern=".*\.mp3"/>
<data android:pathPattern=".*\.ogg"/>
<data android:pathPattern=".*\.wav"/>
<data android:pathPattern=".*\.wma"/>
<data android:pathPattern=".*\.flac"/>
...
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="audio/*"/>
</intent-filter>
Затем в вашей деятельности:
@Override
public void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState);
...
Intent i = getIntent();
Uri u = i.getData();
String a = i.getAction();
if ((u != null) && (a != null) && (a.equalsIgnoreCase("android.intent.action.VIEW")))
{ String filename = null;
if (i.getScheme().equalsIgnoreCase("file"))
{ filename = u.getPath();
}
else if (i.getScheme().equalsIgnoreCase("content"))
{ try
{ String[] filepathcolumn = {MediaStore.Audio.Media.DATA};
Cursor cursor1 = getContentResolver().query(u, filepathcolumn, null, null, null);
cursor1.moveToFirst();
int columnindex1 = cursor1.getColumnIndex(filepathcolumn[0]);
filename = cursor1.getString(columnindex1);
cursor1.close();
}
catch (Exception e)
{ e.printStackTrace();
}
}
if (filename != null)
{ ...
}
}
}
Ответ 3
Я думаю, что вы определяете только музыкальный плеер по умолчанию, когда выбрана песня в файле манифеста, а также напишите код для службы, который выполняется в Главная тема, чтобы воспроизвести песню.
Ответ 4
Попробуйте использовать код ниже
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file" android:mimeType="audio/*" />
</intent-filter>
Ответ 5
<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>