を使用している場合私のアプリは、私は新しいテントにファイルウリを渡しましたが、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(許可が拒否されました)
これは私の権限が正しく設定されていないことを意味しますか?これをどのように修正するのですか?
私は今FileProviderを使用することをお勧めしましたか? – androidappster
https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed – androidappster
'File Provider'が推奨されており、あなたのURIをあなたがすでにやった意図!あなたは 'mediaFile'の絶対パスを持っていますので、そこからファイルを読み込んでください。 –