0

我试图给出将我的应用设置为默认音乐播放器的可能性,但是我发现了两个问题。将我的音乐播放器设置为默认音乐播放器

第一个是关于manifst声明:根据谷歌音乐应用程序清单(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> 

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

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

此代码为我工作,但我想这是不是最好的方式。 还有一些重要的内容过滤活动,我不知道它是否是问题。这是第一个活动(所以启动一个,登录活动)。他maifest声明

<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文件启动,但在这里第二个问题: 我不能UriIntent拦截时,我应用程序是在背景上。我试图在OnCreate, OnResume and OnStart上输入getIntent().getData(),但是当音乐文件被粘连并且我的应用在后台时,数据始终为null。当我的应用程序不在后台时它不为空。 哪里有/我需要做什么来解决?

+1

“但它不适合我” - 请解释“不适合我”的含义。 “当我的应用程序在后台时,我无法拦截意图中的Uri” - 您是否重写了'onNewIntent()'? – CommonsWare

+0

@CommonsWare当“尝试从文件资源管理器打开音乐文件(我使用es文件探索)”时,意味着我的应用程序不在兼容应用程序的列表中。 不,我不重写onNewIntent,我有吗? –

+0

“我不重写onNewIntent,我有办法吗?” - 如果您有一个正在重用的活动实例,则第二个和随后的“Intents”将交给'onNewIntent()',而不是'onCreate()'。 “我的意思是,当我尝试从文件浏览器打开音乐文件时,我的应用程序不在兼容的应用程序列表中” - 大概,您的文件资源管理器使用'Uri'值与'file'方案,至少Android 6.0及更高版本。 Android 7.0+对使用该方案有限制。 – CommonsWare

回答

0

我现在可以回答我自己的问题。由于CommonsWare意见,并感谢他的老回答另一个问题:

关于此行的工作为我好清单,只是改变我的实际意图过滤器:

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

关于非截获数据时应用程序是背景,我这样解决:

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。