【问题标题】:Set my music player as default music player将我的音乐播放器设置为默认音乐播放器
【发布时间】:2017-08-25 10:57:46
【问题描述】:

我正在尝试将我的应用设置为默认音乐播放器,但我发现了两个问题。

第一个是关于清单声明:根据 Google 音乐应用清单 (manifest),我选择的活动上的代码是:

    <activity
        android:name=".Dashboard"
        android:theme="@style/NoActionBar"
        android:screenOrientation="portrait"
        android:launchMode="singleTask">
        <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:host="media"/>
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </intent-filter>
    </activity>

但如果我尝试打开音乐文件,我的应用程序不在兼容应用程序列表中(为什么?)。所以我尝试以这种方式指定文件扩展名:

   <activity
        android:name=".Dashboard"
        android:theme="@style/NoActionBar"
        android:screenOrientation="portrait"
        android:launchMode="singleTask">
        <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="*/*" />
            <data android:pathPattern=".*\\.mp3" />
            <data android:host="*" />
        </intent-filter>
    </activity>

这段代码对我有用,但我认为不是最好的方法。 还有另一个带有一些重要内容过滤器的活动,我不知道这是否是问题所在。这是第一个活动(所以启动一个,登录活动)。他的主要宣言是

    <activity
        android:name=".LoginActivity"
        android:label="@string/app_name"
        android:theme="@style/NoActionBar"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.MUSIC_PLAYER" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.APP_MUSIC" />
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>
    </activity>

此时我可以在启动 .mp3 文件时将我的应用设置为默认应用,但这里第二个问题: 当我的应用程序在后台时,我无法拦截来自Intent 的Uri。我试图将getIntent().getData() 放在OnCreate, OnResume and OnStart 上,但是当点击音乐文件并且我的应用程序处于后台时,数据始终为null。当我的应用程序不在后台时,它不为空。 我要解决什么问题?

【问题讨论】:

  • “但它不适合我”——请解释一下“不适合我”是什么意思。 “当我的应用程序在后台时,我无法从 Intent 拦截 Uri”——您是否覆盖了 onNewIntent()?
  • @CommonsWare 带有“但不适用于我”我的意思是当我尝试从文件资源管理器打开音乐文件时,我的应用程序不在兼容应用程序列表中(我使用 es 文件探索)。不,我不覆盖 onNewIntent,我有什么要做的吗?
  • “我不覆盖 onNewIntent,我有事吗?” -- 如果您有一个正在重用的活动实例,则将第二个和后续的Intents 交给onNewIntent(),而不是onCreate()。 “我的意思是当我尝试从文件资源管理器打开音乐文件时,我的应用程序不在兼容应用程序列表中” - 大概,您的文件资源管理器使用 Uri 值和 file 方案,至少在安卓 6.0 及更早版本。 Android 7.0+ 对使用该方案有限制。
  • @CommonsWare 好的,现在使用 onNewIntent() 我可以拦截第二个后续 Intent。但是我还没有解决第二个问题。

标签: android android-intent android-manifest android-mediaplayer intentfilter


【解决方案1】:

我现在可以回答我自己的问题了。感谢 CommonsWare cmets 并感谢他对另一个问题的旧答案:

关于清单,这行对我很有效,只需将我的实际意图过滤器更改为:

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

关于app在后台时未截取的数据,我是这样解决的:

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
    }
    return false;           //has not intent to intercept
}

仍然感谢@CommonsWare。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2012-02-12
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多