java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri content://com.tianshaokai.demo.fileprovider/camera_photos/temp/1480414713257.jpg from pid=23075, uid=10041 requires the provider be exported, or grantUriPermission()
public void cropPhoto(File file) {
cropfile = new File(Environment.getExternalStorageDirectory(), "/temp/" + System.currentTimeMillis() + ".jpg");
if (!cropfile.getParentFile().exists()) cropfile.getParentFile().mkdirs();
Uri outputUri = FileProvider.getUriForFile(this, getProvider(), cropfile);
Uri imageUri = FileProvider.getUriForFile(this, getProvider(), file);//通过FileProvider创建一个content类型的Uri
Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 400);
// intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, 1002);
}
file = new File(Environment.getExternalStorageDirectory(), "/temp/" + System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
Uri imageUri = FileProvider.getUriForFile(this, getProvider(), file);//通过FileProvider创建一个content类型的Uri
Log.d(TAG, "imageUri: " + imageUri);
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
startActivityForResult(intent, 1001);
现在就是拍照完成后,裁剪 就报最上边的 权限错误,测试机是 7.0 的模拟器
看到大家的回答我补充一下啊,我已经添加了6.0 的 SD卡和摄像头 动态权限,我现在的问题是裁剪完 保存时 报上边的错误。
Untuk memintas outputUri foto, anda hanya boleh menggunakan Uri.fromFile, bukan FileProvider.getUriForFile
Ya, kebenarannya salah. Selepas 6.0, kebenaran perlu diperoleh secara dinamik.
Tiada gesaan sekarang Anda perlu memulakan permohonan kebenaran secara aktif Secara amnya, untuk mengambil gambar, terdapat dua kebenaran untuk kad SD dan kamera. Pengetahuan berkaitan model kebenaran 6.0 boleh ditanya dalam talian. http://www.tuicool.com/articl... Saya menemuinya dalam talian dan anda boleh melihat sama ada ia boleh diselesaikan,
Pemikiran dan amalan semasa saya:
1 Gunakan FileProvider agar serasi dengan Android N dan ke atas
2. Gunakan fail untuk menyimpan gambar yang diambil dan dipangkas
Langkah:
1. Deklarasikan FileProvider dalam AndroidManifest.xml
2. Cipta direktori xml di bawah res dan buat filepaths.xml dengan kandungan berikut:
Nota: Kelebihan menyimpan dengan laluan ini ialah fail akan dipadamkan apabila aplikasi dinyahpasang fail/header/ ialah laluan tersuai
3. Titik panggilan perlu mengendalikan kebenaran storan luaran (kerana sistem digunakan untuk mengambil gambar, tidak perlu memberikan kebenaran kamera)
4. Pemprosesan URI, laluan telah diisytiharkan dalam filepath.xml, anda perlu menentukan nama fail untuk menyimpan imej (save.jpg)
5. Pemprosesan foto
6. Pemprosesan pemotongan
Satu perkara terakhir untuk ditambah: Sesetengah telefon mudah alih mungkin mempunyai resultCode sentiasa RESULT_CANCEL selepas pemangkasan, jadi adalah disyorkan untuk menetapkan Mod pelancaran Aktiviti menggunakan fungsi ini kepada singleTask
Pengecualian keselamatan, kebenaran pengguna diperlukan untuk versi 6.0 dan ke atas.