获取相册和拍照适配所有版本

  • 运行效果:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 剪裁框架
 implementation 'com.yalantis:ucrop:2.2.0-native'
  • 需要权限
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
       <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
       <uses-permission android:name="android.permission.CAMERA" />
  • 这三个权限都属于危险权限,因此在6.0以上的系统版本需要动态授权
 final List<String> permissionsList = new ArrayList<>();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if ((activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))
                permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if ((activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))
                permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            if ((activity.checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED))
                permissionsList.add(Manifest.permission.CAMERA);
            if (permissionsList.size() != 0) {
                activity.requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_PHONE_PERMISSIONS);
            }
        }
  • 在res资源文件下创建xml文件夹,然后再创建file_paths.xml文件
 <?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/包名/" name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>
  • 在AndroidManifest.xml中配置
  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="包名.fileProvider"//这里必须要与代码中同步  不然会出问题
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
  • 配置部分已经完成,接下来就是实现调用系统相机和相册

1、打开相册


    /**
     * 相册
     * @param activity
     */
    public static void onPickPicture(Activity activity) {
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        activity.startActivityForResult(intent, CHECKED_PHOTO);
    }

2、调用系统相机


    /**
     * 拍照
     *
     * @param activity
     */
    public static Uri onTakePhoto(Activity activity) {
        Uri outputFileUri ;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String p= Util.getSaveDir(activity)+ File.separator+"photo";
            File files=new File(Util.getSaveDir(activity)+ File.separator+"photo");
            if(!files.exists()){
                files.mkdir();
            }
            File file = new File(p, "p.jpg");
            if(file.exists()){
                file.delete();
            }
            if (Build.VERSION.SDK_INT >= 24) {
                outputFileUri = FileProvider.getUriForFile(activity.getApplicationContext(), "包名.fileProvider",  file);
            } else {
                outputFileUri = fromFile(file);
            }
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            activity.startActivityForResult(intent, TAKE_PHOTO);
            return outputFileUri;
        } else {
            LogUtils.TOAST("您的设备不支持此功能!");
        }
        return null ;
    }

outputFileUri 为拍照完了之后的路径

3、调用完相册和相机之后的结果处理

  /**
     * 适配上传图片
     *
     * @param requestCode
     * @param resultCode
     * @param intent
     */
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
            if (resultCode == Activity.RESULT_OK) {
                switch (requestCode){
                        //选择相册图片上传
                    case EditUserHeadPictureDialog.CHECKED_PHOTO:
                        EditUserHeadPictureDialog.cutPicture(this,intent.getData());
                        break;
                        //拍照上传图片
                    case EditUserHeadPictureDialog.TAKE_PHOTO:
                        EditUserHeadPictureDialog.cutPicture(this,outFileUri);
                        break;
                        //剪切图片上传
                    case UCrop.REQUEST_CROP:
                    //最终得到的图片地址 ,用来做事情
                        Uri resultUri = UCrop.getOutput(intent);                     
                        break;
              
            }
        }
    }

  • 剪裁实现代码

    /**
     * 裁剪
     *
     * @param uri
     */
    public static void cutPicture(Activity context, Uri uri) {
        UCrop.Options options = new UCrop.Options();
        //裁剪后图片保存在文件夹中
        Uri destinationUri = Uri.fromFile(new File(context.getExternalCacheDir(), "uCrop.jpg"));
        UCrop uCrop = UCrop.of(uri, destinationUri);//第一个参数是裁剪前的uri,第二个参数是裁剪后的uri
        uCrop.withAspectRatio(1,1);//设置裁剪框的宽高比例
        //下面参数分别是缩放,旋转,裁剪框的比例
        options.setAllowedGestures(UCropActivity.ALL,UCropActivity.NONE,UCropActivity.ALL);
        options.setToolbarTitle("移动和缩放");//设置标题栏文字
        options.setCropGridStrokeWidth(2);//设置裁剪网格线的宽度(我这网格设置不显示,所以没效果)
        options.setCropFrameStrokeWidth(2);//设置裁剪框的宽度
        options.setMaxScaleMultiplier(3);//设置最大缩放比例
        options.setHideBottomControls(false);//隐藏下边控制栏
        options.setShowCropGrid(true);  //设置是否显示裁剪网格
//        options.setOvalDimmedLayer(true);//设置是否为圆形裁剪框
        options.setShowCropFrame(true); //设置是否显示裁剪边框(true为方形边框)
        options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//标题字的颜色以及按钮颜色
        options.setDimmedLayerColor(Color.parseColor("#AA000000"));//设置裁剪外颜色
        options.setToolbarColor(Color.parseColor("#000000")); // 设置标题栏颜色
        options.setStatusBarColor(Color.parseColor("#000000"));//设置状态栏颜色
        options.setCropGridColor(Color.YELLOW);//设置裁剪网格的颜色
        options.setCropFrameColor(Color.YELLOW);//设置裁剪框的颜色
        uCrop.withOptions(options);
        uCrop.start(context);
    }

Nice!装逼完成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

将哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值