错误代码行:
我的sdcard文件夹和storage文件夹在同一目录下
storage目录:
sdcard目录:
storage文件夹里没有sdcard文件夹
File filePath = new File("/sdcard");时的报错信息(EPERM):
File filePath = new File("/storage");时的报错信息(EACCES):
尝试解决方法:
在manifest.xml文件夹中添加代码行
仍然不成功
动态获取权限:
获取权限成功,但仍然无法向SD卡中写入数据(报错提示同上)
换一种动态获取权限的代码 ,但是结果同上
可以看到我的手机是已经获取的外部存储的读写权限但是点击按钮就是无法往SD卡中写入数据
最终问题解决:
Log.i("-->"," getCacheDir = "+getCacheDir().getPath().toString());
Log.i("-->","getAbsolutePath getCacheDir = "+getCacheDir().getAbsolutePath().toString());
Log.i("-->"," getFilesDir = "+getFilesDir().getPath().toString());
Log.i("-->","getAbsolutePath getFilesDir = "+getFilesDir().getAbsolutePath().toString());
Log.i("-->"," getExternalStorageDirectory = "+ Environment.getExternalStorageDirectory().getPath());
Log.i("-->"," getExternalStorageDirectory = "+ Environment.getExternalStorageDirectory());
Log.i("-->"," getExternalStoragePublicDirectory = "+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
Log.i("-->"," getCacheDir = "+getExternalCacheDir().getPath().toString());
打印结果:I/-->: getExternalStoragePublicDirectory = /storage/emulated/0/Download
于是将文件创建目录更改为
File filePath = new File("storage/emulated/0/Download");
再次运行
数据写入成功!
问题总结:当向手机外部存储(SD卡)写入数据失败时,首先检查是否获取权限,如果权限已获取仍然报错则查看文件创建的文件路径是否正确
查看路径使用Log.i("-->"," getExternalStoragePublicDirectory = "+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
打印结果
后续:
不能通过硬编码获取路径,需要使用官方的API获取,Android11.0以前使用Environment.getExternalStorageDirectory() 获取路径,11.0以后就用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
这是我的虚拟机上的sdcard的根路径,但是不同手机厂商的根路径可能不同,所以还是要利用api来获取