Android 7.0调用相机/相册/裁剪

来源:互联网 发布:java图形界面设计实例 编辑:程序博客网 时间:2024/06/05 09:02

Android 调用相机/相册/裁剪,6.0需要申请权限,7.0有路劲安全问题
1、安全问题需要设置共享路劲,需要在AndroidManifest.xml里的application下设置provider

        <!--//路径安全问题        android:authorities的值要跟我们要跟获取uri一致        exported:要求必须为false,为true则会报安全异常。        grantUriPermissions:true,表示授予 URI 临时访问权限。        <meta-data />标签里面是用来指定共享的路径。        android:resource="@xml/file_paths"就是我们的共享路径配置的xml文件,        -->        <provider            android:name="android.support.v4.content.FileProvider"            android:authorities="com.company.projectname.fileprovider"            android:grantUriPermissions="true"            android:exported="false">            <meta-data                android:name="android.support.FILE_PROVIDER_PATHS"                android:resource="@xml/file_paths" />        </provider>

2、在res目录下的xml文件夹里创建file_paths

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

3、先创建图片路劲

 private File tempFile = new File(Environment.getExternalStorageDirectory(), getPhotoFileName());    /*    * 拍照时 7.0以下imageUri=Uri.fromFile(tempFile);    * 7.0以上imageUri = FileProvider.getUriForFile(UserCenterActivity.this, "com.company.projectname.fileprovider", tempFile);//第二个参数和清单文件android:authorities一致    */    private Uri imageUri; // 使用系统当前日期加以调整作为照片的名称,避免名字一样    private String getPhotoFileName() {        Date date = new Date(System.currentTimeMillis());        SimpleDateFormat sdf = new SimpleDateFormat("'PNG'_yyyyMMdd_HHmmss", Locale.CHINA);        return sdf.format(date) + ".jpg";    }

4、调用拍照/相册/裁剪功能(6.0需要在代码里申请权限)

 // 调用拍照(6.0需要在代码里申请权限)——点击拍照时调用                    if (ContextCompat.checkSelfPermission(UserCenterActivity.this, Manifest.permission.CAMERA)                            != PackageManager.PERMISSION_GRANTED) {                        //申请WRITE_EXTERNAL_STORAGE权限                        ActivityCompat.requestPermissions(UserCenterActivity.this, new String[]{Manifest.permission.CAMERA},                                Permission_CAMERA);                    } else {                        startCamera();//开启相机                    }

相机(7.0)和相册

    private static final int PHOTO_CARMERA = 1;  //相机    private static final int PHOTO_PICK = 2;    private static final int PHOTO_CUT = 3;   //裁剪    private static final int EXTRA_OUTPUT = 4;    //权限请求    private static final int Permission_CAMERA = 11;    private static final int READ_EXTERNAL_STORAGE = 12; private void startCamera() {        // 调用系统的拍照功能        Intent intent = new Intent();        //添加这一句表示对目标应用临时授权该Uri所代表的文件 >>>>>>>>>>>>add        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0系统(7.0)            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);            imageUri=FileProvider.getUriForFile(UserCenterActivity.this, "com.company.projectname.fileprovider", tempFile);        }else {            imageUri =Uri.fromFile(tempFile);        }        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //设置Action为拍照        // 指定调用相机拍照后照片的存储路径        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);        startActivityForResult(intent, PHOTO_CARMERA);    } // 调用相册    private void startPick() {        // 调用系统相册        Intent intent =new Intent(Intent.ACTION_PICK,null);        //此处调用了图片选择器        //如果直接写intent.setDataAndType("image/*");        //调用的是系统图库        imageUri =Uri.fromFile(tempFile);        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);        startActivityForResult(intent, PHOTO_PICK);    }

