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

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

基本解决了一些常出现的问题:华为手机适配,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);
}

@Override
protected 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();
    }
});













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值