【问题标题】:listFiles() returns null on Android 6.0 emulatorlistFiles() 在 Android 6.0 模拟器上返回 null
【发布时间】:2015-10-23 06:38:08
【问题描述】:

我想在 Android 6.0 模拟器上从 sdcard 读取 jpeg 文件,但文件列表返回 null。示例代码可以在我的手机上运行:

            String sdcard = Environment.getExternalStorageDirectory().toString();
            File sdcard_dir = new File(sdcard);
            if (sdcard_dir.isDirectory()) {
                File[] fileNames = sdcard_dir.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        return pathname.toString().endsWith(".jpg") ? true : false;
                    }
                });
            }

fileNames = null!

我可以使用 adb shell 列出模拟器上的图像文件:

权限已添加到AndroidManifest.xml:

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

我还能做什么?

我必须使用模拟器,因为我的设备目前无法升级到 Android 6.0,我想测试一些新的 API。

【问题讨论】:

    标签: android android-6.0-marshmallow


    【解决方案1】:

    即使添加了 Android 6.0 所需的运行时权限代码,我也观察到了完全相同的问题。

    在我的活动中,我有以下代码:

        int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
        int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                 Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_READWRITE_STORAGE);
        }
    

    当用户确认读/写存储权限请求时,我会收到预期的回调。

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions,
                                           int[] grantResults) {
        if (requestCode == REQUEST_READWRITE_STORAGE) {
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                finishCreationStep();
            }
        }
    }
    

    我已在调试器中验证已授予读取和写入权限。然而随后执行的读取存储调用失败:

    File[] possible_files = mrpDir.listFiles();
    

    对 listFiles() 的调用返回 null。如果我终止应用程序,然后转到我的应用程序的设置 > 应用程序,我会看到已授予存储权限。如果我也终止应用程序,然后重新启动它,权限就在那里,正如预期的那样,并且 listFiles() 调用工作得很好。因此,换句话说,对权限的更改在应用程序终止并重新启动之前不会生效。有没有办法让应用程序识别更改的权限,而不必让用户手动终止并重新启动它?

    与该线程的创建者一样,我正在使用 API 23 模拟器运行,因为我目前无法访问 Android 6 设备。所以我想可能是模拟器有问题。但这似乎不太可能。

    【讨论】:

    • 我也遇到了同样的问题,但是在三星GT-N7105上,好像是系统bug?
    【解决方案2】:

    Android 6.0 引入了运行时权限。除了在清单上声明权限外,您还需要在运行时向用户请求权限。

    更多信息和教程在这里:http://developer.android.com/training/permissions/requesting.html

    【讨论】:

    • 我有同样的问题。在运行时请求用户许可。但它不能解决问题。
    • 这与外部存储有关。内部存储呢?
    【解决方案3】:

    你的第一个电话

    if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                             Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_READWRITE_STORAGE);
    }
    

    是检查你是否有权限。如果您没有,则调用权限回调。这是第一次。

    随后,由于您已经拥有权限,因此不会调用回调。所以,你的代码应该是这样的

    if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                             Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_READWRITE_STORAGE);
    }
    else
        finishCreationStep();
    

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多