Datei mit FileProvider aus Downloads Ordner öffnen funktioniert nicht

  • 6 Antworten
  • Letztes Antwortdatum
Status
Dieses Thema wurde gelöst! Zur Lösung springen…
AnnaBauer21

AnnaBauer21

Neues Mitglied
3
Hallo ihr Lieben,

ich habe in Google schon einige Foreneinträge zum meinem Problem gelesen, aber leider hat keine dieser Lösungen bei mir funktioniert.

Vorweg als Info, ich möchte auf meiner App heraus eine PDF Datei öffnen, nicht in meiner App, sondern mit einer anderen entsprechenden vorhandenen App wie z.B. einem Standard PDF Viewer oder Adobe, je nachdem was man am Handy installiert hat.
Mein Code funktioniert auch, wenn die Datei unter files im App Ordner liegt, aber wenn ich den Downloads-Ordner verwenden möchte geht es nicht, mir ist unklar warum.

Ordnerstruktur
1734510571954.png

AndroidManifest.xaml
XML:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
<provider
           android:name="android.support.v4.content.FileProvider"
           android:authorities="${applicationId}.fileprovider"
           android:exported="false"
           android:grantUriPermissions="true">
    <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
</provider>

provider_paths.xml
XML:
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--/storage/emulated/0/Android/data/de.kugs.mydailyreminder/files-->
    <external-files-path
        name="external_files"
        path="." />

    <!--/storage/emulated/0/Download-->
    <external-path
    name="external_downloads"
    path="Download" />
</paths>

Code zum Öffnen der PDF
Java:
//String filePath = MainMenu.this.getExternalFilesDir(null).getAbsolutePath() + "/test.pdf"; // --> GEHT
String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/test.pdf"; // --> GEHT NICHT!!!
File dir = new File(filePath);
if(dir.exists())
{
    Uri uri = FileProvider.getUriForFile(MainMenu.this, MainMenu.this.getApplicationContext().getPackageName() + ".fileprovider", dir);

    intentShareFile.setDataAndType(uri,"application/pdf");
    intentShareFile.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intentShareFile.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intentShareFile.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intentShareFile.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    startActivity(Intent.createChooser(intentShareFile, "Open File Using..."));
}

Beim Verwendung des Download-Ordners öffnet sich im Emulator nur ein schwarzer Bildschirm & am Handy passiert garnichts.
Wenn ich FLAG_ACTIVITY_NEW_TASK entferne kommt am Handy zumindest die Auswahl der App zum Öffnen der Datei und wenn ich dort Adobe auswähle erhalte ich 2 Fehler
  1. Auf diese Datei konnte nicht zugegriffen werden.
  2. Ein Systemfehler ist aufgetreten.

Ich hoffe sehr, dass ihr mir helfen könnt!

Liebe Grüße
 
Zuletzt bearbeitet:
Empfohlene Antwort(en)
Auch wenn dein Emulator resp. dein Device API 28 hat , musst du dennoch deine gesetzten minSDK / Target anpassen und auch die neusten Bibliotheken - die Androidstudio verwendet - im Source unterstützen .

Das fängt beim FileProvider an (android:name="androidx.core.content.FileProvider") und hört bei den Angaben im Gradle auf.

Permission in der Manifest :
Natürlich musst du auch unter API28 den Nutzer nach den Permission fragen , ob die App auf externe Dokumente zugreifen darf.

z.b.
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);}


content://de.kugs.mydailyreminder.fileprovider/external_downloads/test.pdf
Und dieser Pfad ist leider nicht der download-ordner deines devices - sondern deines Pakets de.kugs.mydailyreminder
Hier wird dir der Zugriff verweigert und es findet ein fallback statt und dann ist die PDF natürlich nicht vorhanden.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: AnnaBauer21
Alle Antworten (6)
aber wenn ich den Downloads-Ordner verwenden möchte geht es nicht,
a) Welchen absoluten Pfad gibt denn Deine uri im LogCat aus ? (Try/Catch abgefangen ?)
b) Dann sehe ich , dass du veraltete v4 FileProvider Bibliotheken und kein ax verwendest - was sind denn deine TargetSettings ?
c) Read/Write - Permission beim Nutzer requestet ? - Ich sehe hier auch keine Unterscheidung zum Target deinerseits
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort.

Zu a)
Sry, hab ich total vergessen!
Im Falle vom Files-Ordner:
  1. File: /storage/emulated/0/Android/data/de.kugs.mydailyreminder/files/test.pdf
  2. Uri: content://de.kugs.mydailyreminder.fileprovider/external_files/test.pdf
Im Falle vom Download-Ordner:
  1. File: /storage/emulated/0/Download/test.pdf
  2. Uri: content://de.kugs.mydailyreminder.fileprovider/external_downloads/test.pdf

Zu b)
Ich entwickle auf einem alten Stand.
API 28, Target Android 9.0, CPU/ABI x86_64

Zu c)
Das verstehe ich leider nicht, was genau meinst du damit?
Das in der Manifest Datei?
XML:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
Auch wenn dein Emulator resp. dein Device API 28 hat , musst du dennoch deine gesetzten minSDK / Target anpassen und auch die neusten Bibliotheken - die Androidstudio verwendet - im Source unterstützen .

Das fängt beim FileProvider an (android:name="androidx.core.content.FileProvider") und hört bei den Angaben im Gradle auf.

Permission in der Manifest :
Natürlich musst du auch unter API28 den Nutzer nach den Permission fragen , ob die App auf externe Dokumente zugreifen darf.

z.b.
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);}


content://de.kugs.mydailyreminder.fileprovider/external_downloads/test.pdf
Und dieser Pfad ist leider nicht der download-ordner deines devices - sondern deines Pakets de.kugs.mydailyreminder
Hier wird dir der Zugriff verweigert und es findet ein fallback statt und dann ist die PDF natürlich nicht vorhanden.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: AnnaBauer21
Vielen Dank für die Tipps, jetzt gehts!

Folgendes habe ich gemacht
  • Projekt über "Rechtsklick auf Ordner app" / Refactor / Migrate to AndroidX angepasst
    • Hat anfangs alle möglichen imports als fehlerhaft dargestellt, aber nach kurzer Zeit war alles wieder OK
build.grandle (Module.app)
  • Unter android die minSdkVersion auf den gleichen Wert wie compileSdkVersion & targetSdkersion (28) gesetzt
AndroidManifest.xaml
  • android:name="android.support.v4.content.FileProvider" ersetzt mit android:name="androidx.core.content.FileProvider"
MainMenu.java
  • Die Permission-Abfragen von swa00 hinzugefügt
  • Die gesetzten Flags angepasst:
  • Java:
    //String filePath = MainMenu.this.getExternalFilesDir(null).getAbsolutePath() + "/test.pdf";
    String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/te2.pdf";
    File dir = new File(filePath);
    if(dir.exists())
    {
        Uri uri = FileProvider.getUriForFile(MainMenu.this, MainMenu.this.getApplicationContext().getPackageName() + ".fileprovider", dir);
    
        intentShareFile.setDataAndType(uri,"application/pdf");
        intentShareFile.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intentShareFile.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(Intent.createChooser(intentShareFile, "Open File Using..."));
    }
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: swa00
Viel Erfolg mit der App :)
 
Vielen Dank :biggrin:
 
Status
Dieses Thema wurde gelöst! Zur Lösung springen…

Ähnliche Themen

B
Antworten
6
Aufrufe
1.248
jogimuc
J
A
Antworten
11
Aufrufe
422
swa00
swa00
SaniMatthias
Antworten
19
Aufrufe
1.397
swa00
swa00
Zurück
Oben Unten