2017-11-16 2 views
0

Der folgende Code unterstützt wird in Geräten mit API 22, sondern in Geräten mit API 24 gibt es die folgenden Fehler absolut in Ordnung arbeiten:kann keine PDF-Datei von Assets Ordnern anzuzeigen, wie MODE_WORLD_READABLE länger keine

java.lang.SecurityException: MODE_WORLD_READABLE no longer supported 

Hier ist mein Code :

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.fromFile(file),"application/pdf"); 

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

Wenn ich MODE_WORLD_READABLE MODE_PRIVATE ändern dann stoppt sie in allen Geräten arbeiten. Geräte mit API 22 geben dem folgenden Fehler

11-16 12:00:53.133 16531-31103/? E/DisplayData: openFd: java.io.FileNotFoundException: Permission denied 
11-16 12:00:53.134 16531-31103/? E/PdfLoader: Can't load file (doesn't open) Display Data [PDF : 818 New Jeevan Nidhi.pdf] +FileOpenable, uri: file:///data/data/com.user.plansmart/files/818%20New%20Jeevan%20Nidhi.pdf 

Gerät mit 24 API werfen die folgende Ausnahme

11-16 12:05:00.100 2682-2682/com.user.plansmart E/cra: android.os.FileUriExposedException: file:///data/user/0/com.user.plansmart/files/827%20Jeevan%20Rakshak.pdf exposed beyond app through Intent.getData() 

mir jemand in die Lösung des Problems helfen können.

Danke.

+0

'kann-nicht anzeigen-pdf-Datei-von-Assets-Ordner' Falsche Info. Sie versuchen, eine externe App eine PDF-Datei aus dem internen Speicher Ihrer Apps anzeigen zu lassen. NICHT von Vermögenswerten. – greenapps

Antwort

0

eine Abhilfe statt gefunden MODE_WORLD_READABLE der Verwendung, da suchen here

int MODE_WORLD_READABLE This constant was deprecated in API level 17. Creating world-readable files is very dangerous, and likely to cause security holes in applications. It is strongly discouraged; instead, applications should use more formal mechanism for interactions such as ContentProvider, BroadcastReceiver, and Service. There are no guarantees that this access mode will remain on a file, such as when it goes through a backup and restore.

private void CopyReadAssets(String filename) { 
    AssetManager assetManager = getAssets(); 
    InputStream in; 
    OutputStream out; 

    try { 
     in = assetManager.open(filename); 
     String outDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 

     File outFile = new File(outDir, filename); 
     if(outFile.createNewFile()){ 
      return; 
     } 

     out = new FileOutputStream(outFile); 

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

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.fromFile(outFile), "application/pdf"); 

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

Für Geräte, nach M Sie die Erlaubnis separat stellen müssen.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission 
         .READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       102); 
    } 
} else { 
    CopyReadAssets("yourpdf.pdf"); 
} 

Dann implementieren Sie in onRequestPermissionsResult Ihren Code.

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 102: 
      CopyReadAssets("yourpdf.pdf"); 
      break; 
    } 
} 

this helps

+1

Es hilft aber nur teilweise, Sie haben immer noch die Datei uri ausgesetzt Ausnahme. – greenapps

+0

@greenapps Sie haben Recht, mit FileProvider wird der richtige Weg zu gehen –

+0

Ja, das muss mit FileProvider getan werden, da sonst FileUriExposedException ausgelöst wird. Kann Einer von Ihnen den Lösungscode vorschlagen? – pamo

0

Sie einen FileProvider verwenden sollten Sie Ihre Dateien mit Intent.ACTION_VIEW zu dienen.

Code so tun können Sie viel auf dieser Website finden.

+0

Ja, ich bin zu der Erkenntnis gekommen, dass dies nur mit Fileprovider möglich ist und ja, es gibt viel Code, aber keiner erfüllt meinen Bedarf. Ich warte nur, wenn mir hier jemand helfen kann. – pamo

Verwandte Themen