Ich habe einen benutzerdefinierten Dateityp / eine benutzerdefinierte Dateierweiterung, mit der ich meine App verknüpfen möchte.
Soweit ich weiß, wurde das Datenelement für diesen Zweck erstellt, aber ich kann es nicht zum Laufen bringen. http://developer.android.com/guide/topics/manifest/data-element.html Laut den Dokumenten und vielen Forenbeiträgen sollte es so funktionieren:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/pdf" />
</intent-filter>
Nun, es funktioniert nicht. Was habe ich falsch gemacht? Ich möchte einfach meinen eigenen Dateityp deklarieren.
Antworten:
Sie benötigen mehrere Absichtsfilter, um unterschiedliche Situationen anzugehen, mit denen Sie umgehen möchten.
Beispiel 1: Behandeln Sie http-Anforderungen ohne Mimetypen:
Mit Mimetypen umgehen, bei denen das Suffix irrelevant ist:
Behandeln Sie die Absicht einer Dateibrowser-App:
quelle
Die anderen Lösungen funktionierten für mich nicht zuverlässig, bis ich hinzufügte:
Davor funktionierte es in einigen Anwendungen, in anderen nicht ...
Komplettlösung für mich:
quelle
mimeType
als auch eine ohne haben, wenn Sie vollständig sein möchten. Siehe developer.android.com/guide/components/…Die Antworten von Phyrum Tea und Yuku sind bereits sehr informativ.
Ich möchte hinzufügen, dass ab Android 7.0 Nougat die Art und Weise, wie die Dateifreigabe zwischen Apps gehandhabt wird, geändert wird:
Von offiziellen Android 7.0 Änderungen :
Wenn Sie eine eigene benutzerdefinierte Datei haben, die ohne eine bestimmte endet
mime-type
(oder ich denke sogar mit einer), müssen Sie möglicherweise einen zweitenscheme
Wert zu Ihrer hinzufügenintent-filter
, damit sie funktioniertFileProviders
.Beispiel:
Das Wichtigste hier ist die Hinzufügung von
zum Filter.
Es fiel mir schwer, etwas über diese kleine Änderung herauszufinden, die meine Aktivitäten auf Android 7.0-Geräten nicht öffnen konnte, während auf älteren Versionen alles in Ordnung war. Ich hoffe es hilft jemandem.
quelle
File(uri.path)
, stürzt sie ab, weilNo such file or directory
- dieses Szenario beim Aktualisieren anders behandelt werden muss, um Nougat + zu unterstützen!Meine Ergebnisse:
Sie benötigen mehrere Filter, um die verschiedenen Methoden zum Abrufen einer Datei zu behandeln. dh per Google Mail-Anhang, per Datei-Explorer, per HTTP, per FTP ... Sie alle senden sehr unterschiedliche Absichten.
Und Sie müssen die Absicht, die Ihre Aktivität auslöst, in Ihrem Aktivitätscode herausfiltern.
Für das folgende Beispiel habe ich einen gefälschten Dateityp new.mrz erstellt. Und ich habe es aus dem Google Mail-Anhang und dem Datei-Explorer abgerufen.
Aktivitätscode in onCreate () hinzugefügt:
Filter für Google Mail-Anhänge:
Datei-Explorer-Filter:
HTTP-Filter:
Private Funktionen, die oben verwendet wurden:
quelle
Das
pathPattern
funktioniert nicht, wenn der Dateipfad einen oder mehrere Punkte vor ".pdf" enthält.
Das wird funktionieren:
Fügen Sie mehr hinzu, wenn Sie mehr Punkte unterstützen möchten.
quelle
Ich habe seit Ewigkeiten versucht, dies zum Laufen zu bringen, habe im Grunde alle vorgeschlagenen Lösungen ausprobiert und kann Android immer noch nicht dazu bringen, bestimmte Dateierweiterungen zu erkennen. Ich habe einen Intent-Filter mit einem
"*/*"
Mimetyp, der das einzige ist, was zu funktionieren scheint, und Dateibrowser listen meine App jetzt als Option zum Öffnen von Dateien auf. Meine App wird jetzt jedoch als Option zum Öffnen einer beliebigen Art von Datei angezeigt, obwohl Ich habe mithilfe des pathPattern-Tags bestimmte Dateierweiterungen angegeben. Dies geht so weit, dass Android mich fragt, ob ich meine App zum Anzeigen des Kontakts verwenden möchte, selbst wenn ich versuche, einen Kontakt in meiner Kontaktliste anzuzeigen / zu bearbeiten. Dies ist nur eine von vielen Situationen, in denen dies auftritt, SEHR SEHR ärgerlich.Schließlich fand ich diesen Google-Gruppenbeitrag mit einer ähnlichen Frage, auf die ein tatsächlicher Android-Framework-Ingenieur antwortete. Sie erklärt, dass Android einfach nichts über Dateierweiterungen weiß, sondern nur MIME-Typen ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ).
Nach dem, was ich gesehen, ausprobiert und gelesen habe, kann Android einfach nicht zwischen Dateierweiterungen unterscheiden, und das pathPattern-Tag ist im Grunde eine gigantische Zeit- und Energieverschwendung. Wenn Sie das Glück haben, nur Dateien eines bestimmten MIME-Typs (z. B. Text, Video oder Audio) zu benötigen, können Sie einen Intent-Filter mit einem MIME-Typ verwenden. Wenn Sie jedoch eine bestimmte Dateierweiterung oder einen MIME-Typ benötigen, den Android nicht kennt, haben Sie kein Glück.
Wenn ich mich in irgendetwas irre, sag es mir bitte. Bisher habe ich jeden Beitrag gelesen und jede vorgeschlagene Lösung ausprobiert, die ich finden konnte, aber keine hat funktioniert.
Ich könnte noch ein oder zwei Seiten darüber schreiben, wie häufig solche Dinge in Android zu sein scheinen und wie durcheinander die Entwicklererfahrung ist, aber ich werde Ihnen meine wütenden Beschimpfungen ersparen;). Hoffe, ich habe jemandem Ärger erspart.
quelle
Markus Ressel ist richtig. Android 7.0 Nougat erlaubt keine Dateifreigabe mehr zwischen Apps mithilfe eines Datei-URI. Ein Inhalts-URI muss verwendet werden. Ein Inhalts-URI erlaubt jedoch nicht die Freigabe eines Dateipfads, sondern nur einen MIME-Typ. Sie können also keine Inhalts-URI verwenden, um Ihre App mit Ihrer eigenen Dateierweiterung zu verknüpfen.
Drobpox hat ein interessantes Verhalten unter Android 7.0. Wenn es auf eine unbekannte Dateierweiterung trifft, scheint es eine Datei-URI-Absicht zu bilden, aber anstatt die Absicht zu starten, ruft es das Betriebssystem auf, um herauszufinden, welche Apps die Absicht akzeptieren können. Wenn es nur eine App gibt, die diesen Datei-URI akzeptieren kann, sendet sie einen expliziten Inhalts-URI direkt an diese App. Um mit Dropbox zu arbeiten, müssen Sie die Absichtsfilter in Ihrer App nicht ändern. Es ist kein Inhalts-URI-Intent-Filter erforderlich. Stellen Sie einfach sicher, dass die App einen Inhalts-URI empfangen kann und Ihre App mit Ihrer eigenen Dateierweiterung mit Dropbox genauso funktioniert wie vor Android 7.0.
Hier ist ein Beispiel für meinen Code zum Laden von Dateien, der so geändert wurde, dass er einen Inhalts-URI akzeptiert:
quelle
Versuchen Sie es hinzuzufügen
quelle
Für Google Mail-Anhänge können Sie Folgendes verwenden:
Fügen Sie so viele MIME-Typen wie nötig hinzu. Ich brauche nur die für mein Projekt.
quelle
Beachten Sie, dass Ihre App dadurch alle Google Mail-Dateianhänge öffnet. Es gibt keine Möglichkeit, dies zu umgehen
quelle
Diejenigen, die Probleme mit anderen Dateimanager \ Explorer-Apps wie @yuku und @ phyrum-tea haben, antworteten
Dies funktioniert mit der LG Standard-Dateimanager-App
konnte aber nicht mit ES File Explorer und anderen Dateimanagern arbeiten, also fügte ich hinzu
dann funktioniert es mit ES Explorer, aber der LG-Dateimanager konnte den Dateityp nicht erkennen, daher ist meine Lösung
quelle
Inhalts-URI ftw und mit dem Absichtsfilter im Manifest ... Wenn Ihre Dateien die benutzerdefinierte Erweiterung .xyz haben, fügen Sie einen passenden MIME-Typ hinzu:
Einige Apps wie E-Mail scheinen die Erweiterung in einen MIME-Typ umzuwandeln. Jetzt kann ich auf den Anhang in der E-Mail klicken und ihn in meiner App öffnen.
quelle
Sie versuchen dies, es wird Ihnen helfen. Anstelle von PDF können Sie auch andere Erweiterungen verwenden. Zuerst müssen Sie die Berechtigung zum Lesen des externen Speichers in die Datei androidmanifest.xml einfügen .
Anschließend fügen Sie in der androidmanifest- Datei im Activity-Tag einen Intent-Filter hinzu, wie unten gezeigt.
Schließlich erhalten Sie in Ihrem Code den Pfad der PDF-Datei wie unten gezeigt:
quelle
Lesen Sie die Eröffnungsdatei in Kotlin:
quelle
Fügen Sie diesen Absichtsfilter in das Aktivitäts-Tag in das Manifest ein, das Sie öffnen möchten, indem Sie die Datei berühren:
quelle
// Ich habe diesen Code ausprobiert. Und es funktioniert gut. Mit diesem Code können Sie PDF-Dateien akzeptieren.
quelle