在 android Java 上工作,最近将 SDK 更新到 API 级别 29,现在显示一条警告,指出
Environment.getExternalStorageDirectory()
在 API 级别 29 中已弃用
我的代码是
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");
}
});
}
对此有何替代方案?
Use getExternalFilesDir()
, getExternalCacheDir()
, or getExternalMediaDirs()
(方法上Context
) 代替Environment.getExternalStorageDirectory()
.
或者,修改mPhotoEditor
能够与Uri
, then:
-
Use ACTION_CREATE_DOCUMENT
得到一个Uri
到用户选择的位置,或
-
Use MediaStore
, ContentResolver
, and insert()
得到一个Uri
对于特定类型的媒体(例如图像) - 请参阅这个示例应用程序 https://gitlab.com/commonsguy/cw-android-q/tree/v0.4/ConferenceVideos演示了如何从网站下载 MP4 视频
另请注意,您的Uri.fromFile
with ACTION_MEDIA_SCANNER_SCAN_FILE
在 Android 7.0+ 上应该会崩溃FileUriExposedException
。在 Android Q 上,仅MediaStore
/insert()
选项将使您的内容被索引MediaStore
迅速地。
请注意,您可以在 Android 10 和 11 上选择退出这些“范围存储”更改,如果您的targetSdkVersion
低于 30,使用android:requestLegacyExternalStorage="true"
in the <application>
清单的元素。这不是一个长期的解决方案, 身为你的targetSdkVersion
如果您通过 Play 商店(或许还有其他地方)分发应用程序,则需要在 2021 年的某个时候达到 30 或更高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)