listFiles()在Android 6.0模拟器上返回null

yus*_*ulx 15 android android-6.0-marshmallow

我想在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;
                    }
                });
            }
Run Code Online (Sandbox Code Playgroud)

fileNames = null!

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

在此输入图像描述

该权限已添加到AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

还有什么我能做的吗?

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

lox*_*ome 11

即使添加了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);
    }
Run Code Online (Sandbox Code Playgroud)

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

@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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

File[] possible_files = mrpDir.listFiles();
Run Code Online (Sandbox Code Playgroud)

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

与此线程的发起者一样,我正在运行API 23仿真器,因为我目前无法访问Android 6设备.所以我认为模拟器可能存在问题.但这似乎不太可能.


161*_*903 10

Android 6.0引入了Runtime权限.除了声明清单上的权限之外,还需要在运行时请求用户的权限.

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

  • 我有同样的问题在运行时从用户请求的权限.但它无法解决问题. (3认同)