Android 裁切图片功能

  1. 动态申请权限


    申请文件的读写权限


  2. Android 7以上适配FileProvider

    Android 7 以后,Android对文件的保护变得十分严格,应用只有在调用自己的私有目录时才不需要权限,其他目录都需要动态申请权限。并且uri的创建不能再使用uri.fromFile();的方法,需要使用FileProvider的静态方法进行创建。

    Uri out = FileProvider.getUriForFile()。

  3. 从系统图库选择图片

    Intent intent = new Intent(Intent.ACTION_PICK,null);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
    activity.startActivityForResult(intent, BasicSDK.REQUEST_CUT_IMAGE_CAPTURE);
  4. 调用系统CROP方法进行裁切

    android系统有图片裁切的方法,需要通过intent进行调用。

    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");//设置要处理的图片资源
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);// 这两句是在7.0以上版本
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", ox);//裁切框的比例
    intent.putExtra("aspectY", oy);
    intent.putExtra("outputX", x);//输出图片的宽高像素数
    intent.putExtra("outputY", y);
    intent.putExtra("scale", true);//裁剪时是否保留宽高比
  5. 两种方法返回数据

两种方法的区别:通过return-data返回数据的话,返回的数据有大小限制,貌似是不大于1M的bitmap,小尺寸图片的话用return-data就可以,转换成jpg大概180宽高最大,超过之后就会被压缩到180左右,而使用MediaStore.EXTRA_OUTPUT返回数据的话不会有这个限制,适合对大图片进行裁切的时候使用,保存的是全尺寸图像。

  1. 通过return-data返回数据

    通过return-data返回数据时需要将return-data设置为true,之后裁切后的数据会通过intent返回到回调函数中。

    intent.putExtra("return-data", true);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//输出格式
    intent.putExtra("noFaceDetection", true); // 取消人脸识别
    intent = Intent.createChooser(intent, "裁剪图片");
    activity.startActivityForResult(intent, BasicSDK.REQUEST_CUT_IMAGE);
  2. 通过MediaStore.EXTRA_OUTPUT返回数据

    将return-data设置为false之后,裁切到的图片会保存到自定义的地址。

    intent.putExtra("return-data", false);
    Uri out = FileProvider.getUriForFile(activity,"com.basicsdk.sdkdemo.provider", new File(getSave_file()));//这里不能用这种方法创建uri,否则会报错,不理解
    String save_file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath()+"/save_"+UUID.randomUUID().toString()+".jpg";//自定义存储地址,这里需要将文件的保存地址定义到公共目录中,不能放到应用的私有目录,否则会保存不了,因为一般情况下只有应用本身能访问自己的私有目录。
    setSave_file(save_file);//忽略
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(save_file)));//存储地址
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", true); // 取消人脸识别
    intent = Intent.createChooser(intent, "裁剪图片");
    activity.startActivityForResult(intent, BasicSDK.REQUEST_CUT_IMAGE);
  3. 图片回显

    同样不能使用uri.fromFile();的方法获取图片,需要改成这种Uri out = FileProvider.getUriForFile()

    Uri out =FileProvider.getUriForFile(getApplicationContext(),"com.basicsdk.sdkdemo.provider", new File(photoPath));
    imageView.setImageURI(out);

Android 裁切踩坑相关推荐

  1. Android applink 踩坑指南

    Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...

  2. Android 海外踩坑记录

    Android 海外踩坑记录 谷歌相关: 1.免安装应用的版本号需要比安装式应用的要低,所以安装式应用打包时可以将版本号尽量设置大一点. 2.如果该应用存在免安装应用,那么安装式应用的manifest ...

  3. android seekbar闪退,android seekbar 踩坑之路

    最近项目中有用到seekbar,之前对这东西不太了解,趁机来踩坑. seekbar样式 按我觉得Material 中的还不算难看了.但是美工给了自己的样式,还是得改. 主要有这2个属性: androi ...

  4. cocos creator 打包apk_cocos creator android 编译踩坑

    报错1: Execution failed for task ':mergeDebugAssets'. 解决方案: 之前是有路径太长的问题,在 project build.gradle  里面的all ...

  5. Android WebView 踩坑日记,字体怎么突然变小了???

    背景 最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小. 一开始不知道是什么原因,通过二分法查找最近的提交,排查之后 ...

  6. Android开发踩坑之旅

    在此记录一些Android开发中的踩坑记录,仅供复习和参考 问题:小米 MIUI系统 相机无法调用 Camer2 新Api的问题 过程:在运行 Android-23 Samples 中 media文件 ...

  7. android ble mvp,Android mvparms 踩坑

    GitHub:https://github.com/JessYanCoding/MVPArms 起先是想自己封装Retrofit+Rxjava+mvp这种架构,在网上参考了很多文章,结果就看到了关于m ...

  8. Android WebView 踩坑日记,字体怎么突然变小了?

    parsedHtml += "<meta name="viewport" content="width=device-width,initial-scal ...

  9. android smartbar,android seekbar 踩坑之路

    最近项目中有用到seekbar,之前对这东西不太了解,趁机来踩坑. seekbar样式 按我觉得Material 中的还不算难看了.但是美工给了自己的样式,还是得改. 主要有这2个属性: androi ...

最新文章

  1. redis事务和脚本
  2. 转载:Java 内存区域和GC机制
  3. 多校1010 Taotao Picks Apples
  4. python自动提交网页表单_python自动提交表单数据库
  5. IntelliJ IDEA下git版本回退,版本还原
  6. java线程等待按钮点击_java如何用多线程使线程在sleep时等待按钮按下?
  7. linux 让暂停的进程恢复,Linux 下进程的挂起和恢复命令
  8. 《南溪的目标检测学习笔记》——数值编码(encode)的学习笔记
  9. php工程师各大公司要求
  10. 转 Git-fatal: unable to access 'xxx' : Could not resolve host: xxx
  11. Android中怎么方便的调试关机充电
  12. Spring Cloud Eureka服务注册中心 单节点搭建(学习总结)
  13. 是否可以将现有图表导入到 think-cell?
  14. Kotlin如何写脚本
  15. MySQL order by、desc、limt的使用
  16. rust炼油机怎么搞_rust挖油机在哪个位置 | 手游网游页游攻略大全
  17. jena java_java – 使用Jena查询wikidata
  18. 免流解密之SAOML二开
  19. asp .net 和 ASP
  20. 读取excel数据 画k线 成交量图

热门文章

  1. 如何解决json中携带的反斜杠_【经验分享】python干货:5种反扒机制的解决方法...
  2. react build后直接从浏览器打开
  3. 整理了js数组去重4种方法
  4. XML DOM学习笔记(JS)
  5. 跟KingDZ学HTML5之八 HTML5之Web Save
  6. 【python VS Code】调用自定义模块 ModuleNotFoundError: No module named XXX
  7. 服务器系统咋关机呀,各种服务器系统的关机
  8. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
  9. android中的用户资源访问(一)
  10. [视频]MAC中如何单独放大文本字体