2017-05-27 2 views
0

Ich erstelle eine App, und in dieser App hat eine Schaltfläche, um eine PDF-Datei mit einem Kalender mit Aktivitäten des Benutzers zu öffnen ...PDF-Datei öffnet nicht auf Nougat +

Das PDF ist in Assets Ordnern.

Und der actualy Code ist:

private void abrirCalendario() { 
     AssetManager assetManager = getAssets(); 
     File fileDir = new File(Environment.getExternalStorageDirectory().getPath() + "/"); 
     fileDir.mkdirs(); 
     File file = new File(fileDir, "Calendario DAERG.pdf"); 
     String path = Environment.getExternalStorageDirectory().getPath() + "/Calendario DAERG.pdf"; 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     Uri uri; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", new File(path)); 

      List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
      for (ResolveInfo resolveInfo : resInfoList) { 
       String packageName = "tk.davidev.android.ews"; 
       grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      } 
     }else { 
      uri = Uri.fromFile(new File(path)); 
     } 

     if(!file.exists()) { 
      try { 
       InputStream in = assetManager.open("calendario_2017.pdf"); 
       OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 
       copyFile(in, out); 
       in.close(); 
       out.flush(); 
       out.close(); 
      } catch (Exception e) { 
      } 
     } 
     intent.setDataAndType(uri, "application/pdf"); 

     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     startActivity(intent); 
    } 

Und der Fehler ich erhalte ist: file:///storage/emulated/0/Calendario DAERG.pdf exposed beyond app through Intent.getData()

Antwort

0

Hallo, weil Android von Mashmellow, glaube ich, seine Segurity Verhalten wie Anforderung ändert für die Erlaubnis, zur Laufzeit oder mit FileProvider zum Verwalten von URI. Jetzt muss ich in irgendeinem Code Erlaubnis geben, um zu arbeiten. Hier ist ein Beispiel für Open Intent mit ACTION_VIEW in Nougat

File archivo= new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES),"excerpt_DEC.pdf");  
Uri uri = FileProvider.getUriForFile(this, 
        "com.example.android.fileprovider", 
        archivo); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri,"application/pdf"); 
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
startActivity(intent); 

Mein Beispiel die gleichen wie bei Ihnen. Ich lese eine Datei von Assets dann finde ich, dass die Datei erstellt und speichern Sie sie in Archiv Objekt. Später, ein uri mit FileProvider Methode bekommen und schließlich gebe ich Berechtigungen Absicht mit dieser Linie

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

Ich lasse Sie diesen Link für Hintergrundwissen über diese neue Implementierung. https://developer.android.com/reference/android/support/v4/content/FileProvider.html Auch ich folgte dieser anwser, um meine Datei.pdf von Asset https://stackoverflow.com/a/7495078/8650422 zu lesen Hope zu helfen, Grüße!

Verwandte Themen