Android模拟器 - Marshmallow - Sdcard挂载可写但canWrite()为false且无法写入文件

时间:2017-07-18 10:00:31

标签: android bash android-emulator android-permissions android-sdcard

tl; dr - 我有一个sdcard挂载为可写但canWrite()返回false,我无法保存文件,这是我的测试脚本的主要内容。

我编写了一个bash脚本,它在多个模拟器设置上运行我的自动化测试。我将config.ini文件复制到同一个模拟器中并重新启动它。这很好用。

在我的测试中,我拍摄截图并尝试将它们保存到模拟器的SD卡中。有时它可以而且有时它不能但模拟器之间没有一致性,也无法保存图像。

此外,我已经设法进行了一些记录,以确定各种值,这些值使我了解了我的主要观点。

if (Build.VERSION.SDK_INT >= 23) {
        int permissionStatus = context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
            System.err.println("**** permission allowed ****");
            System.err.println("**** state="+Environment.getExternalStorageState()+" ****");
            sleep(200);
            File file = new File(Environment.getExternalStorageDirectory() + "/"+filename+".png");
            System.err.println("**** fileState="+Environment.getExternalStorageState(file)+" ****");
            System.err.println("**** dir="+Environment.getExternalStorageDirectory()+" ****");
            System.err.println("**** canwrite="+Environment.getExternalStorageDirectory().canWrite()+" ****");
            System.err.println("**** file = "+file+" ****");
            mDevice.takeScreenshot(file);
        } else {
            System.err.println("**** permission not allowed ****");
        }
    }

我收到的日志如下

07-18 01:29:10.975  3411  3426 W System.err: **** permission allowed ****
07-18 01:29:10.977  3411  3426 W System.err: **** state=mounted ****
07-18 01:29:11.179  3411  3426 W System.err: **** fileState=mounted ****
07-18 01:29:11.180  3411  3426 W System.err: **** dir=/storage/emulated/0 ****
07-18 01:29:11.181  3411  3426 W System.err: **** canwrite=false ****
07-18 01:29:11.181  3411  3426 W System.err: **** file = /storage/emulated/0/mainmenu.png ****
07-18 01:29:11.197  1307  1307 E EGL_emulation: tid 1307: eglCreateSyncKHR(1881): error 0x3004 (EGL_BAD_ATTRIBUTE)
07-18 01:29:11.216  3411  3426 E UiAutomatorBridge: failed to save screen shot to file
07-18 01:29:11.216  3411  3426 E UiAutomatorBridge: java.io.FileNotFoundException: /storage/emulated/0/mainmenu.png (Permission denied)

我看到的问题是sdcard已挂载(并且它是可写的,就像它是只读的一样,然后值为mounted_ro)但在externalStorageDirectory上canWrite()为false。

这让我疯了!有没有人有任何想法?

在每个avd配置文件中,我都有这些行 hw.sdCard=yes sdcard.size=100M

2 个答案:

答案 0 :(得分:0)

从Android 6.0或> 7开始(API级别23),用户在应用运行时向应用授予权限,而不是在安装应用时授予权限。 read about this

答案 1 :(得分:0)

canWrite有时会为目录及其元素提供false。它有点飘忽不定。你能试试吗

String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
    Log.d("Test", "sdcard mounted and writable");
}
else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    Log.d("Test", "sdcard mounted readonly");
}
else {
    Log.d("Test", "sdcard state: " + state);
}