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。