2017-12-05 4 views
0

Ich versuche, "NEFT.pdf" -Datei im Asset-Ordner meiner Android App gespeichert anzuzeigen.
Der folgende Code funktioniert absolut in Ordnung bis API 25Der Versuch, PDF-Datei aus Assets Ordner mit FileProvider zu öffnen, aber FileNotFoundException gibt: Keine solche Datei oder Verzeichnis

private void CopyReadAssets(String filename) { 
    AssetManager assetManager = getAssets(); 
    InputStream in = null; 
    OutputStream out = null; 
    File file = new File(getFilesDir(), filename); 

    try { 
     in = assetManager.open(filename); 
     out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); 

     copyFile(in, out); 
     in.close(); 
     in = null; 
     out.flush(); 
     out.close(); 
     out = null; 


     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(
       Uri.parse("file://" + getFilesDir() + "/"+filename), "application/pdf"); 

     startActivity(intent); 
    } catch (Exception e) 
    { 
     Toast.makeText(PdfFilesList.this, "cra: "+e.toString(), Toast.LENGTH_SHORT).show(); 
    } 
} 

Dieser Code nicht auf API 25 und höher funktioniert. Es wird der Fehler MODE_WORLD_READABLE nicht mehr unterstützt.
habe ich es zu MODE_PRIVATE aber das gibt mir noch einen Fehler

android.os.fileuriexposedexception über App durch intent.getdata ausgesetzt().
Also habe ich das Konzept bei Developer.Android.com erklärt.
Dies ist, was ich im Fehlerprotokoll erhalten:

E/DisplayData: openFd: java.io.FileNotFoundException: Keine solche Datei oder das Verzeichnis

E/PdfLoader: Die Datei kann nicht geladen werden (nicht geöffnet) Daten anzeigen [PDF: NEFT.pdf] + InhaltOpenable, uri: content: //com.user.plansmart.provider/pdf_files/NEFT.pdf

uri sieht für mich korrekt aus. Kann mir jemand dabei helfen, den Fehler zu finden?

Hier ist der Anbieter Element in der Manifestdatei.

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="${applicationId}.provider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths"/> 
    </provider> 

Dies ist die provider_paths.xml Datei

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<external-path name="external_files" path="."/> 
<files-path name="pdf_files" path="pdf/"/> 

Dies ist die Android-Code ist die pdf-Datei

private void displayFile(String filename) { 
    try { 
     File filePath = new File(getApplicationContext().getFilesDir(), "pdf"); 
     File newFile = new File(filePath, filename); 

     //new version 
     Uri fileUri = FileProvider.getUriForFile(PdfFilesList.this, 
       BuildConfig.APPLICATION_ID + ".provider", newFile); 

     getApplicationContext().grantUriPermission(PACKAGE_NAME, 
          fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(fileUri, "application/pdf"); 
     intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); 
     startActivity(intent); 
    }catch (Exception e){ 
     e.printStackTrace(); 
     Toast.makeText(PdfFilesList.this, "df "+e.toString(), Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

Wenn Sie Dateien in Assets haben, dann können Sie nicht die Verwendung FileProvider-Klasse, um sie zu bedienen. Überdenken. Recode. – greenapps

+0

'getFilesDir()," pdf ");'. Was hast du gesagt? Vermögenswerte? Nein. Nicht im Vermögen. getFilesDir() ist privater interner Speicher. Bitte passen Sie Ihren Beitrag an. Beginnend mit dem Thema. – greenapps

+0

Oder ist die Datei in Assets? Dann können Sie getFilesDir() nicht verwenden. Bitte sag was du hast. – greenapps

Antwort

0

Ursache Sie das PDF wollen anzuzeigen anzuzeigen Datei in einer separaten Anwendung (z. B. Adobe Reader), ich wo uld bevorzugen Sie folgendermaßen vorgehen: -

private void CopyReadAssets() 
     { 
      AssetManager assetManager = getActivity().getAssets(); 

      InputStream in = null; 
      OutputStream out = null; 
      String state = Environment.getExternalStorageState(); 
      if (!Environment.MEDIA_MOUNTED.equals(state)) { 
       Toast.makeText(getActivity(), "External Storage is not Available", Toast.LENGTH_SHORT).show(); 
      } 
      File pdfDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/PDFs"); 
      if (!pdfDir.exists()) { 
       pdfDir.mkdir(); 
      } 
      File file = new File(pdfDir + "/abc.pdf"); 

      try 
      { 
       in = assetManager.open("abc.pdf"); 
       out = new BufferedOutputStream(new FileOutputStream(file)); 
       copyFile(in, out); 
       in.close(); 
       in = null; 
       out.flush(); 
       out.close(); 
       out = null; 
      } catch (Exception e) 
      { 
       Log.e("tag", e.getMessage()); 
      } 
      if (file.exists()) //Checking for the file is exist or not 
      { 
       Uri path = Uri.fromFile(file); 
       Intent objIntent = new Intent(Intent.ACTION_VIEW); 
       objIntent.setDataAndType(path, "application/pdf"); 
       objIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       Intent intent1 = Intent.createChooser(objIntent, "Open PDF with.."); 
       try { 
        startActivity(intent1); 
       } catch (ActivityNotFoundException e) { 
        Toast.makeText(getActivity(), "Activity Not Found Exception ", Toast.LENGTH_SHORT).show(); 
       } 
      } else { 
       Toast.makeText(getActivity(), "The file not exists! ", Toast.LENGTH_SHORT).show(); 
      } 
     } 

Für Kopie-Datei in Gerätespeicher: -

private void copyFile(InputStream in, OutputStream out) throws IOException 
    { 
     byte[] buffer = new byte[1024]; 
     int read; 
     while ((read = in.read(buffer)) != -1) 
     { 
      out.write(buffer, 0, read); 
     } 
    } 

Verwenden Sie die unten Permission

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

"Datei existiert nicht". Ich habe versucht, den Uri-Pfad zu diesem Uri-Pfad zu ändern = Uri.parse ("content: //com.user.plansmart.provider/pdf_files/" + Dateiname); – pamo

+0

auch mit Uri-Pfad versucht = Uri.parse ("file: /// android_asset /" + Dateiname); funktioniert nicht – pamo

+0

Verbringen Sie Ihre Zeit nicht mit dieser Antwort. Das ist Unsinn. – greenapps

Verwandte Themen