注册为音乐播放器

11

我希望看到我的应用程序出现在播放器列表中(使用“继续操作”...),当我尝试打开音频文件时(例如,从文件浏览器或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>

感谢你的帮助!


嘿,这个答案对我很有用。但是当我选择歌曲并从列表中选择我的应用程序时,它成功地打开了我的应用程序,但没有播放所选的歌曲。怎么办?请帮忙! - user6649667
4个回答

15

使用startActivity()时,<activity><intent-filter>始终需要至少一个<category>,因为使用Intent启动活动时至少会有一个类别。

以下是AOSP音乐应用程序所使用的<intent-filter>的内容:uses

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

两个问题...如果我们只想成为mp3文件的默认选项,而不是所有音频文件...第二个问题是,我们如何在Activity中获取文件信息/路径? - DeNitE Appz
@DeNitE:“如果我们只想成为mp3文件的默认选项怎么办”--除非用户选择将您设置为默认选项,否则您不会成为任何东西的默认选项。用户可以选择使您成为通过您的一组<intent-filter>元素支持的任何“Intent”结构的默认选项。“我们如何在Activity中获取文件信息/路径?”--调用getIntent()以检索用于启动您的活动的“Intent”。通常不会是文件(更可能是content:方案)。 - CommonsWare
好的,我明白了...让我重新表达一下...我们只想为mp3文件提供支持,而不是所有音频文件? - DeNitE Appz
@DeNitE:然后选择你想要的MIME类型,并且只在<intent-filter>元素中使用它们。我认为audio/mp3是MP3的MIME类型,但你需要验证一下。 - CommonsWare
嘿,这对我很有效。但是当我选择歌曲并从列表中选择我的应用时,它成功地打开了我的应用程序,但没有播放所选的歌曲。怎么办?请帮忙!@CommonsWare - user6649667
看到这条信息的人,你需要从Intent中获取音乐文件才能播放它。 - John Glen

4
这对我有效:
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...       
    }

0

关于清单文件的CommonsWare的回答很好,而且它也有效。

“但是当我选择歌曲并从列表中选择我的应用程序时,它成功地打开了我的应用程序,但没有播放所选的歌曲。怎么办??”

如果您的应用程序不在后台,在您的活动OnCreate中,您可以这样做:

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

如果您的应用程序在后台运行,则必须拦截通过您需要覆盖的onNewIntent()方法传递的Intent。

以下是完整的代码示例:

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
}

0

这对我有效

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接