Android11起,开始了强制分区存储
下面提到的内/外部存储空间,限定在应用专属文件的范围
内部存储空间,使用 getFilesDir() 或 getCacheDir() 方法访问。比如数据库文件默认的存储位置是/data/data/packagename下对应的文件夹内;
外部存储空间,可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法,获取到的路径是sdcard根目录/Android/data/packagename/files/;
这里需要注意的是,在AS的Device File Explorer中,是可以正常看到内外部存储空间下的文件夹/文件的(前提是开了usb调试);
如果只是连接了电脑,adb device也可以查看到设备,通过adb shell,依然可以看到外部存储空间里面的内容(比如 ls -lha ),但是在电脑上的文件管理器里面是看不到里面的内容;
当targetSdkVersion >= 30的时候,想要在根目录下创建文件夹/文件的时候,需要去请求权限android.permission.MANAGE_EXTERNAL_STORAGE,在用户授予该权限后,app才可以顺利地在根目录创建文件夹/文件。
示例如下:
private fun testA() {
if (Environment.isExternalStorageManager()) {
Log.d(TAG, "testA: 有权限")
mkdirTest()
} else {
Log.d(TAG, "testA: 没有权限")
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.data = Uri.parse("package:$packageName");
startActivityForResult(intent, 1234);
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 1234) {
if (Environment.isExternalStorageManager()) {
Log.d(TAG, "onActivityResult: 有权限")
mkdirTest()
} else {
Log.d(TAG, "onActivityResult: 没有权限")
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.data = Uri.parse("package:$packageName");
startActivityForResult(intent, 1234);
}
}
}
private fun mkdirTest(){
Log.d(TAG, "=================== =====================================")
val file = File("${Environment.getExternalStorageDirectory()}/demo/")
if (!file.exists()) {
val mkdir = file.mkdir()
Log.d(TAG, "mkdirTest: mkdir = $mkdir")
}
Log.d(TAG, "mkdirTest: file[${file.absolutePath}] = ${file.exists()}")
Log.d(TAG, "=================== =====================================")
}
AndroidManifest.xml内添加权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />