0

Ich versuche, die Möglichkeit zu geben, meine App als Standard-Musik-Player zu setzen, aber ich fand zwei Probleme.Richtet meine Musik-Player als Standard-Musik-Player

Die erste über die manifst Erklärung: Laut Google Musik-App-Manifest (manifest) der Code auf meiner ausgewählten Aktivität zu setzen ist:

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

Aber wenn ich versuche, eine Musik-Datei zu öffnen , meine Anwendung ist nicht in der Liste der kompatiblen Apps (warum?). Also habe ich versucht specyfing die Dateierweiterung, auf diese Weise:

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

Dieser Code arbeitet für mich, aber ich denke nicht der beste Weg ist. Es gibt eine andere Aktivität mit einem wichtigen Inhaltsfilter, und ich weiß nicht, ob es das Problem ist. Es ist die erste Aktivität (also der Start, eine Login-Aktivität). seine Maifest Erklärung ist

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

In diesem Moment, als ich meine App als Standard festlegen kann, wenn eine MP3-Datei gestartet wird, aber hier das zweite Problem: Ich kann die Uri von Intent nicht abfangen, wenn die meiner App ist im Hintergrund. Ich habe versucht, getIntent().getData() auf OnCreate, OnResume and OnStart zu setzen, aber die Daten sind immer null, wenn die Musikdatei cliked und meine app ist auf Hintergrund. Es ist zwar nicht null, wenn meine App nicht im Hintergrund ist. Wo/Was muss ich tun, um zu lösen?

+1

"Aber es funktioniert nicht für mich" - bitte erklären, was "für mich nicht funktioniert" bedeutet. "Ich kann den Uri nicht absichtlich abfangen, wenn meine App im Hintergrund ist" - haben Sie 'onNewIntent()' überschrieben? – CommonsWare

+0

@CommonsWare Mit "Aber funktioniert nicht für mich" meine ich, dass meine Anwendung nicht in der Liste der kompatiblen Apps ist, wenn ich versuche, eine Musikdatei aus einem Datei-Explorer zu öffnen (ich benutze es file explore). Und nein, ich überschreie onNewIntent nicht, muss ich tun? –

+0

"Ich überschreibe onNewIntent nicht, muss ich tun?" - Wenn Sie eine Aktivitätsinstanz haben, die wiederverwendet wird, werden die zweite und nachfolgende 'Intents' an 'onNewIntent()' übergeben, nicht an' onCreate() '. "Ich meine, dass meine Anwendung nicht in der Liste der kompatiblen Apps enthalten ist, wenn ich versuche, eine Musikdatei aus einem Datei-Explorer zu öffnen" - vermutlich verwendet Ihr Datei-Explorer 'Uri'-Werte mit einem' Datei'-Schema, zumindest auf Android 6.0 und älter. Android 7.0+ hat Einschränkungen bei der Verwendung dieses Schemas. – CommonsWare

Antwort

0

kann ich jetzt auf meine eigene Frage beantworten. Dank CommonsWare Kommentare und dank seiner alten Antwort auf eine andere Frage:

Über das Manifest dieser Linien gut für mich gearbeitet, nur meine eigentliche Absicht-Filter wechseln mit:

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

Über die nicht abgefangen Daten, wenn App ist im Hintergrund, löste ich auf diese Weise:

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 
} 

Danke noch @CommonsWare.