• 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
  • 相关阅读:
    [转] c#有关winform的两个代码片段(多线程操作窗体控件与窗体淡入淡出效果)
    微软企业库源码解析——DAAB(三)DatabaseFactory(其余的Strategy)
    软件工程真的那么难么
    在VS2010中的注册微软企业库4.1
    对为什么使用访问器(getter),以及什么是继承的一点看法
    微软企业库源码解析——DAAB(四)DatabaseFactory小结
    Unity与ASP.NET的集成(官方方法)
    ASPxGridView导出pdf时中文乱码的解决方案
    删除WSS卸载后遗留的数据库
    让微软企业库中的Email Trace Listener使用需要身份验证的SMTP服务器
  • 原文地址:https://www.cnblogs.com/Android-FJH/p/8573615.html
Copyright © 2020-2023  润新知