裁剪

 //相册——裁剪    private void setPhoto_Pick(Intent data) {        Intent intent = new Intent("com.android.camera.action.CROP");        //此处注释掉的部分是针对android 4.4路径修改的一个测试        //有兴趣的读者可以自己调试看看        intent.setDataAndType(data.getData(), "image/*");        intent.putExtra("scale", true);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //7.0            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//            imageUri=FileProvider.getUriForFile(UserCenterActivity.this, "com.weiyang.bojiuvedio.fileprovider", tempFile);        }        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);        startActivityForResult(intent, EXTRA_OUTPUT);    }    // 相机——调用系统裁剪    private void startPhotoZoom(Uri uri, int size) {        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri, "image/*");        // crop为true是设置在开启的intent中设置显示的view可以裁剪        intent.putExtra("crop", true);        // aspectX,aspectY是宽高的比例        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", 1);        // outputX,outputY是裁剪图片的宽高        intent.putExtra("outputX", size);        intent.putExtra("outputY", size);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //7.0            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//            imageUri=FileProvider.getUriForFile(UserCenterActivity.this, "com.weiyang.bojiuvedio.fileprovider", tempFile);        }        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);        intent.putExtra("scale", true);        // 设置是否返回数据        intent.putExtra("return-data", false);        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());        startActivityForResult(intent, PHOTO_CUT);    }

相机拍照的结果显示在image上(7.0)

// 将裁剪后的图片显示在ImageView上,需要从共享路径获取    private void setPicToView() {        if (imageUri != null) {            Log.i("imageUri......",">>>>1111"+imageUri);            ContentResolver contentProvider = getContentResolver();//7.0从共享文件获取            ParcelFileDescriptor mInputPFD;            try {                mInputPFD = contentProvider.openFileDescriptor(imageUri, "r");                FileDescriptor fileDescriptor = mInputPFD.getFileDescriptor();                userImage.setImageBitmap(BitmapFactory.decodeFileDescriptor(fileDescriptor));            } catch (FileNotFoundException e) {                e.printStackTrace();            }        }    }

返回处理

 @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        // 用户没有进行有效的设置操作,返回        if (resultCode == RESULT_CANCELED) {            return;        }        switch (requestCode){            // 调取相机拍照后——裁剪            case PHOTO_CARMERA://                setPicToView();                startPhotoZoom(imageUri, 200); //裁剪                break;            // 剪裁后的图片            case PHOTO_CUT:                if (data != null) {                    setPicToView();                }                break;            //相册_此处启动裁剪程序      21            case PHOTO_PICK:                if(data!=null){                    setPhoto_Pick(data);                }                break;            case EXTRA_OUTPUT:  //22                if (ContextCompat.checkSelfPermission(UserCenterActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)                        != PackageManager.PERMISSION_GRANTED) {                    ActivityCompat.requestPermissions(UserCenterActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},                            READ_EXTERNAL_STORAGE);                } else {                    try {                        //将output_image.jpg对象解析成Bitmap对象,然后设置到ImageView中显示出来                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()                                .openInputStream(imageUri));                        userImage.setImageBitmap(bitmap);                    } catch (FileNotFoundException e) {                        e.printStackTrace();                    }                }                break;        }        super.onActivityResult(requestCode, resultCode, data);    }

权限返回处理

//权限返回处理 @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode){            case Permission_CAMERA://调用相机权限                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    // Permission Granted                    startCamera();                } else {                    // Permission Denied                    Toast.makeText(getApplicationContext(), "请求权限失败,请手动打开权限", Toast.LENGTH_SHORT).show();                }                break;            case READ_EXTERNAL_STORAGE:                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    // Permission Granted                    try {                        //将output_image.jpg对象解析成Bitmap对象,然后设置到ImageView中显示出来                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()                                .openInputStream(imageUri));                        userImage.setImageBitmap(bitmap);                    } catch (FileNotFoundException e) {                        e.printStackTrace();                    }                } else {                    // Permission Denied                    Toast.makeText(getApplicationContext(), "请求权限失败,请手动打开权限", Toast.LENGTH_SHORT).show();                }                break;        }    }
阅读全文
0 0