Android 头像选择拍照 7.0的坑

在你的 Androidmanifest.xml 下添加:

<provider
            android:name="android.support.v4.content.FileProvider"
             android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <!--提供共享路径-->
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>

file_paths 名字随便取,然后在新建一个 xml 文件夹,席间 file_paths 文件填写如下代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="camera_photos" />
    </paths>
</resources>



 /**
     * 拍照之后,启动裁剪
     * @param camerapath 路径
     * @param imgname img 的名字
     * @return
     */
    @NonNull
    private Intent CutForCamera(String camerapath,String imgname) {
        try {

            //设置裁剪之后的图片路径文件
            File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
                    "cutcamera.png"); //随便命名一个
            if (cutfile.exists()){ //如果已经存在,则先删除,这里应该是上传到服务器,然后再删除本地的,没服务器,只能这样了
                cutfile.delete();
            }
            cutfile.createNewFile();
            //初始化 uri
            Uri imageUri = null; //返回来的 uri
            Uri outputUri = null; //真实的 uri
            Intent intent = new Intent("com.android.camera.action.CROP");
            //拍照留下的图片
            File camerafile = new File(camerapath,imgname);
            if (Build.VERSION.SDK_INT >= 24) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                imageUri = FileProvider.getUriForFile(mActivity,
                        "{applicationId}.provider",//注意和清单文件里面的一样
                        camerafile);
            } else {
                imageUri = Uri.fromFile(camerafile);
            }
            outputUri = Uri.fromFile(cutfile);
            //把这个 uri 提供出去,就可以解析成 bitmap了
            mCutUri = outputUri;
            // crop为true是设置在开启的intent中设置显示的view可以剪裁
            intent.putExtra("crop",true);
            // aspectX,aspectY 是宽高的比例,这里设置正方形
            intent.putExtra("aspectX",1);
            intent.putExtra("aspectY",1);
            //设置要裁剪的宽高
            intent.putExtra("outputX", ToolUtils.dip2px(mActivity,200));
            intent.putExtra("outputY",ToolUtils.dip2px(mActivity,200));
            intent.putExtra("scale",true);
            //如果图片过大,会导致oom,这里设置为false
            intent.putExtra("return-data",false);
            if (imageUri != null) {
                intent.setDataAndType(imageUri, "image/*");
            }
            if (outputUri != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
            }
            intent.putExtra("noFaceDetection", true);
            //压缩图片
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            return intent;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

/**
* 拍照之后,启动裁剪
* @param camerapath 路径
* @return
*/
@NonNull
private Intent CutForCamera(String camerapath) {
try {

//设置裁剪之后的图片路径文件
File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
"cutcamera.png"); //随便命名一个
if (cutfile.exists()){ //如果已经存在,则先删除,这里应该是上传到服务器,然后再删除本地的,没服务器,只能这样了
cutfile.delete();
}
cutfile.createNewFile();
//初始化 uri
Uri imageUri = null; //返回来的 uri
Uri outputUri = null; //真实的 uri
Intent intent = new Intent("com.android.camera.action.CROP");
//拍照留下的图片
File camerafile = new File(camerapath);
if (Build.VERSION.SDK_INT >= 24) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
imageUri = FileProvider.getUriForFile(mContext,
"{applicationId}.provider",//注意和清单文件里面的一样
camerafile);
} else {
imageUri = Uri.fromFile(camerafile);
}
outputUri = Uri.fromFile(cutfile);
//把这个 uri 提供出去,就可以解析成 bitmap了
photoPath_url = outputUri;
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop",true);
// aspectX,aspectY 是宽高的比例,这里设置正方形
intent.putExtra("aspectX",1);
intent.putExtra("aspectY",1);
//设置要裁剪的宽高
intent.putExtra("outputX", DensityUtil.dip2px(mContext,200));
intent.putExtra("outputY", DensityUtil.dip2px(mContext,200));
intent.putExtra("scale",true);
//如果图片过大,会导致oom,这里设置为false
intent.putExtra("return-data",false);
if (imageUri != null) {
intent.setDataAndType(imageUri, "image/*");
}
if (outputUri != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
}
intent.putExtra("noFaceDetection", true);
//压缩图片
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
return intent;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
 
参考这个注释详细点
https://www.cnblogs.com/shenchanghui/p/6955744.html
原文地址:https://www.cnblogs.com/Android-FJH/p/8573615.html