前言:发现Android 调用系统裁剪时,在各Android 版本出现各种问题,踩了一堆坑,做一下总结,免得以后忘记

后面会有完整裁剪代码

1,一加手机报错

intent.putExtra("outputFormat", "png");

这句不能加,否则报错

2,Android 12不能进入裁剪页面

不能加

intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

否则无法进入裁剪页面

3.Android 12裁剪后无法拿到图片显示

Android11,12申请权限

<!-- 读取您的USB存储设备中的内容 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 修改或删除您的USB存储设备中的内容 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

申请这两个权限,在手机上只会申请媒体文件的访问权限,无法访问全部文件权限,这很重要

全部权限需要用户手动给予

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

如果用户愿意手动给你这个权限,那么裁剪就不会出现问题,否则就会出现裁剪成功,保存不成功的现象

出现这个原因:我们拥有媒体权限,所以可以打开相册选择图片,进行裁剪,裁剪后的图片会在文件夹,他不属于媒体文件,我们没有这个权限,除非有全部文件权限

解决方案:我们将裁剪后的图片加入到相册,这样裁剪后图片就是媒体文件了,代码后续会放上

4.谷歌手机路劲和普通手机不一致

这个要注意一下,谷歌手机最好不要用bundle的形式去拿裁剪后的图片

下面是源码部分

1.打开相册

Intent intent = new Intent(Intent.ACTION_PICK);//选择数据的意图
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);//设置数据和类型,从图库中获取图片
startActivityForResult(intent, PHOTOZOOM);//执行意图并传入请求码(请求码根据业务需要自行指定)

2.拿到相册uri后进行裁剪

data.getData()是uri

裁剪和得到裁剪拿到图片可以用两种写法

1,用bundle的方式,

优点就是不要读写权限了

缺点就是对裁剪尺寸有限制(500*500),因为intent传值,大小1M,多了报错

2.就用uri了

优点大小无限制

缺点就是要权限

1,uri方式

private void clipPhoto(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 800);intent.putExtra("outputY", 800);intent.putExtra("return-data", false);intent.putExtra("scale", true);intent.putExtra("scaleUpIfNeeded", true);File CROP_TEMP_FILE = Environment.getExternalStorageDirectory();File mFullPath = new File(CROP_TEMP_FILE, "unheadimage" + System.currentTimeMillis() + ".png");fileUri = Uri.fromFile(mFullPath);intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);startActivityForResult(intent, PHOTORESULT);
}

2.bundle方式

private void clipPhoto(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 100);intent.putExtra("outputY", 100);intent.putExtra("circleCrop", true);intent.putExtra("return-data", true);startActivityForResult(intent, PHOTORESULT);
}

3.对裁剪的图片处理

同样分2种

1.uri方式

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, fileUri));
new Handler().postDelayed(new Runnable() {@Overridepublic void run() {try {iView.setImageBitmap(MediaStore.Images.Media.getBitmap(getContentResolver(),fileUri));} catch (IOException e) {e.printStackTrace();}}
},500);

其中发送广播是为了将图片变成媒体文件,否则他是文件,需要文件权限

2.bundle方式

Bundle bundle = data.getExtras();//把数据取出来,Bundle是一个装数据的可以在activity之间传输的类
Bitmap bitmap = bundle.getParcelable("data");//获取位图
iView.setImageBitmap(bitmap);//设置位图,显示

下面提供一种uri转bitmap的

1,

MediaStore.Images.Media.getBitmap(getContentResolver(),fileUri)

2.

private Bitmap getBitmapFromUri(Context context, Uri uri) {ParcelFileDescriptor parcelFileDescriptor;Bitmap mBitmap = null;try {parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();mBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);parcelFileDescriptor.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return mBitmap;
}

在提供一种保存bitmap进相册的

 public static void saveImageToGallery(Context context, Bitmap bmp) {// 首先保存图片File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 其次把文件插入到系统图库
//        try {
//            MediaStore.Images.Media.insertImage(context.getContentResolver(),
//                    file.getAbsolutePath(), fileName, null);
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        }// 最后通知图库更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath())));}

完结散花,后续遇到问题,继续完善

-----------------------------------------------------------------------------

补充点:

3.Android 12裁剪后无法拿到图片显示

这个问题新的修改方案

因为intent的建立的文件夹有问题,上面是用的私有域地址,可以用公有域的

