除非授予权限后重新启动应用程序,否则无法写入外部存储

2023-11-21

即使在运行时授予 WRITE_EXTERNAL_STORAGE 之后,应用程序也无法在 Android 6.0 上写入外部存储(我正在模拟器上进行测试);除非应用程序被终止并重新启动。

AndroidManifest.xml 中的片段

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

构建.gradle

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
    ......
    minSdkVersion 15
    targetSdkVersion 23
}

每当我需要写入外部存储(用于备份)时,我都会检查我是否有权限。

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                    getActivity().getBaseContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_RW_EXTERNAL_STORAGE);
                mPendingAction = PendingAction.Backup;
            } else {
                BackupRestoreService.startBackup(getActivity().getBaseContext());
            }

我也有以下

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d("SettingsActivity", "grantResultsLength: " + grantResults.length);
        if (requestCode == PERMISSION_REQUEST_RW_EXTERNAL_STORAGE) {
            Log.d("SettingsActivity", "grantResultsLength: " + grantResults.length);
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                switch (mPendingAction) {
                    case Backup:
                        BackupRestoreService.startBackup(getActivity().getBaseContext());
                        mPendingAction = PendingAction.None;
                        break;
                    case Restore:
                        break;
                    default:
                }

            } else {
                Toast.makeText(getActivity(),
                        "Permission denied",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

当用户授予权限时,以下代码

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), DIR_MY_PORTFOLIO);
if (!file.mkdirs())
        Log.d("Backup", "Unable to create directories");
final String outputFilename = new SimpleDateFormat("'Backup'-yyyyMMdd-hhmmss'.mpb'", Locale.US).format(new Date());
File outputFile = new File(getBackupStorageDir(), outputFilename);
Log.d("Backup", "Can write to file: " + outputFile.canWrite());
Log.d("Backup", "File exists: " + outputFile.exists());

produces

    in.whoopee.myportfolio D/Backup: Unable to create directories
    in.whoopee.myportfolio D/Backup: Can write to file: false
    in.whoopee.myportfolio D/Backup: File exists: false
    in.whoopee.myportfolio W/System.err: java.io.FileNotFoundException: /storage/09FD-2F0C/Download/My Portfolio/Backup-20151011-051318.mpb: open failed: EACCES (Permission denied)

如果在授予权限后,应用程序被终止并重新启动,则一切都会完美,并在外部存储中创建备份文件。

请建议我做错了什么。


检查权限授予成功后,在 onRequestPermissionsResult() 方法中添加以下行。

android.os.Process.killProcess(android.os.Process.myPid());

