Android So erstellen Sie den Intent-Filter für benutzerdefinierte Dateierweiterungen, die NICHT zu einer Auswahl für alles auf dem Telefon gehören

8

Ich habe hier zahlreiche Antworten zum Erstellen eines Intent-Filters für eine benutzerdefinierte Dateierweiterung gesehen, aber keiner von ihnen scheint meine Frage zu beantworten:

Ich habe einen Intent-Filter, der gerade funktioniert ... Wenn ich nach meiner Datei suche oder wenn ich sie über einen E-Mail-Anhang öffne, erscheint meine App in der Liste. Die Datei selbst hat eine benutzerdefinierte Erweiterung von "tgtp", aber es ist im Grunde nur eine XML-Datei.

Das Problem, das ich habe, ist, dass dieser Intent-Filter zwar funktioniert, aber anscheinend auch meine App für jede Art von Datei auf meinem Telefon zu jeder Auswahl hinzufügt. Ein Beispiel wäre, wenn ich die Standardwerte meiner Kontakte-App lösche und auf einen meiner Kontakte klicke, heißt es, dass meine App es öffnen kann.

Ich habe Dutzende verschiedener Kombinationen von Intent-Filtern mit verschiedenen Schemata, Mime-Typen usw. ausprobiert ... und einige lassen mich die Datei noch öffnen, wenn ich mit einem Datei-Browser stöbere, aber ich muss sie öffnen können E-Mail-Anhänge und öffnen Sie als Datei-Browser. Ich habe noch keinen Absichtsfilter gefunden, der es mir erlaubt, dies zu tun, ohne meine App für jeden anderen Absichtsauswahler verfügbar zu machen.

Hier ist mein aktueller Absichtsfilter, der meine App verwendet, um alles zu öffnen:

%Vor%

Vielen Dank im Voraus

    
Nick 01.03.2012, 14:50
quelle

3 Antworten

14

Die einzige Möglichkeit, dieses Problem zu lösen, ist das Hinzufügen von scheme - und host -Attributen zu Ihrem Intent-Filter:

%Vor%

Das liegt daran, dass android:pathPattern in der Dokumentation nur dann funktioniert, wenn ein Schema und ein Host definiert sind. Ссылка

Ich hoffe, es hilft.

    
sabadow 05.03.2012, 16:07
quelle
3

Ich habe mich schon ziemlich oft mit einer benutzerdefinierten Dateierweiterung herumgeschlagen. Nach langem Suchen fand ich diese Webseite , wo das Poster entdeckte, dass die patternMatcher-Klasse von Android (die für Der pathPattern-Abgleich in Intent-Filtern hat ein unerwartetes Verhalten, wenn Ihr Pfad das erste Zeichen des Übereinstimmungsmusters an einer anderen Stelle im Pfad enthält (wenn Sie beispielsweise versuchen, "* .xyz" zu finden), stoppt die patternMatcher-Klasse "früher auf deinem Weg). Hier ist, was er für einen Workaround gefunden hat, und arbeitete für mich, obwohl es ein bisschen ein Hack ist:

  

PatternMatcher wird für pathPattern bei IntentFilter verwendet, aber   PatternMatcher's Algorithmus ist mir ziemlich fremd. Hier ist Algorithmus   von Android PatternMatcher.

     

Wenn es ein 'nächstes Zeichen' von '. *' Muster in der Mitte der Zeichenfolge gibt,   PatternMatcher stoppt die Schleife an diesem Punkt. (Siehe PatternMatcher.java von   Android-Framework.)

     

Bsp. string: "Dies ist ein Anhang" -Muster: ". att. ". Android   PatternMatcher tritt eine Schleife ein, um dem Muster '. ' zu entsprechen, bis es zum nächsten kommt   Zeichen des Musters (in diesem Beispiel 'a') Also, '. ' passender Loop   stoppt bei Index 8 - 'a' zwischen 'ist' und 'mein'. Daher Folge davon   Übereinstimmung gibt 'false' zurück.

     

Ziemlich merkwürdig, nicht wahr? Um dies zu umgehen - eigentlich reduzieren   Möglichkeit - Entwickler sollte nerviges dummes PathPattern verwenden.

     

Bsp. Ziel: Übereinstimmender URL-Pfad, der 'Nachricht' enthält.

%Vor%
  

Dies wird insbesondere beim Abgleich mit benutzerdefinierten Dateierweiterungen ausgegeben.

    
benjamin davis 25.04.2014 19:56
quelle
-1

Ich habe genau das gleiche Problem, und in meinem Fall funktionieren beide anderen Antworten nicht. Am nächsten komme ich, wenn ich sowohl die Antworten von Benjamin als auch Sabadow kombiniere - und - den Punkt in der Erweiterung weglassen, also so: (Ich benutze meine eigene Erweiterung ".trk")

%Vor%

Es ist ein bisschen lang, aber Sie brauchen möglicherweise nicht alle Zeilen, wie die Aktionen SENDTO und SEND_MULTIPLE. Ich brauche es nur in allen Fällen, in denen es funktionieren könnte. Leider löst es auch in einigen, aber nicht allen anderen Fällen aus.

    
Popke Altenburg 04.09.2014 10:43
quelle