Environment.getExternalStorageDirectory() 在 API 级别 29 java 中已弃用

2024-02-22

在 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(使用前将#替换为@)

Environment.getExternalStorageDirectory() 在 API 级别 29 java 中已弃用 的相关文章

  • SugarORM 错误或缺少数据库

    我尝试让 Android 项目与 SugarORM 一起使用 但是 我遇到了以下错误 引起原因 android database sqlite SQLiteException 没有这样的表 DOCUMENT 代码1 编译时 INSERT O
  • 当用户快速滚动时,如何延迟列表适配器中视图的加载

    我的列表视图中有从互联网下载的图像 我想在 getView 中添加一些内容 以便在用户快速滑动 滚动时它不会下载图像 我怎样才能开始这样做呢 您可以按照以下步骤延迟 ListView 中视图的加载 首先 你应该让你的ListView对象和Y
  • Android Studio Profiler 中显示“无可调试进程”

    当我尝试在 Android Studio 中使用探查器时 我能够看到已连接的设备 但在探查器中收到 无可调试进程 有人可以帮助我为什么我收到 不可调试的进程 吗 您可以尝试以下任意 全部操作 使缓存失效并重新启动Android Studio
  • Dagger 2 不会注入我的对象,但可以从组件中获取

    我有我的组件 GithubListActivityScope Component modules GithubListActivityModule class GlideActivityModule class public interfa
  • SQLite 中的 where 子句在 android 中不起作用:(

    当尝试在 SQLite 中查询某些数据时 我遇到了一个恼人的错误 这是我的代码 Cursor cursor db query TABLE IMAGES new String id name compareToThis null null n
  • 如何在从另一个活动调用一个活动时延迟一些?

    我有一个应用程序 其中我正在接收包含他的位置的短信 收到短信后 它会调用另一个活动来启动并将该位置传递给该活动以将其绘制在地图上 在调用第二个活动之前 它会显示一个类似于通知的吐司在屏幕上 但由于调用第二个活动 吐司没有出现 我的问题是我们
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 在android中点击地图获取坐标

    我正在尝试做这样的事情 我有一个地图活动 当用户点击地图时 它会显示该位置的坐标 我已经重写了 onclick 方法 但它甚至没有被调用 任何想法 public class MapPoint extends MapActivity impl
  • 某些设备上的启动画面扭曲

    我在修复 Android 上的启动画面扭曲问题时遇到问题 我正在使用 React Native 请注意 这种情况仅发生在某些设备上 例如 我有一台 Android 版本为 4 2 2 的三星 启动画面不扭曲 而 Android 版本为 8
  • ArgumentMatchers.any 不得为 null

    我正在尝试测试ViewModel以确保实时数据得到正确更新 然而使用时ArgumentMatchers any 它失败了IllegalStateException saying ArgumentMatchers any mViewModel
  • 对超类方法的调用应该是第一个语句吗?

    语音识别的结果可以在onActivityResult int requestCode int resultCode Intent data 方法 如图这个例子 http developer android com resources sam
  • 如何从我的android联系人列表中的人名获取电话号码

    我想从我的联系人列表中的人名中获取他的电话号码 我已经使用了下面的代码 但它不能正常工作 告诉我我哪里错了 try cursor company getContentResolver query ContactsContract Data
  • android 销毁时是否有任何视图回调?

    我有一个自定义视图组件 我在片段或活动中使用了它 我想知道当它从片段 活动中销毁时是否有回调 View 没有回调 除了finalize 但我不认为这就是你所要求的 查看有onDetachedFromWindow 当它从屏幕上移除时 但这与它
  • 等待视图通过 IdleResource 变得可见

    我正在使用 Espresso 2 2 编写仪器测试 我想测试的流程 测试点击的单选按钮 onClick 向 API 发起请求 每次不同时间我收到回复后 积极响应触发活动中调用的接口方法 onRequestSuccess 我正在屏幕上显示名为
  • 按歌曲获取封面图片

    是否可以按歌曲而不是按专辑获取封面图片 因为我有一张自编的歌曲专辑 而且它们都有不同的封面图片 但是当我想查询它们时 我总是得到相同的图片 String ARG STRING MediaStore Audio Media ALBUM ID
  • 将字节数组保存为 Android 设备文件夹中的 jpg 文件

    我正在尝试将图像保存在 Android 设备的文件夹中 我使用的代码如下 var newFolder AndroidEnvironment GetExternalStoragePublicDirectory AndroidEnvironme
  • 协程中未捕获异常

    我似乎无法在协程中完成错误处理 我读了很多文章并且异常处理文档 https kotlinlang org docs reference coroutines exception handling html exception propaga
  • 如何将 SD 卡图像添加到 coverflow?

    Here is my coverflow with drawables This is my Image Adapter Code The Constant IMAGE RESOURCE IDS private static final L
  • 如何以编程方式设置带有密码的屏幕锁定?

    有没有人可以帮我设置密码以锁定屏幕 谢谢 在您的应用程序中使用此代码 它对我有用 DevicePolicyManager devicePolicyManager DevicePolicyManager getSystemService Co
  • 什么是 Android DecorView?

    http developer android com reference android view Window html getDecorView http developer android com reference android

随机推荐

  • 当按下 Enter 键时,如何根据具有焦点的文本框触发按钮单击事件?

    我有一个带有几个提交按钮的表单 我希望根据当前具有焦点的文本框按下 Enter 键时触发按钮的单击事件 我可以使用下面的代码指定一个按钮 方法是将 onkeydown 事件添加到页面正文并检查 Enter 的 keyCode 我假设可以修改
  • 为什么应该重用 XmlHttpRequest 对象?

    据我了解 尽可能重用 XmlHttpRequest 对象是最佳实践 不幸的是 我很难理解为什么 看来 通过尝试重用 XHR 对象 您会增加代码复杂性 并引入可能的浏览器不兼容 http keelypavan blogspot com 200
  • WPF 列表框 SelectionChanged 事件

    我的列表框有问题 当我在程序中单击一个 ListBoxItem 时 我想更改 打开窗口并在之前对其进行预排序 但问题是它首先触发事件 然后更改选择 代码 private void LB Playlist SelectionChanged o
  • 在 HTML5 视频中突出显示播放器搜索栏

    我的 HTML5 视频播放器有一个定制的搜索栏 但我需要突出显示搜索栏的一些预定义部分 例如秒2 5 and 7 8 我怎样才能做到这一点 基本上 我需要它是这样的 到目前为止 这是我的简单代码
  • lumen:全新安装时找不到 App\Http\Controllers\Controller 类

    我正在与一个全新安装Lumen 构建 Web API 的大部分内容都可以工作 但是当我尝试使用路由器指向一个类时 我收到此错误 Fatal error Class App Http Controllers Controller not fo
  • 仅当属性发生更改时才更新用户的属性

    我的项目最初的 运行良好的版本如下所示 1 用户填写表单 新操作 并点击提交 创建操作 2 用户被重定向到他们的编辑页面 编辑操作使用模型创建的edit id 而不是Rails自动生成id 这显示用户已经提交的信息 3 用户可以选择更改信息
  • 获取为 ON DUPLICATE KEY UPDATE 多次插入插入的行数?

    我有一个非常大的表 主键为BINARY 20 该表大约有 1700 万行 每小时 一个 cron 作业会尝试使用以下命令将多达 50 000 个新条目插入到该表中 ON DUPLICATE KEY UPDATE syntax cronjob
  • 删除 Google Cloud 项目中的所有资源

    我的一个项目包含许多资源 这些资源是从不同来源创建的 意味着一些来自 Deployment Manager API 一些来自用户的控制台 我需要删除所有资源无需删除 关闭 项目在这种情况下 是否有任何 API 端点可以删除该项目中的所有资源
  • Firebase云功能:无法从文件中读取凭据

    由于新的 Firebase Cloud Functions 版本 gt 1 0 我只需要打电话 admin initializeApp 没有任何参数 但是 当我这样做然后运行 firebase deploy only functions 时
  • 通过索引检索 DataView 中的行

    我有一个 DataView 它已按某种顺序排序 如何使用索引检索值 像这样的事情 if dv rows 0 name xxx do something else something else 你试过了吗 DataRowView rowVie
  • 减去随机数[重复]

    这个问题在这里已经有答案了 我正在制作一个游戏 用户必须解决一个简单的减法 但结果必须是正整数 我设法做了所有事情 但由于某种原因 答案有时是否定的 我不知道如何解决它 import java util Random import java
  • 垂直滚动条绝对位置

    有没有办法让跨浏览器垂直滚动条具有绝对位置 我的问题是 滚动条在出现时会改变我网站的宽度 从而在布局中给出一些问题 我不想删除它 我只是想让它的宽度不干扰我的布局 Thanks 仅在 Safari 和 Chrome 即 Webkit 中 您
  • 如何验证JWT签名?

    我想使用 Go AppEngine 后端对 Android 用户进行身份验证 我可以通过以下方式轻松在 Android 中获取 ID 令牌http android developers blogspot co il 2013 01 veri
  • 减少大型 JavaScript 操作对客户端的明显延迟的方法

    作为 Chrome 扩展的一部分 我对文档结束事件中的许多 最多 3000 个 元素执行一些正则表达式替换 在最坏的情况下 在相当不错的 PC 上的 Chrome 34 0 1847 116 m 中 该操作可能需要 gt 180 秒才能完成
  • java中如何在多个类中使用一个接口?

    我有 1 个 Activity 和 2 个 Fragment 我想要在活动发生火灾时listener receivePreview obj then 执行 OneFragment gt receivePreview 执行 TwoFragme
  • NodeJS HTTP 请求 POST ERROR 套接字挂起

    您好 我在给定大量 json 对象数组的 NodeJS 上执行 HTTP 请求时遇到问题 给定小数组 json 对象 该请求工作正常 但是 如果我尝试增加 json 数组的大小 我收到错误 套接字挂起 error code ECONNRES
  • 当鼠标悬停在嵌入的 iframe 上时防止父页面滚动

    无需限制 iframe 内的滚动或需要专门命名可滚动元素 我有一个类似谷歌地图的小部件 可以以 iframe 嵌入代码的形式嵌入到第三方网站中 当人们在我的小部件上使用鼠标滚轮时 我只想滚动小部件的内容而不是父页面 我的问题类似于如何在滚动
  • 如何向 Watson 对话响应添加操作?

    我已经毫无问题地创建了意图 实体和对话 但现在我正在尝试做到这一点 以便当用户发送 再见 时 应用程序将关闭 根据该文档 我必须命名一个与意图相关的操作 我怎么做 是通过代码还是通过对话工作区平台 您可以使用context variable
  • 员工 ID 自动生成,带前缀

    我很困惑我希望员工 ID 是自动生成的前缀格式 我知道这可能是在 sql server 中触发之前发生的 我正在关注帖子http www aspdotnet suresh com 2012 04 set custom auto genera
  • Environment.getExternalStorageDirectory() 在 API 级别 29 java 中已弃用

    在 android Java 上工作 最近将 SDK 更新到 API 级别 29 现在显示一条警告 指出 Environment getExternalStorageDirectory 在 API 级别 29 中已弃用 我的代码是 priv