2017-07-12 23 views
0

を使用している場合私のアプリは、私は新しいテントファイルウリを渡しましたが、FileUriExposedExceptionを取得しています、「ファイルを添付」「写真を撮る」など「ビデオ取り」をする機能を備えていますNougatの。したがって、FileProviderを使用するようにコードを変更しました。私はContent Uriをうまく使っていますが、ファイル/画像/ビデオを読み込んだりアップロードしたりすると、java.io.FileNotFoundExceptionが出ます。権限を間違って設定していますか?あるいは、別の方法でパーミッションを設定する必要がありますか?設定ファイルのアクセス権FileProvider

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

provider_paths.xml:

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

MainActivity.java:

/* 
* Creating file uri to store image/video 
*/ 
public Uri getOutputMediaFileUri() { 

File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), Config.IMAGE_DIRECTORY_NAME);    

if (!mediaStorageDir.exists()) { 
    try { 
     mediaStorageDir.mkdirs(); 
     Log.d(TAG, "Created directory " + mediaStorageDir.getPath()); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 
} 

if (mediaStorageDir != null) { 
    mediaFile = new File(mediaStorageDir.getPath() + File.separator+ "IMG_1" + ".jpg"); 

    try { 
     Uri photoURI = FileProvider.getUriForFile(MainActivity.this,BuildConfig.APPLICATION_ID + ".provider", mediaFile); 

     return photoURI; 
    } catch (IllegalArgumentException e) { 
      Log.e("File Selector","The selected file can't be shared: " +mediaFile);   
    } 
} 
return null; 
} 

shouldOverrideUrlLoadingでここ

は私がやっているものです(ここで、私はテントを設定しています):onActivityResultで

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
       intent.setType("*/*"); 
       intent.addCategory(Intent.CATEGORY_OPENABLE); 
       intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    intent.putExtra(Intent.EXTRA_MIME_TYPES,extraMimeTypes); 
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
} 
try { 
    startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"),PICKFILE_REQUEST_CODE); 
} catch (android.content.ActivityNotFoundException ex) { 
    Toast.makeText(getApplicationContext(), "Please install a File Explorer.", Toast.LENGTH_SHORT).show(); 
} 

:/ PICKFILE_REQUEST /ストレージ/ 32CF-12FE:アンドロイドで

case PICKFILE_REQUEST_CODE: 
    if (resultCode == RESULT_OK){ 
     Uri selectedFile = data.getData(); 
     try { 
      filePath = getPath(this,selectedFile); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("PICKFILE_REQUEST " + filePath); 
     if(filePath != null){ 
      new UploadFileToServer().execute(); 
     }else{ 
      Toast.makeText(getApplicationContext(), " Please select from File Explorer or Gallery ", Toast.LENGTH_SHORT).show(); 
     } 
    } 

私の出力は I /のSystem.outを示しモニターDCIM /カメラ/ 20170711_161710.jpg私が推測 は、私は、ファイルをアップロードすることができません、コンテンツウリはしかし正しい

であることを意味し java.io.FileNotFoundException:/storage/32CF-12FE/DCIM/Camera/20170711_161710.jpg:オープンに失敗しました:EACCES(許可が拒否されました)

これは私の権限が正しく設定されていないことを意味しますか?これをどのように修正するのですか?

答えて

0

コードは正常ですが、FileProviderでファイルURIを取得する代わりに、ファイルの絶対パスを使用してください。 mediaFileを使用し、絶対パスをmediaFile.getAbsolutePath()で取得してください。

これは、ファイルの読み取りに使用できる文字列を返します。

+0

私は今FileProviderを使用することをお勧めしましたか? – androidappster

+0

https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed – androidappster

+0

'File Provider'が推奨されており、あなたのURIをあなたがすでにやった意図!あなたは 'mediaFile'の絶対パスを持っていますので、そこからファイルを読み込んでください。 –

関連する問題