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)

相关推荐
方白羽1 天前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
曲幽1 天前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev1 天前
单例模式 → object 声明
android·java·kotlin
程序员陆业聪1 天前
读者点单·03|Compose 与传统 View 混用的 12 个真实坑
android
程序员陆业聪1 天前
读者点单·02|Android 启动优化实战:Trace 抓取→Application 编排→冷启动全流程拆解
android
Coffeeee1 天前
帮你快速理解AI Agent之我想招个Android实习生
android·人工智能·agent
恋猫de小郭1 天前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter
黄林晴1 天前
告别无效重建:Gradle 9.6.0 解决 CI 构建缓存失效痛点告别无效重建:Gradle 9.6.0 解决 CI 建筑缓存失效痛点
android·gradle
张风捷特烈1 天前
Flutter 类库大揭秘#01 | path_provider架构与设计
android·flutter
_阿南_2 天前
Android文件读写和分享总结
android