android - listFiles() 从 Android 10(范围存储)起没有用处。需要特定目录的文件

标签 android file android-studio android-10.0 scoped-storage

我已经实现了范围存储并需要列出来自第三方应用程序的 JPEG 文件,我们将其命名为测试应用程序,该应用程序在以下两个路径中创建“测试”文件夹

  1. 在内部存储中 ->/storage/emulated/0/Test/.images
  2. 在 SD 卡中 ->/storage/sdcard1/Android/data/com.app.test/files/Test/.images

在 Android 10 上运行的红米 K20pro 中,无论范围存储如何,都会返回 .listFiles 上的 ArrayList。

但是,如果启用了范围存储,则在 Android 10 上运行的诺基亚 6.1 将返回 null;如果启用了范围存储,则返回 null

请帮助我从这两个文件夹中获取文件。

最佳答案

我设法使用listFiles() Android 10 上的文件如下:

将此权限添加到项目的 AndroidManifest.xml 文件中:

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

在此文件中,添加标志 android:requestLegacyExternalStorage="true"在您的<application>下标签。

向您的用户请求 READ_EXTERNAL_STORAGE 权限:

int PERMISSION_REQUEST = 1;

if (ActivityCompat.checkSelfPermission(this, 
    android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    String[] PERMISSIONS = {android.Manifest.permission.READ_EXTERNAL_STORAGE};
    ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_REQUEST);
}

(可选)处理请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, Do the you need to do.
                Toast.makeText(getApplicationContext(), "permission was granted", Toast.LENGTH_SHORT).show();

            } else {

                // permission denied, Disable the functionality that depends on this permission.
                Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }
    }
}

然后您可以使用 listFiles() ,例如列出手机下载目录中的文件:

File[] files = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).listFiles();
Log.i(getClass().getName(), "fileList = " + Arrays.toString(files));

关于android - listFiles() 从 Android 10(范围存储)起没有用处。需要特定目录的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62877927/

相关文章:

java - 检测带有 ARCore 的点击事件是否击中了已添加的 3d 对象

file - 如何使用 tokio::fs 复制文件

Android Studio 2.0 等待调试器

安卓模拟器 : Telnet does not show the Sensor feature in my Android Studio version (2. 2.1)

java - 按字读取文件,扫描仪

android-studio - 使用 buildSrc 时禁用 Android Studio 中的迁移到 AndroidX 按钮

java - 如何从以下响应 : mapDATA=={title=I Talk, id=5df, order_no=null, type=i_talk, is_speaker=0} 中获取值?

java - 在 Android 中使用 HttpPost 发送对象数组

java - 无法在 ubuntu 上启动 adt-bundle 来运行程序

java - 如何检查Java Eclipse 插件开发中的IFile 是否真的存在?