可以用getExternalStoragePublicDirectory

获取公域地址方法:

String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath()

Android 调用系统裁剪,适配11和12及手机相关推荐

  1. Android调用系统群发短信,vivo部分手机弹出“无效的地址”解决方法

    Android调用系统群发短信,vivo部分手机弹出"无效的地址"解决方法 第一次写文章,来试试水 之前项目中有一个需求是获取通讯录联系人信息,并展示出来,然后可以选择一个或者多个 ...

  2. android调用系统裁剪图片 返回模糊 不清晰的问题

    基本这个功能都是在头像设置的时候会用到 Android 从相机拍完照片 然后跳去系统自带的裁剪 或者从相册选取图片裁剪  然后把裁剪好的图片设置成头像 这里直接贴上跳到裁剪部分的代码 private ...

  3. android调用系统裁剪功能,Android图片剪裁之调用系统剪裁

    参考: 一. 原理 通过Intent打开系统自带的剪裁Activity,通过Intent设置Extra参数,进行剪裁参数的设定.剪裁结果的缩略图会保存在返回的data中,而大图要通过Uri进行保存(其 ...

  4. 上传头像裁剪 android,android 调用系统裁剪框 裁剪头像

    [实例简介] [实例截图] [核心代码] package me.khrystal.activities; import android.content.Intent; import android.g ...

  5. Android调用系统拍照裁剪和选图功能

    最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照 private fun openCamera() { //调用相机拍照// 创建File对象,用于存储拍照后的图 ...

  6. MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题

    Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题 直接上代码 首先添加拍照需要的权限 <uses-permission android:name="andr ...

  7. android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法

    Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...

  8. 安卓图片操作(调用系统相机,预览本地照片,调用系统裁剪图片,压缩图片,中心裁剪方形图片,bitmap转byte[])

    先创建照片存储uri public static Uri createImagePathUri(Context context) {Uri imageFilePath = null;String st ...

  9. Android调用系统的拍照,打开相册功能

    Android调用系统的拍照,打开相册功能 1 添加权限: <!-- 往SDCard写入数据权限 --> <uses-permission android:name="an ...

最新文章

  1. Oracle11g密码忘记处理方法
  2. linux 内核 printk 使用
  3. 【Python】PAT-1026 程序运行时间(AC)
  4. 多功能嵌入式解码软件(2)
  5. 解决 mysql>com.mysql.jdbc.PacketTooBigException: Packet for query is too large (12073681 > 4194304)
  6. Windows 环境 Jenkins集成构建SonarQube
  7. 洛谷—— P2733 家的范围 Home on the Range
  8. 初入c++(六)虚函数实现多态,虚析构函数,虚函数表和多态实现机制,纯虚函数。
  9. Java harddisk pc cpu,java获得cpu使用率
  10. MyBatis理解与掌握(输入与输出)
  11. C++ gdb core调试 崩溃日志 都是问号??
  12. 2019上半年系统集成项目管理工程师上午真题及答案解析
  13. 高等代数——大学高等代数课程创新教材(丘维声)——2.6笔记+习题
  14. stata软件meta分析模块安装教程
  15. Hudi Spark SQL源码学习总结-Create Table
  16. c#计算圆或者圆柱面积体积代码
  17. 《中国品牌故事》讲述中节能品牌故事:皓日初升
  18. kali2021安装RTL8188GU无线网卡[TL-WN726N]驱动
  19. 【WLM200Think无线鼠标拆解】鼠标中键有什么用?如何用鼠标中键提高效率? 鼠标中键不灵敏如何修理?
  20. 如何用python爬取下载微博视频_程序员徒手用python教你爬取新浪微博,一天可抓取 1300 万条数据...

热门文章

  1. 常量的定义与使用与变量的定义与使用
  2. MySQL数据库——数据库设计概念和数据库设计步骤
  3. Oracle Flashback之flashback table
  4. 婚介行业线上引流渠道哪些?你还在为找不到客户而烦恼吗?这些渠道千万别错过!
  5. win10升级补丁_Win 10 暂停更新及回滚方法
  6. DRM框架(vkms)分析(3)----connector->func connector->helper_private的使用
  7. git 打patch的方法
  8. JS的严格模式和标准模式
  9. 快慢指针 ——链表 | Leetcode 练习
  10. 利用快慢指针判断循环