ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 11 分区存储图片裁剪上传异常问题

2021-12-01 11:33:20  阅读:211  来源: 互联网

标签:11 Media 裁剪 uri 29 values Images Android MediaStore


1、targetSdkVersion 29 以下 不包含29 使用 android:requestLegacyExternalStorage="true"
可以解决问题
android:requestLegacyExternalStorage="true" 操作文件需要设置为true

2、如果targetSdkVersion大于29的话 把裁剪后的路径修改为公共路径 但是仅在模拟上可运行,真机还是不行
getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
getExternalStoragePublicDirectory 这个方法早就标记删除了

3、targetSdkVersion大于29 

先处理 调用系统裁剪的输出目录
val values = ContentValues()
values.put(MediaStore.Images.Media.DISPLAY_NAME, name)
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
values.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM)
}
val uri = requireContext().contentResolver.insert(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    values
)

使用上面的uri 作为裁剪的输出目录
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)

Android 10 及以下可以 直接 File(uri.path) 获取到文件 这样就可以进行上传了
Android 11 及以上就需要特殊处理了
使用contentResolver 处理
下面的方法获取后缀
MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri))
// 获取到输入流inputStream
contentResolver.openInputStream(uri)
// 可以使用context.getExternalFilesDir 图片的目录 创建一个文件
context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath
读取输入流 使用输出流包装文件 把输入流写入到输出流中 当前文件就有内容了
直接把当前file 上传即可
Android 11 直接使用 File(uri.path) 上传 会提示 open failed: EACCES (Permission denied)


targetSdkVersion大于29的情况下)sdk 大于28 下面的权限就不要声明了,声明了也没有什么用
android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
动态申请存储权限时,申请 android.permission.READ_EXTERNAL_STORAGE 这个权限即可
 

标签:11,Media,裁剪,uri,29,values,Images,Android,MediaStore
来源: https://www.cnblogs.com/rchao/p/15628112.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有