10

Ich möchte meine App in der Playerliste sehen ("continue action using ..."), die erscheint, wenn ich versuche, eine Audiodatei zu öffnen (zB aus Dateibrowser oder Google Mail-Anhang)). Hier sind die Absicht Filter ich für meine MainActivity versucht habe:Als Musikplayer registrieren

<intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 

     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.MUSIC_PLAYER" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.CATEGORY_APP_MUSIC" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <data android:mimeType="audio/mpeg" /> 
    </intent-filter> 

Dank für Ihre Hilfe!

+0

hey diese Antwort funktionierte gut für mich. Aber wenn ich einen Song auswähle und meine App aus der Liste auswähle, öffnet er meine App erfolgreich, spielt diesen ausgewählten Song aber nicht. was dafür zu tun ?? bitte hilfe! –

Antwort

13

Sie benötigen immer eine <category> auf einem <activity><intent-filter>, da es immer mindestens eine Kategorie auf der mit startActivity() verwendet Intent ist. Hier

ist, was the AOSP Music App uses:

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

Zwei Fragen ... Was wäre, wenn wir nur der Standard für MP3-Dateien sein wollten ... nicht alle Audiodateien ... und Frage zwei, wie bekommen wir dann die Datei Info/Pfad in der Aktivität? – DeNitE

+0

@DeNitE: "Was ist, wenn wir nur der Standard für MP3-Dateien sein wollen?" - Sie werden nicht der Standard für irgendetwas sein, es sei denn, der Benutzer wählt, dass Sie zum Standard werden. Der Benutzer kann festlegen, dass Sie für jede 'Intent'-Struktur, die Sie über Ihre ' - Elemente unterstützen möchten, als Standard festgelegt werden. "Wie erhalten wir dann die Datei Info/Pfad in der Aktivität?" - Rufen Sie 'getIntent()' auf, um den 'Intent' abzurufen, der zum Starten Ihrer Aktivität verwendet wurde. Das wird normalerweise keine Datei sein ('Inhalt:' Schema ist wahrscheinlicher). – CommonsWare

+0

ok, das macht Sinn ... lass mich umformulieren ... was wollten wir nur für mp3-Dateien bereitstellen, nicht für alle Audiodateien? – DeNitE

4

Das ist für mich gearbeitet:

AndroidManifest:

<intent-filter> 
      <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <data android:scheme="file" android:pathPattern=".*mp3" android:mimeType="audio/mpeg" /> 
</intent-filter> 

MainActivity:

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

    if (Intent.ACTION_VIEW.equals(getIntent().getAction())) 
    { 
     File file = new File(getIntent().getData().getPath()); 

     // do what you want with the file...  
    } 
0

Dies funktioniert für mich

<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="application/x-flac"/> 
    <data android:mimeType="audio/*"/> 
    <data android:mimeType="application/ogg"/> 
    <data android:mimeType="application/x-ogg"/> 
    <data android:mimeType="application/itunes"/> 
</intent-filter> 
0

Die CommonsWare Antwort in Bezug auf Manifest gut ist und es funktioniert.

„Aber wenn ich Song und wählen Sie meinen App aus der Liste auswählen, es öffnet meine App erfolgreich, aber nicht, dass die ausgewählten Songs zu spielen., Was für das tun ??“

Wenn Ihre App nicht im Hintergrund sind, in Ihre Aktivität OnCreate Sie

Uri data = getIntent().getData() 
if (data!=null){/*use this Uri like you want*/} 

Falls Ihre App im Hintergrund tun können, die Absicht Sie abfangen müssen wird die onNewIntent() -Methode durchlaufen, die Sie ovveride haben. Hier

ist ein komplettes Codebeispiel:

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. so you can load this uri. 
    } 
    return false;   //has not intent to intercept 
}