小编典典

在 API 级别 29 java 中不推荐使用 Environment.getExternalStorageDirectory()

all

在 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");
            }
       });
   }

什么是替代方案?


阅读 100

收藏
2022-08-08

共1个答案

小编典典

使用getExternalFilesDir(), getExternalCacheDir(), or
getExternalMediaDirs()(methods on Context)
代替Environment.getExternalStorageDirectory().

或者,修改mPhotoEditor为能够使用 a Uri,然后:

  • 用于ACTION_CREATE_DOCUMENT获取Uri用户选择的位置,或

  • 使用MediaStoreContentResolverinsert()Uri特定类型的媒体(例如,图像)获取 a - 请参阅此示例应用程序,该应用程序演示如何从网站下载 MP4 视频

另外,请注意,您的Uri.fromFilewithACTION_MEDIA_SCANNER_SCAN_FILE应该在 Android 7.0+
上与FileUriExposedException. 在 Android Q
上,只有MediaStore/insert()选项会让你的内容被MediaStore快速索引。

请注意,如果您targetSdkVersion的版本低于
30,您可以在清单android:requestLegacyExternalStorage="true"的元素中选择退出 Android 10 和 11
上的这些“范围存储”更改。 这不是一个长期的解决方案 ,因为如果您通过 Play 商店(可能还有其他地方)分发您的应用程序,您将需要在 2021
年的某个时候达到 30 岁或更高。<application> __targetSdkVersion

2022-08-08