【问题标题】:Cannot READ/WRITE on External Storage, even having given Permissions即使已授予权限,也无法在外部存储上读/写
【发布时间】:2020-03-05 02:27:26
【问题描述】:

在华为 Mate 20 上运行我的应用程序,以下几行:

    String ext_path = Environment.getExternalStorageDirectory().getAbsolutePath();
    File ext_folder = new File(ext_path);
    System.out.println("Path: " + ext_path + " Dir Check: " + ext_folder.isDirectory() + " Can read: " + ext_folder.canRead());

返回:“路径:/storage/emulated/0 目录检查:true 可读取:false”

但是,我已授予所有权限,并且我还将这些权限包含在清单中:

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

canRead() 不应该返回 True 吗?我无法写入或读取文件。可能是什么原因?

我也试过了:

    String extStore = System.getenv("EXTERNAL_STORAGE");
    File f_exts = new File(extStore);
    System.out.println(f_exts);
    System.out.println(Arrays.toString(f_exts.listFiles()));

我得到:“EXTERNAL_STORAGE”和“null”

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

    您需要明确要求用户授予上述权限。否则它将无法在较新的 android 版本中工作。尝试在 onCreate 中添加它

    ActivityCompat.requestPermissions(MainActivity.this, new String[]{READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE},111);
    

    还有

    如果您还以 Android Q 为目标,则 Environment.getExternalStorageDirectory() 不再导致可访问的文件夹,我认为这实际上是您的问题。它已被弃用,取而代之的是 Context.getExternalFilesDir(null) ,它返回一个文件。值得一试,因为您的应用程序外部存储应该类似于 "/storage/emulated/0/Android/data/com.example.android.YourApp/" 并且你应该有读写权限

    【讨论】:

    • 我做到了,我已经同意了。然后,从 App 属性中检查后,所有内容都允许,没有任何内容被拒绝。
    • 奇怪的是,这个“/storage/emulated/0”似乎太短了,不能成为您的应用程序目录。也许它真的取决于我不知道的设备
    • “/storage/emulated/0”是 ExternalStorageDirectory 的根(它是父级)。我的应用程序在按下按钮后尝试在上述目的地(即在“/storage/emulated/0/MyApp”)内创建一个目录(“MyApp”),但它失败了,因为它无法在根。
    • 你检查过这个吗? stackoverflow.com/questions/39462667/…
    • 这很奇怪,我从来不用“按下按钮”。通常为我的应用程序自动创建 externalstorade。我想您的应用程序无法读取根目录是正常的,否则您的应用程序将能够对您的其他应用程序数据造成严重破坏
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2021-10-31
    • 2020-06-19
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多