在 android Java 上工作,最近将 SDK 更新到 API 级别 29,现在显示一个警告,指出
Environment.getExternalStorageDirectory()在 API 级别 29 中已弃用
Environment.getExternalStorageDirectory()
我的代码是
private void saveImage() { if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { final String folderPath = Environment.getExternalStorageDirectory() + "/PhotoEditors"; File folder = new File(folderPath); if (!folder.exists()) { File wallpaperDirectory = new File(folderPath); wallpaperDirectory.mkdirs(); } showLoading("Saving..."); final String filepath=folderPath + File.separator + "" + System.currentTimeMillis() + ".png"; File file = new File(filepath); try { file.createNewFile(); SaveSettings saveSettings = new SaveSettings.Builder() .setClearViewsEnabled(true) .setTransparencyEnabled(true) .build(); if(isStoragePermissionGranted() ) { mPhotoEditor.saveAsFile(file.getAbsolutePath(), saveSettings, new PhotoEditor.OnSaveListener() { @Override public void onSuccess(@NonNull String imagePath) { hideLoading(); showSnackbar("Image Saved Successfully"); mPhotoEditorView.getSource().setImageURI(Uri.fromFile(new File(imagePath))); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.fromFile(new File(filepath)))); Intent intent = new Intent(EditImageActivity.this, StartActivity.class); startActivity(intent); finish(); } @Override public void onFailure(@NonNull Exception exception) { hideLoading(); showSnackbar("Failed to save Image"); } }); }
什么是替代方案?
使用getExternalFilesDir(), getExternalCacheDir(), or getExternalMediaDirs()(methods on Context) 代替Environment.getExternalStorageDirectory().
getExternalFilesDir()
getExternalCacheDir()
getExternalMediaDirs()
Context
或者,修改mPhotoEditor为能够使用 a Uri,然后:
mPhotoEditor
Uri
用于ACTION_CREATE_DOCUMENT获取Uri用户选择的位置,或
ACTION_CREATE_DOCUMENT
使用MediaStore、ContentResolver和insert()为Uri特定类型的媒体(例如,图像)获取 a - 请参阅此示例应用程序,该应用程序演示如何从网站下载 MP4 视频
MediaStore
ContentResolver
insert()
另外,请注意,您的Uri.fromFilewithACTION_MEDIA_SCANNER_SCAN_FILE应该在 Android 7.0+ 上与FileUriExposedException. 在 Android Q 上,只有MediaStore/insert()选项会让你的内容被MediaStore快速索引。
Uri.fromFile
ACTION_MEDIA_SCANNER_SCAN_FILE
FileUriExposedException
请注意,如果您targetSdkVersion的版本低于 30,您可以在清单android:requestLegacyExternalStorage="true"的元素中选择退出 Android 10 和 11 上的这些“范围存储”更改。 这不是一个长期的解决方案 ,因为如果您通过 Play 商店(可能还有其他地方)分发您的应用程序,您将需要在 2021 年的某个时候达到 30 岁或更高。<application> __targetSdkVersion
targetSdkVersion
android:requestLegacyExternalStorage="true"
<application>