Edit:检查您是否已将目标 sdk 版本设置为 23。如果您已经这样做了,但它不起作用(或者您不想将其设置为 23),那么您可以使用此解决方案(终止应用程序进程)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除非授予权限后重新启动应用程序,否则无法写入外部存储 的相关文章

  • Android 卷页动画

    我对 Android 动画有点陌生 目前我正在开发一个故事活动 需要像 iPhone 中那样使用卷页动画 我发现 iPhone 中有一种方法可以做到这一点 但我仍然找不到在android中做的方法 所以请帮我解决这个问题 谢谢大家 谷歌代码
  • 位图背景图像应支持哪些屏幕尺寸/密度组合?

    我正在编写一个应用程序 我需要一些全屏位图背景 基于我天真的阅读支持多屏 http developer android com guide practices screens support html在 Android 文档中 为了涵盖我的
  • PopupWindow onitemclick 中的 Android Listview 在某些设备上不起作用

    我的 ListView 在 PopupWindow 内 当我显示 PopupWindow 并单击设备 ASUS K00z 中的 Listview 行时 fonepad 工作得很好 但在 HTC Z715e 中不起作用 项目单击事件未触发 1
  • 包管理器已去世

    我收到一位安装了很多应用程序的用户发来的邮件 称当我的应用程序使用以下代码收集活动信息时 他遇到了问题 getPackageManager queryIntentActivities mAinIntent 0 完整来源在这里 https g
  • 使用busybox在后台安装apk

    我可以在 root 设备上使用 busybox 在后台安装 apk 吗 我看到类似的东西 但它不起作用 process install CommandCapture command new CommandCapture 0 chmod 77
  • 在Java中测试服务器是否启动的正确方法?

    简单地查看是否可以建立与网站 服务器的连接的正确方法是什么 我想要这个用于我正在编码的应用程序 如果我的网站离线 它只会提醒我 Thanks 您可以使用 HttpURLConnection 发送请求并检查响应正文中是否有该页面特有的文本 而
  • Twowayview 滚动时自动添加内边距

    我在用双向视图 https github com lucasr twoway view在我的一个项目中 这是android的扩展回收者视图 https developer android com reference android supp
  • Android:如何让设备只运行一个应用程序?

    我有一个客户项目 我必须制作单任务 Android 设备 客户无法逃脱我公司开发的应用程序 此外 客户无法启动任何其他应用程序 而我们的应用程序会在设备启动时启动 总体而言 客户能够使用设备执行的所有操作就是运行我们的应用程序 除了 roo
  • 如何在 Picasso 中使用磁盘缓存?

    我正在使用 Picasso 在我的 Android 应用程序中显示图像 load image This is within a activity so this context is activity public void loadIma
  • android.view.InflateException:二进制 XML 文件行 #11:膨胀类 ImageView 时出错

    我只是尝试制作一个小的 android java xml 应用程序来计算游戏的分数 它给了我这个错误 Error inflateing class ImageView 有人知道解决方案吗 我实际上搜索了 ppl 说添加这个 android
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • 动态地将textView添加到线性布局中

    我在这里的某个地方读过这篇文章 但我完全迷失了 但我需要一些帮助 我的应用程序正在将列名称从 sqlite 拉入数组中 我想创建一个文本视图并为每个视图编辑文本 通过数组的大小 我记得在某处读过 您可以将 textViews 变量名称视为数
  • 该项目可能使用的 Gradle 版本不包含“compileSdkVersion()”方法

    当我尝试运行最初在 Eclipse ADT 上创建的项目时 我遇到了这个问题 Error 17 0 Gradle DSL method not found compileSdkVersion Possible causes ul li Th
  • java.net.ProtocolException:流意外结束

    我面临一个奇怪的问题 并且无法调试它 我已经实现了上传数据流的逻辑 并使用 Volley 来实现相同的功能 我在HurlStack addBodyIfExistsapi 以便可以处理 application octet stream 类型的
  • Android 媒体播放器搜索栏

    我有一个创建 播放和处理媒体播放器 只是音频 的服务 但我在主要活动中有一个搜索栏 我想自然地显示音频文件的进度并允许用户搜索到不同的位置 我花了很长时间才弄清楚 将 UI 中的搜索栏连接到服务中的媒体播放器的最佳或正确方法是什么 我将这样
  • 分离 Fragment 和删除 Fragment 有什么区别?

    在 Android 文档中碎片交易 http developer android com reference android app FragmentTransaction html我注意到两种非常相似的方法 detach and remo
  • 如果我的应用程序安装在 SD 卡上,私人数据也在那里吗?

    我假设应用程序的私有数据 例如 SharedPreferences 和 SQLite 数据库 位于手机的内部存储而不是 SD 卡上 即使应用程序本身安装在 SD 卡上 我在任何地方都找不到对此的简单明确的确认 有人可以确认一下吗 是的 私有
  • Android Jetpack Compose 尺寸随持续时间变化的动画

    如何在 Jetpack Compose 中添加内容大小更改动画的持续时间 尝试使用Modifier animateContentSize 并通过动画规格具有持续时间 但它只是突然进入或退出 没有观察到持续时间 Column Modifier

