Android Q中无法访问存储

3

尽管我具有读写权限,但我无法在Android 10中访问sdcard。这是我列出所有目录的方法。

        File root = new File("/mnt/sdcard/");

        File[] subFiles = root.listFiles();

        for(File file : subFiles)    {
            if(file.isDirectory())  {
                String str = text.getText().toString() + "\n";
                str+=file.getAbsolutePath();
                text.setText(str);
            }
        }

如果我使用 /mnt/ 而不是 /mnt/sdcard/,我可以看到其中列出了 sdcard 目录,但是当我使用 /mnt/sdcard/ 时,subFilesnull。我不知道这是关于新的安卓10版本的问题还是模拟器存在问题。我一直在使用安卓工作室的默认模拟器进行调试。

1
安卓10使用作用域存储,请在此处阅读更多信息: https://developer.android.com/training/data-storage/files/external-scoped - Pemba Tamang
@PembaTamang 谢谢。我从你的建议中阅读了有关作用域存储的文档,并解决了我的问题。 - Alif Hasnain
1
请勿假定sdcard的位置为/mnt/sdcard。它会因为不同的OEM而有所变化。这段代码可能还存在其他问题,但也是由于此原因而出现故障。 - Gabe Sechan
有没有默认位置可以导航到SD卡?@Gabe Sechan - Alif Hasnain
1个回答

9

这是一个临时解决方案。从Android 11开始必须使用Scoped Storage。

问题出在清单文件中 requestLegacyExternalStorage 没有被设置为 true。由于默认情况下在Android 10或更高版本中对外部存储进行了作用域访问,因此它被设置为 false。在 AndroidManifest.xml 中添加这行代码解决了我的问题。

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10 or higher. -->
  <application 
       android:requestLegacyExternalStorage="true" ........ >
    ......
  </application>
</manifest>

2
不要将其视为长期解决方案。此功能预计将在下一个Android版本中被删除。 - Simon
你可以使用这个属性,但是当应用程序被卸载时,文件名仍然存在,但是文件内的数据已经被卸载。 - Ucdemir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接