Android Intent Filter: App mit Dateierweiterung verknüpfen

92

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.

Tamas
quelle
Fügen Sie android: label = "@ string / app_name" im Intent-Filter hinzu
Prashant

Antworten:

116

Sie benötigen mehrere Absichtsfilter, um unterschiedliche Situationen anzugehen, mit denen Sie umgehen möchten.

Beispiel 1: Behandeln Sie http-Anforderungen ohne Mimetypen:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>

Mit Mimetypen umgehen, bei denen das Suffix irrelevant ist:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
    <data android:host="*" />
    <data android:mimeType="application/pdf" />
  </intent-filter>

Behandeln Sie die Absicht einer Dateibrowser-App:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="file" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>
Phyrum Tee
quelle
Ich dachte, dass der Host = "*" weggelassen werden könnte, aber er wurde zu breit.
Phyrum Tee
@Phyrum Tea: Gibt es eine Möglichkeit, eine Dateierweiterung mit meiner App einer ANDEREN App zuzuordnen? Meine App generiert .list-Dateien, die ich Android mitteilen möchte, dass es sich um Textdateien handelt, und um sie mit einem Texteditor zu öffnen (meine App ist KEIN Texteditor).
Luis A. Florit
@ LuisA.Florit hast du versucht deine Dateien aufzurufen * .txt? Es könnte klappen.
Gavriel
Benutzerdefinierte Erweiterung funktioniert nicht ohne MimeType. Wenn ich einen Mimetyp gebe, wird / meine App angezeigt , wenn ich auch auf Google Mail-Benachrichtigung klicke.
Madan V
1
Funktioniert nicht. Ich habe es satt, dass die Suche in den letzten 2 Tagen nicht funktioniert hat. Ich benutze Android 9
Ahmad Arslan
48

Die anderen Lösungen funktionierten für mich nicht zuverlässig, bis ich hinzufügte:

android:mimeType="*/*" 

Davor funktionierte es in einigen Anwendungen, in anderen nicht ...

Komplettlösung für mich:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="file"  android:host="*" android:pathPattern=".*\\.EXT" android:mimeType="*/*"  />
</intent-filter>
Emmanuel Touzery
quelle
1
Beeindruckend! das hat mir geholfen. Es scheint, dass die Android-Dokumentation falsch ist. Alle (Schema, Host, Pfad [Muster], mimeType) müssen deklariert werden, um zu funktionieren
Gavriel
Sie sollten sowohl eine Regel mit mimeTypeals auch eine ohne haben, wenn Sie vollständig sein möchten. Siehe developer.android.com/guide/components/…
Andrew Sun
1
Was ist, wenn Sie Ihre Datei-App über Google Mail öffnen möchten?
IgorGanapolsky
30

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 :

Für Apps für Android 7.0 erzwingt das Android-Framework die StrictMode-API-Richtlinie, die das Offenlegen von Datei: // URIs außerhalb Ihrer App verbietet. Wenn eine Absicht, die einen Datei-URI enthält, Ihre App verlässt, schlägt die App mit einer FileUriExposedException-Ausnahme fehl.

Um Dateien zwischen Anwendungen freizugeben, sollten Sie einen Inhalt senden: // URI und eine temporäre Zugriffsberechtigung für den URI erteilen. Der einfachste Weg, diese Berechtigung zu erteilen, ist die Verwendung der FileProvider-Klasse. Weitere Informationen zu Berechtigungen und zum Freigeben von Dateien finden Sie unter Freigeben von Dateien.

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 zweiten schemeWert zu Ihrer hinzufügen intent-filter, damit sie funktioniertFileProviders .

Beispiel:

<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="file" />
    <data android:scheme="content" />
    <data android:mimeType="*/*" />
    <!--
        Work around Android's ugly primitive PatternMatcher
        implementation that can't cope with finding a . early in
        the path unless it's explicitly matched.
    -->
    <data android:host="*" />
    <data android:pathPattern=".*\\.sfx" />
    <data android:pathPattern=".*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.sfx" />
    <!-- keep going if you need more -->

</intent-filter>

Das Wichtigste hier ist die Hinzufügung von

<data android:scheme="content" />

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.