随机推荐

  • SSL 与客户端证书重新协商导致服务器缓冲区溢出

    我编写了一个 Java 客户端应用程序 该应用程序使用客户端证书通过 HTTPS 连接到 Apache Web 服务器 并向服务器执行文件的 HTTP PUT 对于小文件它可以正常工作 但对于大文件就会崩溃 Apache 服务器日志显示以下
  • Gruntwiredep:app 找不到 Bower 包

    运行后 yo ionic from https github com diegonetto generator ionic 然后启动grunt serve我有这个 Running wiredep app wiredep task Canno
  • 从数组中查找最小和最大数字,最小值始终为 0

    该程序首先询问用户要存储在数组中的元素数量 然后询问数字 这是我的代码 static void Main string args Console Write How many numbers do you want to store in
  • 系统 D-Bus 不允许使用 conf 文件打出所有权

    我正在尝试创建一个在系统总线上运行的守护程序服务 其中从该服务发送和接收的权限应该对任何人完全开放 此服务不关心安全性 当我尝试使用 QtDbus 注册服务 使用 PyQt 时 出现以下错误 Connection 1 0 is not al
  • NPE 在 JAX-RS 中抛出编组实体

    我有一个使用 JPA 实体类的 JAX RS Web 服务 我有一个这样的资源类 Path entity public class MyEntityResource GET Produces MediaType APPLICATION XM
  • 这个成员指针语法是什么?

    include
  • 如何编写 bash 脚本来在进程终止时重新启动该进程?

    我有一个 python 脚本 它将检查队列并对每个项目执行操作 checkqueue py while True check queue do something 如何编写一个 bash 脚本来检查它是否正在运行 如果没有 则启动它 大致如
  • 从 NSURL 转换为 NSURLRequest 时丢失 /

    我正在我的 iPhone 应用程序中执行 HTTP Post 我发送到服务器的参数之一是 URL 问题是 当我从 NSURL 转换为 NSURLRequest 时 字符串http www slashdot org变为 http www sl
  • jquery 父容器的宽度

    如何设置 DOP ThumbnailGallery Container 以具有父容器的宽度 DOP ThumbnailGallery Container Container width Container width 我尝试了这种方式 但它
  • 将字符串数组转换为向量的最佳方法?

    正如标题所示 将字符串数组转换为向量的最佳方法是什么 Thanks 调用使用现有集合 在本例中为数组 的 Vector 构造函数来初始化自身 String strings Here Are Some Strings Vector
  • 从字符串中删除多个单词的更好方法?

    bannedWord Good Bad Ugly def RemoveBannedWords toPrint database statement toPrint for x in range 0 len database if banne
  • 基于范围的 for 循环可以在一定范围内工作

    如果我有范围 两个迭代器对 有没有一种方法可以为使用范围而不是原始数组或容器编写 for every 循环 像这样的东西 auto rng std equal range v begin v end 1984 for const auto
  • 如何阻止 jQuery UI 选项卡内的 SWF 重新加载

    我在 jQuery UI 选项卡中有一个 SWF 影片 我遇到的问题是 每次我从该选项卡单击到另一个选项卡 然后单击返回时 SWF 都会重新加载 我可以检查 DOM 并看到当我单击离开时包含 SWF 的 div 仍然在 DOM 中 所以我不
  • 如何以相对方式使用 setwd?

    我们的团队在 git 存储库中使用 R 脚本 这些脚本在 Mac 和 Windows 有时还有 Linux 机器上的多人之间共享 这往往会导致脚本顶部出现一堆非常烦人的行 如下所示 path lt C data work project a
  • 本地安装的 TTF 会覆盖 Google 字体

    我正在使用 Google Fonts 中的 Ubuntu 字体 我的样式表 body font family ubuntu arial 它可以工作 但如果安装同名的字体 Ubuntu 它会覆盖 Google Fonts 中的字体 是否可以强
  • 何时使用 MySQLdb 关闭游标

    我正在构建一个 WSGI Web 应用程序 并且有一个 MySQL 数据库 我正在使用 MySQLdb 它提供用于执行语句和获取结果的游标 获取和关闭游标的标准做法是什么 特别是 我的光标应该持续多长时间 我应该为每笔交易获取一个新的游标吗
  • XNA Alpha 混合使纹理的一部分透明

    我想做的是在 XNA 中使用 alpha 混合来使绘制的纹理的一部分透明 例如 我将屏幕清除为某种颜色 比如说蓝色 然后我画一个红色的纹理 最后 我绘制一个纹理 该纹理只是从中心完全透明到边缘完全黑色的径向渐变 我想要的是之前绘制的红色纹理
  • 如何在 iOS 上使用 Google Drive API 处理电子表格

    我正在尝试编写一个 iPhone 应用程序 将其数据库存储在 Google 电子表格中 我按照 DrEdit 的例子here它使用 Drive API 将纯文本文件读取 写入 Google Drive 我正在尝试修改示例应用程序以使用电子表
  • 编程理论:解决迷宫

    解决迷宫问题有哪些可能的方法 我有两个想法 但我认为它们不是很优雅 基地情况 我们有一个矩阵 这个矩阵中的元素以一种代表迷宫的方式排序 有一个入口 一个出口 我的第一个想法是派一个机器人穿过迷宫 跟随一侧 直到走出迷宫 我认为这是一个非常缓
  • 除非授予权限后重新启动应用程序,否则无法写入外部存储

    即使在运行时授予 WRITE EXTERNAL STORAGE 之后 应用程序也无法在 Android 6 0 上写入外部存储 我正在模拟器上进行测试 除非应用程序被终止并重新启动 AndroidManifest xml 中的片段