zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    spring boot图片上传至远程服务器并返回新的图片路径
    java错误笔记
    mybatis逆向工程
    将vue-cli项目配置在nginx上
    spring boot使用jpa查询mysql数据库的视图时不报错,但查询结果数据总是重复第一条
    match,location,history
    fetch和axios区别,proxy代理配置
    es6语法错误
    JAVA多线程之volatile 与 synchronized 的比较
    做到这一点,你也可以成为优秀的程序员
  • 原文地址:https://www.cnblogs.com/Android-FJH/p/8573615.html
Copyright © 2011-2022 走看看