Android文件选择SAF

1、权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 安卓10,获取MediaProjection需要在一个前台服务中进行,不给权限则无法进行镜像 -->
<!-- 文件传输 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

2、打开

private void openSAF() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT)
            .addCategory(Intent.CATEGORY_OPENABLE)
            .setType("*/*")
            .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
    if ( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N){
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
    }
    startActivityForResult(intent, RESULT_CODE);
}

3、返回读取文件

ContentResolver resolver = context.getContentResolver();
resolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
cursor = resolver.query(uri, null, null, null, null);