android - 7.0系统拍照后,使用系统截图功能,截图保存时崩溃如何解决
ringa_lee
ringa_lee 2017-04-17 17:57:50
0
5
1017
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卡和摄像头 动态权限,我现在的问题是裁剪完 保存时 报上边的错误。

ringa_lee
ringa_lee

ringa_lee

모든 응답(5)
刘奇

사진의 outputUri를 가로채려면 FileProvider.getUriForFile이 아닌 Uri.fromFile만 사용할 수 있습니다

刘奇

네, 권한이 잘못되었습니다. 6.0 이후에는 권한을 동적으로 얻어야 ​​합니다.

黄舟

이제 메시지가 표시되지 않습니다. 일반적으로 사진 촬영에는 SD 카드와 카메라에 대한 두 가지 권한이 있습니다. 6.0 권한 모델과 관련된 지식은 온라인으로 쿼리할 수 있습니다. http://www.tuicool.com/articl... 온라인에서 찾아서 해결이 되는지 확인해 보니

巴扎黑

현재 나의 생각과 실천:

1. Android N 이상과 호환되도록 FileProvider를 사용하세요

2. 촬영하고 자른 사진을 파일로 저장하세요

단계:

1. AndroidManifest.xml에서 FileProvider를 선언하세요

으아악

2. res 아래에 xml 디렉터리를 만들고 다음 내용으로 filepaths.xml을 만듭니다.

으아악

참고: 이 경로로 저장하면 애플리케이션이 제거될 때 파일이 삭제된다는 장점이 있습니다. 파일/헤더/는 사용자 정의 경로입니다

3. 호출 지점에서 외부 저장소 권한을 처리해야 합니다. (시스템은 사진 촬영에 사용되므로 카메라 권한을 제공할 필요가 없습니다.)

으아악 으아악

4. URI 처리, filepath.xml에 경로가 선언되어 있으므로 이미지(save.jpg)를 저장할 파일 이름을 정의해야 합니다.

으아악

5. 처리

으아악

6. 커팅가공

으아악

마지막으로 추가할 사항: 일부 휴대폰에서는 트리밍 후 resultCode가 항상 RESULT_CANCEL일 수 있으므로 이 기능을 사용하여 액티비티의 launchMode를 SingleTask로 설정하는 것이 좋습니다

Peter_Zhu

보안 예외 사항, 버전 6.0 이상에서는 사용자 인증이 필요합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