android.system.ErrnoException: open failed: EPERM (Operation not permitted)

android 10(Q)开始增加了沙盒机制,不能直接把文件保存到/sdcard目录下,只能保存到APP专属目录下;AndroidManifest.xml在标签下增加属性【android:requestLegacyExternalStorage="true"】可以暂时保存到/sdcard路径下,但是Android11开始就失效了

我们可以通过Context的getExternalFilesDir(null)方法获取APP专属目录,例如:/storage/emulated/0/Android/data/com.example.myapplication/files如果需要把图片保存到系统相册里可以参考下面代码:

val bitmap = BitmapFactory.decodeResource(resources, R.drawable.image_03)

val values = ContentValues();

values.put( MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + File.separator + "MyApplication"); //在图库里显示的文件夹名:MyApplication

values.put(MediaStore.MediaColumns.DISPLAY_NAME, "test");

values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");

values.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis() / 1000);

values.put(MediaStore.MediaColumns.DATE_MODIFIED, System.currentTimeMillis() / 1000);

values.put(MediaStore.MediaColumns.IS_PENDING, 1);

val resolver = contentResolver;

val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

val out = resolver.openOutputStream(uri!!)

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out)

values.clear()

values.put(MediaStore.MediaColumns.IS_PENDING, 0)

values.putNull(MediaStore.MediaColumns.DATE_EXPIRES)

resolver.update(uri, values, null, null)

相关推荐
cmdch201716 分钟前
手持机安卓新增推送按钮功能
android
攻城狮201535 分钟前
【rk3528/rk3518 android14 kernel-6.10 emcp sdk】
android
何妨呀~37 分钟前
mysql 8服务器实验
android·mysql·adb
QuantumLeap丶1 小时前
《Flutter全栈开发实战指南:从零到高级》- 25 -性能优化
android·flutter·ios
木易 士心3 小时前
MVC、MVP 与 MVVM:Android 架构演进之路
android·架构·mvc
百锦再3 小时前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
走在路上的菜鸟3 小时前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
介一安全3 小时前
【Frida Android】实战篇15:Frida检测与绕过——基于/proc/self/maps的攻防实战
android·网络安全·逆向·安全性测试·frida
hhy_smile4 小时前
Android 与 java 设计笔记
android·java·笔记
laocooon5238578864 小时前
C#二次开发中简单块的定义与应用
android·数据库·c#