首页 > 学院 > 开发设计 > 正文

安卓选择相册或者相机图片并裁剪适配华为小米机型

2019-11-09 14:05:23
字体:
来源:转载
供稿:网友

选择图片上传基本是标配了,有必要写好个通用的方法以便使用,以下是一堆代码,使用的时候粘贴进去就可以了。

基本解决了一些常出现的问题:华为手机适配,6.0权限申请,图片大小控制。

1、关于权限问题,我们使用一个开源库:

dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    compile 'com.mylhyl:acp:1.1.7'}相机与相册都需要读写权限,相机还需要照相权限。

2、具体代码,拷贝就能用:

// 拍照成功,读取相册成功,裁减成功PRivate final int ALBUM_OK = 101, CAMERA_OK = 102, CUT_OK = 103;private File bitfile;

private void xiangji() {    Acp.getInstance(mContext).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA).build(), new AcpListener() {        @Override        public void onGranted() {            File dou = new File(Environment.getExternalStorageDirectory(), "dou");            if (!dou.exists()) {                dou.mkdirs();// 2.创建相片的存储目录            }            // 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除            String fileName = new SimpleDateFormat("ss-SSS")                    .format(new Date()) + ".jpg";            bitfile = new File(dou, fileName);            // 来自相机            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 下面这句指定调用相机拍照后的照片存储的路径            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile));            startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识        }        @Override        public void onDenied(List<String> list) {            Qiuutil.ShortToast(list.toString() + "权限拒绝");        }    });}private void xiangce() {    Acp.getInstance(PersonInfoActivity.this).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() {        @Override        public void onGranted() {            File dou = new File(Environment.getExternalStorageDirectory(), "dou");            if (!dou.exists()) {                dou.mkdirs();// 2.创建相片的存储目录            }            // 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除            String fileName = new SimpleDateFormat("ss-SSS")                    .format(new Date()) + ".jpg";            bitfile = new File(dou, fileName);            // 来自相册            Intent albumIntent = new Intent(Intent.ACTION_PICK, null);            /**             * 下面这句话,与其它方式写是一样的效果,如果:             * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);             * intent.setType(""image/*");设置数据类型             * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"             */            albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");            startActivityForResult(albumIntent, ALBUM_OK);        }        @Override        public void onDenied(List<String> list) {            Qiuutil.ShortToast(list.toString() + "权限拒绝");        }    });}
/** * 裁剪图片方法实现 * * @param uri  图片uri * @param type 类别:相机,相册 */public void clipPhoto(Uri uri, int type) {    Intent intent = new Intent("com.android.camera.action.CROP");    intent.setDataAndType(uri, "image/*");    // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪    intent.putExtra("crop", "true");    // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)    intent.putExtra("aspectX", 1);    intent.putExtra("aspectY", 1);    // outputX outputY 是裁剪图片宽高    intent.putExtra("outputX", 300);    intent.putExtra("outputY", 300);    intent.putExtra("return-data", false);    /**     * 此处做一个判断     * 1,相机取到的照片,我们把它做放到了定义的目录下。就是file     * 2,相册取到的照片,这里注意了,因为相册照片本身有一个位置,我们进行了裁剪后,要给一个裁剪后的位置,     *   不然onActivityResult方法中,data一直是null     */    if (type == CAMERA_OK) {        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);    } else {        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile));    }    startActivityForResult(intent, CUT_OK);}

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    System.out.println("requestCode = " + requestCode);    switch (requestCode) {        // 如果是直接从相册获取        case ALBUM_OK:            //从相册中获取到图片了,才执行裁剪动作            if (data != null) {                clipPhoto(data.getData(), ALBUM_OK);                //setPicToView(data);            }            break;        // 如果是调用相机拍照时        case CAMERA_OK:            // 当拍照到照片时进行裁减,否则不执行操作            if (bitfile.exists()) {                clipPhoto(Uri.fromFile(bitfile), CAMERA_OK);//开始裁减图片            }            break;        // 取得裁剪后的图片,这里将其设置到imageview中        case CUT_OK:            /**             * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,             * 要重新裁剪,丢弃 当前功能时,会报NullException             */            if (data != null) {                try {                    //   Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData()));                    //   i1.setImageBitmap(bitmap);                    Bitmap bm = BitmapFactory.decodeFile(bitfile.getAbsolutePath());
//这里获取了Bitmap,就可以进行显示操作,而一般上传去网上,可以使用文件路径bitfile.getAbsolutePath(),// 这不推荐用data进行数据操作,特别因为华为手机方法与其他手机不一致,容易bug。                    mRoundImageView2.setImageBitmap(bm);                    Qiuutil.LogE(Uri.fromFile(bitfile) + ":" + bitfile.getAbsolutePath());                                   } catch (Exception ex) {                    ex.printStackTrace();                }            } else {                Log.e("图片数据获取Main", "data为空");            }            break;        default:            break;    }    super.onActivityResult(requestCode, resultCode, data);}

调用时:

mTextView2.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        //xiangji();        xiangce();    }});


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表