Android:Environment.getExternalStorageDirectory 废弃

在Android SDK版本29以上,`Environment.getExternalStorageDirectory()`被废弃。为避免卸载应用后残留公共目录的脏数据,应改用私有存储路径。本文介绍了将图片保存至私有存储目录的方法,这样文件夹可以随应用卸载被删除,同时图片仍能在相册中显示。

使用Android SDK 版本超过29编译会发现这个方法被废弃了,解决方案是:

context.getExternalFilesDir()

-----------

比如要把图片保存到手机的指定文件夹下后,扫描更新媒体库,在相册中显示,存储路径的旧写法:

 //app调用系统相机拍照得到的照片存储的路径: /storage/emulated/0/Pictures/demox_camera

    private val outputPhotoDirectory: String by lazy {
        //路径不用根据版本区分,都一样
        "${Environment.getExternalStorageDirectory().absolutePath}/" +
                "${Environment.DIRECTORY_PICTURES}/demox_camera/"
    }

旧写法直接把照片存在了公共目录的Pictures/demox_camera下,当app卸载后,这个公共路径的文件夹不能随着卸载而删除,脏数据的留下是这个旧写法废弃的原因。

如果用了解决方案的写法:

  //app调用系统相机拍照得到的照片存储的路径: /storage/emulated/0/Android/data/com.change.demox/files/Pictures/demox_camera
    private val outputPhotoDirectory =
        //路径不用根据版本区分,都一样
       MyApplication.instance?.context?.getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath+"/demox_camera/"

解决方案的写法直接把照片文件存在了私有存储目录的Pictures/demox_camera下,如此文件夹便能随APP卸载而删除,不留脏数据,在相册中依然能成功看到图片文件,需求效果一致,仅仅是把存储的图片路径文件夹做了改变,由公共存储位置转为私有存储,下图是相机的截图,第一个【demox_camera】是/storage/emulated/0/Pictures/demox_camera 公共目录下的文件夹(内3张图片),第二个【demox_camera】是/storage/emulated/0/Android/data/com.change.demox/files/Pictures/demox_camera 私有存储中的文件夹(内1张图片)

 

7-16 22:42:50.983 1231 1231 I EngineerEnvironment: ANTIDEBUG getEngineerModeDebugDirFile 07-16 22:42:50.983 1231 1231 I EngineerEnvironment: ANTIDEBUG !TextUtils.isEmpty 07-16 22:42:50.983 1231 1231 I EngineerEnvironment: ANTIDEBUG !file.exists 07-16 22:42:50.984 1231 1231 I EngineerEnvironment: ANTIDEBUG !file.mkdirs 07-16 22:42:50.984 1231 1231 E EngineerEnvironment: /data/persist_log/engineermode/anti mkdirs failed 07-16 22:42:50.984 1231 1231 E AntiSetSettingManager: mkdirs fail, save anti set setting failed 07-16 22:42:50.984 1231 1231 D AntiSetSettingManager: saveBandSettingConfig file : /data/persist_log/engineermode/anti/anti_config/anti_touch_screen_antenna_setting.json 07-16 22:42:50.987 1231 1231 W System.err: java.io.FileNotFoundException: /data/persist_log/engineermode/anti/anti_config/anti_touch_screen_antenna_setting.json: open failed: ENOENT (No such file or directory) 07-16 22:42:50.987 1231 1231 W System.err: at libcore.io.IoBridge.open(IoBridge.java:574) 07-16 22:42:50.987 1231 1231 W System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:259) 07-16 22:42:50.987 1231 1231 W System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:147) 07-16 22:42:50.987 1231 1231 W System.err: at java.io.FileWriter.<init>(FileWriter.java:66) 07-16 22:42:50.987 1231 1231 W System.err: at com.oppo.engineermode.anti.bandsetting.BandSettingManager.saveBandSettingConfig(BandSettingManager.java:122) 07-16 22:42:50.987 1231 1231 W System.err: at com.oppo.engineermode.anti.AntiMainFragment.saveBandSetting(AntiMainFragment.java:162) 07-16 22:42:50.987 1231 1231 W System.err: at com.oppo.engineermode.anti.AntiMainFragment.-$$Nest$msaveBandSetting(AntiMainFragment.java:0) 07-16 22:42:50.987 1231 1231 W System.err: at com.oppo.engineermode.anti.AntiMainFragment$1.onInitCompleted(AntiMainFragment.java:94) 07-16 22:42:50.987 1231 1231 W System.err: at com.oppo.engineermode.anti.bandsetting.rftoolkit.RadioFrequencyTool.setOnRFStateListener(RadioFrequencyTool.java:253) 07-16 22:42:50.987 1231 1231 W System.err: at com.oppo.engineermode.anti.AntiMainFragment.onResume(AntiMainFragment.java:224) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.Fragment.performResume(Fragment.java:3206) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:658) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:302) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1663) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3247) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentManager.dispatchResume(FragmentManager.java:3179) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentController.dispatchResume(FragmentController.java:285) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentActivity.onResumeFragments(FragmentActivity.java:333) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.fragment.app.FragmentActivity.onPostResume(FragmentActivity.java:322) 07-16 22:42:50.987 1231 1231 W System.err: at androidx.appcompat.app.AppCompatActivity.onPostResume(AppCompatActivity.java:245) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.Activity.performResume(Activity.java:9249) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5379) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5437) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:57) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:225) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:107) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:81) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2697) 07-16 22:42:50.987 1231 1231 W System.err: at android.os.Handler.dispatchMessage(Handler.java:107) 07-16 22:42:50.987 1231 1231 W System.err: at android.os.Looper.loopOnce(Looper.java:232) 07-16 22:42:50.987 1231 1231 W System.err: at android.os.Looper.loop(Looper.java:317) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.ActivityThread.main(ActivityThread.java:8886) 07-16 22:42:50.987 1231 1231 W System.err: at java.lang.reflect.Method.invoke(Native Method) 07-16 22:42:50.987 1231 1231 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:681) 07-16 22:42:50.987 1231 1231 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:915) 07-16 22:42:50.987 1231 1231 W System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 07-16 22:42:50.987 1231 1231 W System.err: at libcore.io.Linux.open(Native Method) 07-16 22:42:50.987 1231 1231 W System.err: at libcore.io.ForwardingOs.open(ForwardingOs.java:563) 07-16 22:42:50.987 1231 1231 W System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:274) 07-16 22:42:50.987 1231 1231 W System.err: at libcore.io.ForwardingOs.open(ForwardingOs.java:563) 07-16 22:42:50.987 1231 1231 W System.err: at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8765) 07-16 22:42:50.987 1231 1231 W System.err: at libcore.io.IoBridge.open(IoBridge.java:560) 07-16 22:42:50.988 1231 1231 W System.err: ... 36 more
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值