Markus Ressel
quelle
Ohne diesen Tipp und zusätzliche Informationen könnte ich meine App nicht dazu bringen, sich bei Datei-Explorern zu registrieren. Dies ist von entscheidender Bedeutung und sollte positiv bewertet werden
am
Du hast einen Tag gerettet! Big tnx. Dies sollte als Antwort akzeptiert werden!
Andris
⚠️ Wenn Sie versuchen, die Datei über ein Inhaltsschema bereitzustellen File(uri.path), stürzt sie ab, weil No such file or directory- dieses Szenario beim Aktualisieren anders behandelt werden muss, um Nougat + zu unterstützen!
Jordan H
19

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:

        Intent intent = getIntent();
        String action = intent.getAction();

        if (action.compareTo(Intent.ACTION_VIEW) == 0) {
            String scheme = intent.getScheme();
            ContentResolver resolver = getContentResolver();

            if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0) {
                Uri uri = intent.getData();
                String name = getContentName(resolver, uri);

                Log.v("tag" , "Content intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo(ContentResolver.SCHEME_FILE) == 0) {
                Uri uri = intent.getData();
                String name = uri.getLastPathSegment();

                Log.v("tag" , "File intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo("http") == 0) {
                // TODO Import from HTTP!
            }
            else if (scheme.compareTo("ftp") == 0) {
                // TODO Import from FTP!
            }
        }

Filter für Google Mail-Anhänge:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="content" />
            <data android:mimeType="application/octet-stream" />
        </intent-filter>
  • LOG: Inhaltsabsicht erkannt: android.intent.action.VIEW: Inhalt: //gmail-ls/[email protected]/messages/2950/attachments/0.1/BEST/false: application / octet-stream: neu. mrz

Datei-Explorer-Filter:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>
  • LOG: Dateiabsicht erkannt: android.intent.action.VIEW: Datei: ///storage/sdcard0/My%20Documents/new.mrz: null: new.mrz

HTTP-Filter:

        <intent-filter android:label="@string/rbook_viewer">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>

Private Funktionen, die oben verwendet wurden:

private String getContentName(ContentResolver resolver, Uri uri){
    Cursor cursor = resolver.query(uri, null, null, null, null);
    cursor.moveToFirst();
    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
    if (nameIndex >= 0) {
        return cursor.getString(nameIndex);
    } else {
        return null;
    }
}

private void InputStreamToFile(InputStream in, String file) {
    try {
        OutputStream out = new FileOutputStream(new File(file));

        int size = 0;
        byte[] buffer = new byte[1024];

        while ((size = in.read(buffer)) != -1) {
            out.write(buffer, 0, size);
        }

        out.close();
    }
    catch (Exception e) {
        Log.e("MainActivity", "InputStreamToFile exception: " + e.getMessage());
    }
}
LFOR
quelle
Muss die Aktivität Launcher oder Haupttyp sein? Weil ich den Filter für Google Mail-Anhänge ausprobiert habe und er nicht funktioniert.
Amit
15

Das pathPattern

<data android:pathPattern=".*\\.pdf" />

funktioniert nicht, wenn der Dateipfad einen oder mehrere Punkte vor ".pdf" enthält.

Das wird funktionieren:

<data android:pathPattern=".*\\.pdf" />
<data android:pathPattern=".*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />

Fügen Sie mehr hinzu, wenn Sie mehr Punkte unterstützen möchten.

Randy Sugianto 'Yuku'
quelle
1
Ab sofort ist dies die einzige Option, um in Unterordner zu gelangen
LokiDroid
Ich verwende den gleichen Code, aber IDE gibt mir eine Warnung, siehe diese Frage stackoverflow.com/questions/35833776/…
AndreaF
5

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.

PeeGee85
quelle
5

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:

Uri uri = getIntent().getData();
if (uri != null) {
    File myFile = null;
    String scheme = uri.getScheme();
    if (scheme.equals("file")) {
        String fileName = uri.getEncodedPath();
        myFile = new File(filename);
    }
    else if (!scheme.equals("content")) {
        //error
        return;
    }
    try {
        InputStream inStream;
        if (myFile != null) inStream = new FileInputStream(myFile);
        else inStream = getContentResolver().openInputStream(uri);
        InputStreamReader rdr = new InputStreamReader(inStream);
        ...
    }
}
Peter Newman
quelle
1

Versuchen Sie es hinzuzufügen

<action android:name="android.intent.action.VIEW"/>
magaio
quelle
Nun, da dies mit werkseitig festgelegten Dateitypen wie application / pdf funktioniert, wie würde ich meinen eigenen Dateityp deklarieren? Und wenn ich Dateityp sage, meine ich mimeType;)
Tamas
Welche Art von Datei soll dieser Mimetyp abfangen? Wird diese Datei auch über den Browser oder den Dateimanager geöffnet oder von einer anderen von Ihnen erstellten Anwendung gesendet?
Magaio
Dies kann über den Browser, den E-Mail-Client, den Dateimanager oder irgendwo anders erfolgen. Oder meine eigene App ofc :) Die Dateierweiterung ist benutzerdefiniert und wird vom Client angegeben.
Tamas
Nun, ich stecke immer noch fest ... könnte mir bitte jemand helfen?
Tamas
@Tamas hast du das alles sortiert bekommen. Ich stecke fest!
StuStirling
1

Für Google Mail-Anhänge können Sie Folgendes verwenden:

<intent-filter android:label="@string/app_name">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="content" />
  <data android:mimeType="application/pdf" /> <!-- .pdf -->
  <data android:mimeType="application/msword" /> <!-- .doc / .dot -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <!-- .docx -->
  <data android:mimeType="application/vnd.ms-excel" />  <!-- .xls / .xlt / .xla -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />  <!-- .xlsx -->
  <data android:mimeType="application/vnd.ms-powerpoint" />  <!-- .ppt / .pps / .pot / .ppa -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <!-- .pptx -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" /> <!-- .ppsx -->
  <data android:mimeType="application/zip" /> <!-- .zip -->
  <data android:mimeType="image/jpeg" /> <!-- .jpeg -->
  <data android:mimeType="image/png" /> <!-- .png -->
  <data android:mimeType="image/gif" /> <!-- .gif -->
  <data android:mimeType="text/plain" /> <!-- .txt / .text / .log / .c / .c++ / ... -->

Fügen Sie so viele MIME-Typen wie nötig hinzu. Ich brauche nur die für mein Projekt.

Hrk
quelle
1
         <!--
            Works for Files, Drive and DropBox
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:mimeType="*/*" />
            <data android:host="*" />
            <data android:pathPattern=".*\\.teamz" />
        </intent-filter>

        <!--
            Works for Gmail
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="gmail-ls" android:scheme="content" android:mimeType="application/octet-stream"/>
        </intent-filter>

Beachten Sie, dass Ihre App dadurch alle Google Mail-Dateianhänge öffnet. Es gibt keine Möglichkeit, dies zu umgehen

Ofir Bitton
quelle
Dies behandelt jede einzelne Datei, die per E-Mail an den Benutzer gesendet wird
IgorGanapolsky
1

Diejenigen, die Probleme mit anderen Dateimanager \ Explorer-Apps wie @yuku und @ phyrum-tea haben, antworteten

Dies funktioniert mit der LG Standard-Dateimanager-App

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

konnte aber nicht mit ES File Explorer und anderen Dateimanagern arbeiten, also fügte ich hinzu

 android:mimeType="*/*"

dann funktioniert es mit ES Explorer, aber der LG-Dateimanager konnte den Dateityp nicht erkennen, daher ist meine Lösung

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>
        <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file"/>
            <data android:scheme="content" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>
Sumit
quelle
1

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:

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

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:host="*"
                android:mimeType="application/xyz"
                android:scheme="content" />
        </intent-filter>

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.

Sofi Software LLC
quelle
1

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 .

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Anschließend fügen Sie in der androidmanifest- Datei im Activity-Tag einen Intent-Filter hinzu, wie unten gezeigt.

            <action android:name="android.intent.action.SEND" />

            <action android:name="android.intent.action.VIEW" />

             <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType= "application/pdf" />

            <data android:host="*" />

        </intent-filter>

Schließlich erhalten Sie in Ihrem Code den Pfad der PDF-Datei wie unten gezeigt:

Intent intent=getIntent();

if(intent!=null) {          

        String action=intent.getAction();

        String type=intent.getType();

        if(Intent.ACTION_VIEW.equals(action) && type.endsWith("pdf")) {

            // Get the file from the intent object

            Uri file_uri=intent.getData();

            if(file_uri!=null)

                filepath=file_uri.getPath();

            else

                filepath="No file";

        }

        else if(Intent.ACTION_SEND.equals(action) && type.endsWith("pdf")){

            Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

            filepath = uri.getPath();

        }
Arjun Othayoth
quelle
Bei diesem Intent.ACTION_VIEW kann der Dateipfad nicht erfasst werden. Dies führt zu einem Fehler: java.io.FileNotFoundException: Berechtigung verweigert. Es ist nur von bestimmten Anwendungen, nicht jedes Mal. irgendwelche Lösungen?
Hardik Joshi
@HardikJoshi Die Apps setzen möglicherweise keine Berechtigung GRANT_READ_URI_PERMISSION.
Mira_Cole
1

Lesen Sie die Eröffnungsdatei in Kotlin:

private fun checkFileOpening(intent: Intent) {
    if (intent.action == Intent.ACTION_VIEW && (intent.scheme == ContentResolver.SCHEME_FILE
                    || intent.scheme == ContentResolver.SCHEME_CONTENT)) {

        val text = intent.data?.let {
            contentResolver.openInputStream(it)?.bufferedReader()?.use(BufferedReader::readText) 
        }
    }
}
Brucemax
quelle
-1

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:

<intent-filter android:priority="999">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.OPENABLE" />

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>
Ráfagan
quelle
-1

// Ich habe diesen Code ausprobiert. Und es funktioniert gut. Mit diesem Code können Sie PDF-Dateien akzeptieren.

<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="application/pdf" />
   <data android:pathPattern=".*\\.pdf" />
   <data android:pathPattern=".*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />
</intent-filter>
Arslan Tahir
quelle