分区存储将存储空间分为两部分:

●  公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等

    ■ 公共目录的文件在App卸载后,不会删除
    ■ 可以通过SAF、MediaStore接口访问
    ■ 拥有权限,也能通过路径直接访问
●  应用专属目录
    ■ 应用专属目录只能自己直接访问
    ■ App卸载,数据会清除。
当您将应用更新为以 Android 11 为目标平台后,您将无法使用requestLegacyExternalStorage,而且也没有其他标记可以提供停用分区存储。

 

对于/storage/emulated/0没没有权限访问的问题进行如下解决:

1、加入文件读写、和存储管理权限 READ_EXTERNAL_STORAGE(仅照片和视频权限)  MANAGE_EXTERNAL_STORAGE(所有文件权限)  这两个都要有,没有READ_EXTERNAL_STORAGE就没有文件存储管理界面、没有MANAGE_EXTERNAL_STORAGE就没有所有文件选项,也就无法访问普通文件

 

Android 文件权限 android 文件存储权限_android

 

 

requestLegacyExternalStorage好像可有可无

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:requestLegacyExternalStorage="true"
        android:theme="@style/Theme.HelloWorld">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.HelloWorld.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

2、代码中动态获取

private static final int REQUEST_PERMISSION_CODE = 1;    
    public void requestPermission() {
        int permission_read = ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE);
        if (permission_read != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_PERMISSION_CODE) {
            Log.i(TAG, "request permission success");
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

 网上还有一种方法启动activity,这种获取了设置---隐私---权限管理----右上角特殊访问权限---所有文件访问权限

public void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (Environment.isExternalStorageManager()) {
                Log.i(TAG, "isExternalStorageManager");
            } else {
                Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivityForResult(intent, REQUEST_PERMISSION_CODE);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_PERMISSION_CODE) {
            Log.i(TAG, "request permission success");
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

 

 

3、读取相关文件

try {

                    InputStream is = new FileInputStream(new File("/storage/emulated/0/Pictures/hello.txt"));
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
                    String buffer;
                    while ((buffer = bufferedReader.readLine()) != null) {
                        Log.i(TAG, "read line:" + buffer);
                    }
                } catch (Exception e) {
                    Log.i(TAG, "error msg:" + e.getMessage());
                }