2

を使ってAndroidのNに外部ストレージファイルを開くことができませんは、私はAndroidのN.と外部ストレージ内のファイルを開くトラブルを抱えていますFileProvider

ファイルパス

ファイル:///ストレージ/エミュレート

初期実装/0/Download/SamplePDFFile_5mb.pdf は完全にAndroidのバージョンで動作よりも低い7

File file = new File (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "SamplePDFFile_5mb.pdf"); 
Uri uri = Uri.fromFile(file); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "application/pdf"); 
startActivity(intent); 

以下の例外を除いて、同じ実装は7では機能しません。

android.os.FileUriExposedException

だから私は、同様の質問を発見し、24以上にターゲットアプリ用の新しいAndroidのセキュリティ機能を固定するためにthisに従ってください。

新規に実装され

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "SamplePDFFile_5mb.pdf"); 
//old way 
//Uri uri = Uri.fromFile(file); 
//new way 
Uri uri = FileProvider.getUriForFile(MainActivity.this, getPackageName() + ".provider", file); 

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "application/pdf"); 
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
startActivity(intent); 

provider_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_files" path="."/> 
</paths> 

のAndroidManifest.xml

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

E Androidマニフェスト、provider_paths.xml、FileProviderに必要なタグを追加した後、ファイルを開くことができません。開いているアクティビティはそれ自体で閉じます.logcatのエラーやメッセージはありません。

答えて

3
public void getGROUPSTORAGEPremission(){ 
    int hasWriteContactsPermission = Splash_activity.this.checkSelfPermission(Manifest.permission_group.STORAGE); 
    if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
     Splash_activity.this.requestPermissions(new String[]{ Manifest.permission_group.STORAGE}, 
       PERMISSION_GROUPSTORAGE); 
    } else { 
     File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "SamplePDFFile_5mb.pdf"); 
    //old way 
    //Uri uri = Uri.fromFile(file); 
    //new way 
    Uri uri = FileProvider.getUriForFile(MainActivity.this, getPackageName() + ".provider", file); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(uri, "application/pdf"); 
     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     startActivity(intent); 
    } 

} 
@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == PERMISSION_GROUPSTORAGE) { 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Permission Granted 
      File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "SamplePDFFile_5mb.pdf"); 
    //old way 
    //Uri uri = Uri.fromFile(file); 
    //new way 
     Uri uri = FileProvider.getUriForFile(MainActivity.this, getPackageName() + ".provider", file); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(uri, "application/pdf"); 
     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     startActivity(intent); 
     } else { 
      // Permission Denied 
      //Toast.makeText(mContext, "PERMISSION_GROUPSTORAGE Denied", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

Nは実行時のアクセス許可を確認する必要があります。たぶん後半

+0

あなたは、仲間正しいです。私はこの文脈でAndroid Permissionを完全に忘れていました。ありがとうございました。あなたは私の日を救った:-) – Sanny

1

が、私は以下のようにして、意思を一時的に許可を追加することによってそれを解決:

Uri path = FileProvider.getUriForFile(MainActivity.this, "com.example.root.somepackage.provider", pdfFile); 
    Intent pdfIntent = new Intent(Intent.ACTION_VIEW); 
    pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // GRANT TEMPORARY READ PERMISSION 
    pdfIntent.setDataAndType(path, "application/pdf"); 

    try{ 
     startActivity(pdfIntent); 
    } 

これは参考になりました:Granting Content Provider URI Permissions

+0

あなたの答えに感謝します:-) – Sanny

関連する問題