android7.0以上调用相机和相册

 在Fragment中使用时回传要放到嵌套Fragment的Activity里面


    private static final int CODE_GALLERY_REQUEST = 0xa0;
    private static final int CODE_CAMERA_REQUEST = 0xa1;
    private static final int CODE_RESULT_REQUEST = 0xa2;
    private static final int CAMERA_PERMISSIONS_REQUEST_CODE = 0x03;
    private static final int STORAGE_PERMISSIONS_REQUEST_CODE = 0x04;
	
	
	
	
    /**
     * 自动获取相机权限
     */
    private void autoObtainCameraPermission() {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
                ToastUtils.show("您已经拒绝过一次");
            }
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_PERMISSIONS_REQUEST_CODE);
        } else {//有权限直接调用系统相机拍照
            if (hasSdcard()) {
                fileUri = new File(getExternalCacheDir() + "/photo.jpg");
                try {
                    if (fileUri.exists()) {
                        fileUri.delete();
                    }
                    fileUri.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                imageUri = Uri.fromFile(fileUri);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                    imageUri = FileProvider.getUriForFile(XGActivity.this, "db.lanxing.xylm.fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri
                PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST);
            } else {
                ToastUtils.show("设备没有SD卡!");
            }
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            //动态申请权限的回调方法:

            case CAMERA_PERMISSIONS_REQUEST_CODE: {
                //调用系统相机申请拍照权限回调
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (hasSdcard()) {

                        fileUri = new File(getExternalCacheDir() + "/photo.jpg");
                        try {
                            if (fileUri.exists()) {
                                fileUri.delete();
                            }
                            fileUri.createNewFile();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        imageUri = Uri.fromFile(fileUri);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                            imageUri = FileProvider.getUriForFile(XGActivity.this, "db.lanxing.xylm.fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri
                        PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST);
                    } else {
                        ToastUtils.show("设备没有SD卡!");
                    }
                } else {
                    ToastUtils.show("请允许打开相机!!");
                }
                break;


            }
            case STORAGE_PERMISSIONS_REQUEST_CODE:
                //调用系统相册申请Sd卡权限回调
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    PhotoUtils.openPic(this, CODE_GALLERY_REQUEST);
                } else {
                    ToastUtils.show("请允许打操作SD卡!!");
                }
                break;
        }
    }


    private int output_X = 480;
    private int output_Y = 480;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case CODE_CAMERA_REQUEST://拍照完成回调

                    fileCropUri = new File(getExternalCacheDir().getPath() + "/crop_photo.jpg");
                    try {
                        if (fileCropUri.exists()) {
                            fileCropUri.delete();
                        }
                        fileCropUri.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }


                    cropImageUri = Uri.fromFile(fileCropUri);
                    PhotoUtils.cropImageUri(this, imageUri, cropImageUri, 1, 1, output_X, output_Y, CODE_RESULT_REQUEST);
                    break;
                case CODE_GALLERY_REQUEST://访问相册完成回调
                    if (hasSdcard()) {
                        fileCropUri = new File(getExternalCacheDir().getPath() + "/crop_photo.jpg");
                        try {
                            if (fileCropUri.exists()) {
                                fileCropUri.delete();
                            }
                            fileCropUri.createNewFile();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        cropImageUri = Uri.fromFile(fileCropUri);
                        Uri newUri = Uri.parse(PhotoUtils.getPath(this, data.getData()));
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                            newUri = FileProvider.getUriForFile(this, "db.lanxing.xylm.fileprovider", new File(newUri.getPath()));
                        PhotoUtils.cropImageUri(this, newUri, cropImageUri, 1, 1, output_X, output_Y, CODE_RESULT_REQUEST);
                    } else {
                        ToastUtils.show("设备没有SD卡!");
                    }
                    break;
                case CODE_RESULT_REQUEST:
                    String path = cropImageUri.getPath();
                    if (path != null) {
                        file = new File(path);
                        RequestBody requetbody = RequestBody.create(MediaType.parse("multipart/from-data"), file);
                        MultipartBody mybody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), requetbody).build();
                        p.getPQiniuUpload(mybody.parts());

                    }
                    break;
            }
        }
    }


    /**
     * 自动获取sdk权限
     */

    private void autoObtainStoragePermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSIONS_REQUEST_CODE);
        } else {
            PhotoUtils.openPic(this, CODE_GALLERY_REQUEST);
        }

    }


    /**
     * 检查设备是否存在SDCard的工具方法
     */
    public static boolean hasSdcard() {
        String state = Environment.getExternalStorageState();
        return state.equals(Environment.MEDIA_MOUNTED);
    }
	
	
	
	
		在res目录下创建xml文件夹在创建provider_paths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path name="camera_photos" path="."/>
    </paths>
</resources>



		在AndroidManifest.xml里配置
		
		
		
		<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="db.lanxing.xylm.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

猜你喜欢

转载自blog.csdn.net/qq_42120002/article/details/81590566