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
答案 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);
}