android 相机拍照,从相册中选择,裁剪图片全适配

在开发中我们经常会用到相机或者从相册中选择图片上传,或者设置头像.

由于系统版本问题,高版本的系统拍照和相册会出现兼容性,读写文件的问题

都是程序猿,就不废话了,直接撸代码;

一,兼容android 7.0 在AndroidManifest.xml中先申请临时访问权限,样式和activity同级

        
            
        

二,申请权限,


三,权限要动态监测

    1,可使用google提供的权限库easypermissions动态权限库:https://github.com/googlesamples/easypermissions

 详细用法自行百度,google 

   2,打开相机/相册

   

private Uri photoOutputUri = FileProvider7.getUriForFile(this, new File(mImagePath));
    /**
     * 打开相机
     */
    private void openCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        //拍照图片保存到指定的路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, photoOutputUri);
        startActivityForResult(intent, 2);
    }

    /**
     * 打开相册
     */
    private void openPhoto() {
        //调用android的图库
        Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, 3);
    }
/**
 * 兼容android 7.0以上获取uri异常的工具类
 */
public class FileProvider7 {

    /**
     * 获取uri
     * @param context
     * @param file
     *
     * @return
     */
    public static Uri getUriForFile(Context context, File file) {
        Uri fileUri = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            fileUri = getUriForFile24(context, file);
        } else {
            fileUri = Uri.fromFile(file);
        }
        return fileUri;
    }

    /**
     * android 7.0以上获取uri的方法
     * @param context
     * @param file
     *
     * @return
     */
    private static Uri getUriForFile24(Context context, File file) {

        Uri fileUri = FileProvider.getUriForFile(context,BuildConfig.APPLICATION_ID + ".fileProvider",
                file);
        return fileUri;
    }
}

3,拍照/相册成功后返回

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                //拍照完成,去裁剪
                case 2:
                    startPhotoZoom(photoOutputUri, 150);
                    break;
                //相册完成,去裁剪
                case 3:
                    if (null != data) {
                        startPhotoZoom(data.getData(), 150);
                    }
                    break;
                //裁剪完成,保存,上传
                case 4:
                    mHandler.sendEmptyMessageDelayed(UPDATA_MSG, 200);
                    break;

                default:
                    break;

            }

        }
    }

成功返回后去裁剪,也是调用系统的裁剪 

    /**
     * 调用系统裁剪
     *
     * @param uri
     * @param size
     */
    private void startPhotoZoom(Uri uri, int size) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
           
        }
        //裁剪后输出路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mImagePath)));
        //输入图片路径
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", size);
        intent.putExtra("outputY", size);
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("return-data", false);
        startActivityForResult(intent, 4);

    }

裁剪成功后就可以进行设置,上传等操作了...通过uri可以拿到原始图片.

笔记备忘, 请多指教

 

你可能感兴趣的:(笔记)