Mehrere MIME-Typen in Android

75

Gibt es eine Möglichkeit, intent.setType()mehrere breite Typen (wie Bilder und Videos) zu verwenden und bereitzustellen ?

Ich benutze eine ACTION_GET_CONTENT. Es scheint nur mit durch Kommas getrennten Typen zu funktionieren.

James
quelle
1
Könnten Sie genauer sein. setType () auf ... was? Zu welchem ​​Zweck und Zweck? Etc.
CommonsWare
Haben Sie schon einen Weg gefunden, dies zu tun?
Rohith Nandakumar

Antworten:

120

In Android 4.4 können Sie bei Verwendung des Storage Access Frameworks das verwenden EXTRA_MIME_TYPES, um mehrere MIME-Typen zu übergeben.

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
String[] mimetypes = {"image/*", "video/*"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
startActivityForResult(intent, REQUEST_CODE_OPEN);
Fred
quelle
Dieser ist perfekt.
Pratik Butani
7
Dies funktioniert nicht in Android 7.0. Zeigt nur Videos an.
Uhrmacher
@clocksmith Es scheint gut auf meinem Nexus 9 mit Android 7.0 zu funktionieren.
Steve M
@clocksmith Scheint auch auf dem Android 7.0-Emulator gut zu funktionieren. Gibt es einen bestimmten Fall, der nicht funktioniert? Dies scheint die richtige Antwort zu sein, da es Teil der offiziellen API ist.
Steve M
1
Beachten Sie, dass EXTRA_MIME_TYPESnicht ersetzt setType. Sie brauchen setTypemit diesem Ansatz noch.
Arlomedia
20

Tatsächlich werden mehrere MIME-Typen unterstützt. Hast du es überhaupt versucht ???

Zum Beispiel: intent.setType("image/*,video/*") Zeigt Fotos und Videos an ...

Bei mir funktioniert es. Es sollte auch für Sie funktionieren ...

[BEARBEITEN]: Dies funktioniert teilweise, da nicht alle Galerie-Apps die Unterstützung für Filter mit mehreren MIME-Typen implementieren.

Bazyle
quelle
4
Diese Lösung funktioniert ... aber nur mit Anwendungen, die zwei MIME-Typen zulassen. Die Standardeinstellung "Galerie" nicht.
Corbella
1
Tatsächlich hängt es von der von Ihnen installierten "Galerie" -Anwendung ab. Es gibt verschiedene Versionen davon, die mit verschiedenen Android-ROMs verteilt werden.
Bazyle
Funktioniert bei mir nur in kleinen Fällen. Gleiche Bilder können ausgewählt werden oder nicht. Android 5.0.1
Ingweland
4

Für mich funktionierte am besten:

intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);


Sie können mehrere MIME-Typen wie diesen hinzufügen

intent.setType("image/*|application/pdf|audio/*");

Die Absichtsauswahl zeigt jedoch nur Anwendungen an, die Bilder verarbeiten können, da dies die erste in der Zeichenfolge des MIME-Typs ist.

Wenn Sie jedoch einen Dateimanager installiert haben (ich habe ihn mit dem CyanogenMod-Dateimanager getestet), können Sie eine Datei auswählen, die Audio oder PDF oder ein Bild ist.

Wenn der Audio-Mime-Typ der erste ist, wie folgt:

intent.setType("audio/*|image/*|application/pdf");

Die Absichtsauswahl zeigt nur Anwendungen an, die Audio verarbeiten.
Mit dem Dateimanager können Sie wieder ein Bild, ein PDF oder ein Audio auswählen.

Raimundo
quelle
3

Dies wird derzeit leider nicht unterstützt. Sie haben zwei Möglichkeiten:

(1) Verwenden Sie einen MIME-Typ von */*und akzeptieren Sie, dass der Benutzer möglicherweise einige Dinge auswählen kann, die Sie nicht verarbeiten können (und dafür einen angemessenen Wiederherstellungspfad haben). oder

(2) Implementieren Sie Ihre eigene Aktivitätsauswahl, indem Sie den Paketmanager direkt aufrufen, um die Aktivitäten abzurufen, die beide MIME-Typen für die Absicht verarbeiten können, diese Listen zusammenzuführen und dem Benutzer anzuzeigen.

Funktioniert auch setType()überhaupt nicht durch durch Kommas getrennte Typen. Es muss ein und nur ein MIME-Typ sein.

Hackbod
quelle
3
Tatsächlich werden mehrere MIME-Typen unterstützt. Hast du es überhaupt versucht ??? Zum Beispiel: Bild / *, Video / * zeigt Fotos und Videos an ...
Bazyle
@vchelbanster Mehrere Mimetypen werden nicht auf allen Geräten unterstützt. Bei einigen Android-Versionen wie <5.0 wird nur der erste Mimetyp ausgewählt.
Shivam Pokhriyal
@ShivamPokhriyal Teilweise zustimmen - es ist nicht für alle Apps verfügbar. Da die App, die einen zusammengesetzten Absichtstyp erhält, mehrere MIME-Typen verarbeiten muss, damit dies funktioniert, funktionieren nicht alle Apps (wie die Galerie-App), was möglicherweise den Eindruck erweckt, dass es sich um die Betriebssystemversion handelt, von der abhängig ist. Tatsächlich ist es der Ersteller der App, der mehrere MIME-Typen verarbeiten muss. Also ja - es ist begrenzte Unterstützung. Siehe meine Antwort.
Bazyle
@vchelbanster Yup, zuerst schien es mir, dass dies mit der Betriebssystemversion zusammenhängt. Später stellte ich fest, dass das Problem auftritt, wenn Ihr Gerät keine App hat, die solche Absichten verarbeitet.
Shivam Pokhriyal
2

Sie können mehrere MIME-Typen übergeben, wenn Sie mit | trennen

Intent.setType("application/*|text/*");
Cifus
quelle
-3

für meine Arbeit mit Semikolons.

Beispiel:

intent.setType("image/*;video/*")

oder

sIntent.putExtra("CONTENT_TYPE", "image/*;video/*"); 
Javier
quelle
1
Anstelle der fest codierten Zeichenfolge "CONTENT_TYPE" können Sie die Intent.EXTRA_MIME_TYPESKonstante verwenden. Anstelle von Semikolons können Sie auch ein Array von Zeichenfolgen übergeben.
Fred