2017-05-27 82 views
0

我創建一個應用程序,並在此應用程序有一個按鈕打開一個PDF與用戶的活動日程表...PDF文件不開放的牛軋糖+

的PDF是資產的文件夾。

而且actualy代碼:

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); 
    } 

而且我得到的錯誤是: file:///storage/emulated/0/Calendario DAERG.pdf exposed beyond app through Intent.getData()

回答

0

嗨由於Android從Mashmellow,我認爲,改變其行爲segurity如請求許可在運行時或使用FileProvider來管理URI。現在我必須在某些代碼中允許才能工作。 這裏的開放意圖與ACTION_VIEW的牛軋糖的例子

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); 

我的例子是一樣的你。我從資產中讀取一個文件,然後,我發現該文件已創建並保存在archivo對象中。後來,得到與FileProvider方法的URI,最後,我給權限的意圖與該行

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

我離開你這個新的實現這個鏈接的背景知識。 https://developer.android.com/reference/android/support/v4/content/FileProvider.html 此外,我跟着這anwser從資產 https://stackoverflow.com/a/7495078/8650422 我的file.pdf閱讀希望幫助,問候!

相關問題