0

J'essaie de donner la possibilité de définir mon application comme lecteur de musique par défaut, mais j'ai trouvé deux problèmes.Définir mon lecteur de musique comme lecteur de musique par défaut

Le premier est au sujet de la déclaration manifst: Selon l'application Google musique Manifest (manifest) le code pour mettre sur mon activité choisie est:

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

Mais si je tente d'ouvrir un fichier musical , mon application ne figure pas dans la liste des applications compatibles (pourquoi?). J'ai donc essayé specyfing l'extension de fichier, de cette façon:

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

Ce code fonctionne pour moi, mais je pense est pas la meilleure façon. Il y a une autre activité avec un filtre de contenu important, et je ne sais pas si c'est le problème. C'est la première activité (donc le lancement, une activité de connexion). sa déclaration est 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> 

En ce moment je peux mettre mon application par défaut lorsqu'un fichier .mp3 est lancé, mais ici le deuxième problème: Je ne peux pas intercepter le Uri de Intent lorsque le mon L'application est sur le fond. J'ai essayé de mettre getIntent().getData() sur OnCreate, OnResume and OnStart, mais les données sont toujours null lorsque le fichier de musique est cliqué et que mon application est en arrière-plan. Bien qu'il ne soit pas nul lorsque mon application n'est pas en arrière-plan. Où/Que dois-je faire pour résoudre?

+1

"Mais ça ne marche pas pour moi" - s'il vous plaît expliquer ce que "ne fonctionne pas pour moi" signifie. "Je ne peux pas intercepter l'Uri depuis Intent lorsque mon application est en arrière-plan" - avez-vous remplacé "onNewIntent()"? – CommonsWare

+0

@CommonsWare Avec "mais ne fonctionne pas pour moi" je veux dire que mon application ne figure pas dans la liste des applications compatibles lorsque j'essaie d'ouvrir un fichier de musique à partir d'un explorateur de fichiers. Et non, je ne remplace pas onNewIntent, dois-je faire? –

+0

"Je ne remplace pas onNewIntent, dois-je faire?" - Si vous avez une instance d'activité qui est en cours de réutilisation, le second 'Intents' suivant est remis à' onNewIntent() ', pas' onCreate() '. "Je veux dire que mon application ne figure pas dans la liste des applications compatibles lorsque j'essaie d'ouvrir un fichier musical à partir d'un explorateur de fichiers" - probablement, votre explorateur de fichiers utilise les valeurs "Uri" avec un Android 6.0 et plus. Android 7.0+ a des restrictions sur l'utilisation de ce régime. – CommonsWare

Répondre

0

Je peux maintenant répondre à ma propre question. Merci à CommonsWare commentaires et grâce à sa vieille réponse à une autre question:

A propos de la cette ligne manifeste marchait bien pour moi, juste changer mon intention filtre réel avec:

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

A propos de la non interceptées de données lorsque application est sur fond, j'ai résolu de cette façon:

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 
} 

Merci encore @CommonsWare.