注册为音乐播放器并播放歌曲

时间:2016-11-01 14:25:02

标签: java android audio android-intent

我正在创建一个音乐播放器应用程序,我想将该应用程序注册为音乐播放器。因此,当用户点击要播放的任何歌曲时,我的应用程序应被建议为音乐播放器之一。我跟着this guide

我在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>

5 个答案:

答案 0 :(得分:2)

添加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或网络播放,请从AndroidManifest.xml中删除IntentFilter以获取“http”或“content”方案

答案 1 :(得分:1)

您是否尝试过这些意图过滤器?

<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)
        {   ...
        }
    }

}

答案 2 :(得分:0)

  

我认为您只在选择歌曲时定义默认音乐播放器   在Manifest文件中,还要编写运行中的服务代码   主线播放歌曲。

答案 3 :(得分:0)

尝试使用以下代码

 <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>

答案 4 :(得分:0)

        <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>