强制分区存储以后想在根目录创建文件夹/文件的问题

720 阅读1分钟

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" />