无法打开 android 的根文件夹
Unable to open android's root folder
我想制作一个资源管理器应用程序。举个粗略的例子,我有一个简单的文件管理器应用程序,它显示了我的 phone 的文件系统:
当我通过 USB 插入 phone 时,我从计算机的文件资源管理器中得到了相同的结果:
所以我在 AndroidManifest.xml 文件中添加了一些权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
当然我也确保向用户请求权限(虽然我不确定我是否应该也请求 Manifest.permission.WRITE_EXTERNAL_STORAGE 权限,我也希望能够写,但是授权弹出窗口没有提到 read/write,它只是要求访问存储):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), STORAGE_PERMISSION_CODE)
}
但后来我试图获取根文件夹的内容,屏幕截图上的那个,我尝试以这种方式打开几个:
Environment.getDataDirectory().listFiles() // Is null
Environment.getRootDirectory().listFiles() // Isn't the correct folder
Environment.getExternalStorageDirectory().listFiles() // Null
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).listFiles() // Null
我已经尝试了在这个要点上找到的几乎所有有趣的路径 (https://gist.github.com/lopspower/76421751b21594c69eb2),但是其中 none 给了我想要的...
尝试以下操作:
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File[] files = new File(path).listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
Log.d("FILE", "--> "+file.getName());
}
}
确保已授予存储权限,并将此行添加到您的清单中:android:requestLegacyExternalStorage="true"
在 App 标签内。
Logcat :
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Android
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> MIUI
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> dctp
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> did
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Movies
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> DCIM
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Pictures
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Download
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> WhatsApp
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> ClassicGames
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> .wallpaperboard
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> com.facebook.katana
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> FileExplorer
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> logger
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> .turing.dat
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> MicTest
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Telegram
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> IMG_20210206_210449.jpg
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> voip-data
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Music
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> CamScanner
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> .BackgroundChange
我想制作一个资源管理器应用程序。举个粗略的例子,我有一个简单的文件管理器应用程序,它显示了我的 phone 的文件系统:
当我通过 USB 插入 phone 时,我从计算机的文件资源管理器中得到了相同的结果:
所以我在 AndroidManifest.xml 文件中添加了一些权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
当然我也确保向用户请求权限(虽然我不确定我是否应该也请求 Manifest.permission.WRITE_EXTERNAL_STORAGE 权限,我也希望能够写,但是授权弹出窗口没有提到 read/write,它只是要求访问存储):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), STORAGE_PERMISSION_CODE)
}
但后来我试图获取根文件夹的内容,屏幕截图上的那个,我尝试以这种方式打开几个:
Environment.getDataDirectory().listFiles() // Is null
Environment.getRootDirectory().listFiles() // Isn't the correct folder
Environment.getExternalStorageDirectory().listFiles() // Null
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).listFiles() // Null
我已经尝试了在这个要点上找到的几乎所有有趣的路径 (https://gist.github.com/lopspower/76421751b21594c69eb2),但是其中 none 给了我想要的...
尝试以下操作:
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File[] files = new File(path).listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
Log.d("FILE", "--> "+file.getName());
}
}
确保已授予存储权限,并将此行添加到您的清单中:android:requestLegacyExternalStorage="true"
在 App 标签内。
Logcat :
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Android
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> MIUI
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> dctp
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> did
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Movies
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> DCIM
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Pictures
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Download
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> WhatsApp
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> ClassicGames
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> .wallpaperboard
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> com.facebook.katana
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> FileExplorer
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> logger
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> .turing.dat
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> MicTest
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Telegram
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> IMG_20210206_210449.jpg
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> voip-data
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> Music
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> CamScanner
2021-02-27 23:55:35.470 3285-3285/maa.abc D/FILE: --> .BackgroundChange