android拍照裁剪修改头像

来源:互联网 发布:黑龙江优化发展环境 编辑:程序博客网 时间:2024/06/05 08:47

新年伊始

2017年的第一天,决定来一个好的开始撸一发,因为在做的项目最近遇到了修改头像这部分,所以这篇文章主要谈一下我遇到的7.0适配问题

github:https://github.com/icuihai

文章背景

1。相信我们日常生活中遇到的app都有修改头像这一部分把,基本上就是拍照和从相册选取裁剪这两部份

一般启动系统自带的相机基本就是以下几行代码

public void showCamera() {        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");        if (!file.getParentFile().exists()) file.getParentFile().mkdirs();        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {//适配4.4            mUri = Uri.fromFile(file);        } else {            mUri = FileProvider.getUriForFile(this, "com.cuihai.headphoto.provider", file);//适配7.0            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);        }        intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);        startActivityForResult(intent, ACTION_CAMERA_OK);    }
7.0适配首先说明以下,在调用系统相机这部分,android4.4要特别注意以下,因为url取的方式跟其他版本是不一样的,它是直接通过我们设置的文件路径取出,7.0版本的是通过FileProvider,这里怎么做呢?1,首先在清单文件里面注册下代码如下:、

 // 7.0文件系统        <provider            android:name="android.support.v4.content.FileProvider"            android:authorities="com.cuihai.headphoto.provider"            android:exported="false"            android:grantUriPermissions="true" >            <meta-data                android:name="android.support.FILE_PROVIDER_PATHS"                android:resource="@xml/provider_paths" />        </provider>
这里需要注意的是exported设置为false,设置为ture会报安全异常,granturipermissions表示授予临时访问权限2,在资源文件res目录下新建xml文件代码如下
<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android">    <external-path        name="files_root"        path="Android/data/com.cuihia.headphoto/" />    <external-path        name="external_files"        path="" /></paths>
裁剪部分

/裁剪    public void startPhotoZoom(Uri uri) {        Intent crop = new Intent("com.android.camera.action.CROP");        crop.setDataAndType(uri, "image");        crop.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//适配7.0        // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪        crop.putExtra("crop", "true");        // aspectX aspectY 是宽高的比例        crop.putExtra("aspectX", 1);        crop.putExtra("aspectY", 1);        // outputX outputY 是裁剪图片宽高        crop.putExtra("outputX", 300);        crop.putExtra("outputY", 300);        crop.putExtra("return-data", false);        startActivityForResult(crop, ACTION_CROP_OK);    }
相册部分

private void showPhoto() {        Intent photo = new Intent(Intent.ACTION_PICK, null);        photo.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                "image/*");        startActivityForResult(photo, ACTION_PHOTO_OK);    }
回掉部分

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        //相册        if (requestCode == ACTION_PHOTO_OK && resultCode == RESULT_OK) {            if (data != null) {                mUri = data.getData();                startPhotoZoom(mUri);            }        }        //相机        if (requestCode == ACTION_CAMERA_OK && resultCode == RESULT_OK) {            // 设置文件保存路径            if (mUri != null) {                startPhotoZoom(mUri);            }        }//裁剪        if (requestCode == ACTION_CROP_OK && resultCode == RESULT_OK) {            if (mUri != null) {                setImg(mUri);            }        }    }

我们所使用传值都是通过url实现的,这是一种比较好的解决方式,当然可以直接使用data,但是对于一下低端手机可以会出现崩溃的情况(并没有测试),6.0权限部分的代码我会放在github上面,放在这里比较占空间~~~ 遗留问题 因为项目中这部分还没有结束,所以这部分代码并没有写完,还有一个bug就是小米魅族部分手机会出现闪退的情乱,这是以为他们底层更改了代码,在调用相机之后把原来的activity给销毁掉了 ,导致返回过来的值没有使用,会报空值针,当然本片文章会更新的,这篇文章并没有gif或者图片,因为这个效果大家都知道的,如果觉得这篇文章对你有用请在github上给个赞,如果觉得文章有错误或者不理解的也请提出来大家一起讨论~~ 

github地址:点击打开链接

0 0
原创粉丝点击