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

有什么替代方案?

推荐答案

使用getExternalFilesDir()getExternalCacheDir()getExternalMediaDirs()(Context上的方法),而不是Environment.getExternalStorageDirectory().

或者,修改mPhotoEditor以使用Uri,然后:

  • 使用ACTION_CREATE_DOCUMENTUri移动到用户 Select 的位置,或

  • 使用MediaStoreContentResolverinsert()获得特定类型媒体(例如图像)的Uri-参见this sample app,其中演示了如何从网站下载MP4视频

另外,请注意,您的ACTION_MEDIA_SCANNER_SCAN_FILEUri.fromFile应该会在安卓7.0+版FileUriExposedException版上崩溃.在Android Q上,只有MediaStore/insert()选项才能让你的内容被MediaStore快速索引.

请注意,如果您的targetSdkVersion低于30,您可以在 list 的<application>元素中使用android:requestLegacyExternalStorage="true",从而在Android 10和11上 Select 退出这些"作用域存储"更改.This is not a long-term solution,因为如果您通过Play Store(可能还会在其他地方)分发您的应用程序,那么在2021年的某个时候,您的targetSdkVersion将需要达到30或更高.

Android相关问答推荐

如何在Android Emulator上从物理设备接收TCP消息

约束布局:垂直链中的视图应将内容包裹到空间的1/3

如何在Android Studio中将我的Java-库&库设置为Kotlin库

为什么柱子的高度不都一样?

如何在DownloadManager Android中显示ProgressBar和Complete Listener

如何在android库中关联应用程序链接?

看不到选项菜单栏

如何在这段代码android jetpack compose中实现全屏滚动

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

围绕动态大小的内容包装 Jetpack Compose Row?

了解 Compose 声明性逻辑

Jetpack Compose 部分或开放侧边框

根据 Jetpack Compose 中的生命周期正确处理变量/函数

如何在 Compose 中使用合并的单元格创建网格视图?

Android 自动分页如何与 media3 配合使用?

Compose `Icons.Outlined.Star` 没有概述

使用 Jetpack Compose 时,如何以简单的方式在 Color.kt 中定义 colored颜色 ?

IconButton 中可绘制的图标是黑色的,尽管它是白色的

Jetpack 组合和片段

如何在stroke android drawable中设置渐变