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

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

После того, как я добавил необходимый код в файл 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>