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)

相关推荐
奔跑中的蜗牛6666 分钟前
一次播放器架构升级:Android 直播间 ANR 下降 60%
android
测试工坊2 小时前
Android 视频播放卡顿检测——帧率之外的第二战场
android
Kapaseker4 小时前
一杯美式深入理解 data class
android·kotlin
鹏多多4 小时前
Flutter使用screenshot进行截屏和截长图以及分享保存的全流程指南
android·前端·flutter
Carson带你学Android4 小时前
OpenClaw移动端要来了?Android官宣AI原生支持App Functions
android
黄林晴4 小时前
Android 删了 XML 预览,现在你必须学 Compose 了
android
三少爷的鞋5 小时前
Android 面试系列 | 内存泄露:从"手动配对"到"架构自愈"
android
恋猫de小郭5 小时前
什么 AI 写 Android 最好用?官方做了一个基准测试排名
android·前端·flutter
louisgeek14 小时前
Android MediatorLiveData
android
锋风1 天前
远程服务器运行Android Studio开发aosp源码
android