相关文章推荐

Android11 读写权限申请
Android11系统对应用写入权限做了严格的限制。本文介绍如何获取文件读写权限。项目中 build.gradle 的 targetSdkVersion >= 29 ,会出现读写问题。
targetSdkVersion = 29,通过设置requestLegacyExternalStorage=“true”,还能解决。
targetSdkVersion = 30后,需要申请所有文件权限才能获取到写入权限。

AndroidManifest添加权限设置

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" /><!--add 2022-2-11 Android11-->
<application
    android:requestLegacyExternalStorage="true" 

        
代码申请动态权限
1.Android 6.0之上Android11以下申请权限
 

 if (Build.VERSION.SDK_INT >= 23) {// 6.0
        String[] perms = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE};
        for (String p : perms) {
            int f = ContextCompat.checkSelfPermission(SafeKeyToolActivity.this, p);
            Log.d("---", String.format("%s - %d", p, f));
            if (f != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(perms, 0XCF);
                break;


Android11申请权限
跳转系统设置界面,用户授权获取权限。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !isRefuse) {// android 11  且 不是已经被拒绝
        // 先判断有没有权限
        if (!Environment.isExternalStorageManager()) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 1024);
// 带回授权结果
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1024 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    	// 检查是否有权限
        if (Environment.isExternalStorageManager()) {
            isRefuse = false;
            // 授权成功
        } else {
            isRefuse = true;
            // 授权失败

对于部分手机如小米手机,即使获取了所有文件的管理权限,依旧访问不到Android/data目录,如图:

尝试解决办法:

只在外部存储的应用私有目录下,用直接路径读写文件。
访问或者共享媒体文件,使用MediaStore在公共目录下读写文件
访问或者共享非媒体文件,使用系统的文件选择器SAF在公共目录Download下读写文件。
根目录下可以创建自定义文件夹、文件。

 

Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, Request_Code); 在Android 10中引入了分区储存功能,在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。其他应用无法直接访问应用的沙盒文件。由于文件是应用的私有文件,不再需要任何权限即可访问和保存自己的文件。此变更并有助于减少应用所需的权限数量,同时保证用户文件的隐私性。 目标版本targetSdkVersion设置为28或更低版本以下时,我们对外部存储空间的读写访问需要READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限。 目标版本targetSdkVer
Android中,文件的导出权限取决于文件的存储位置和文件类型。对于应用私有目录中的文件,应用具有完全的读写权限,但是其他应用无法访问。而对于共享存储目录中的文件,其他应用可以访问,但是需要申请相应的权限。下面是一些示例: 1. 应用私有目录中的文件: ```java File file = new File(getFilesDir(), "example.txt"); 应用可以读写此文件,其他应用无法访问。 2. 共享存储目录中的文件: ```java File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "example.txt"); 其他应用可以访问此文件,但是需要添加 `android.permission.READ_EXTERNAL_STORAGE` 或 `android.permission.WRITE_EXTERNAL_STORAGE` 权限。 3. 通过ContentProvider共享文件: ```java Uri uri = FileProvider.getUriForFile(this, "com.example.fileprovider", file); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_STREAM, uri); 需要在AndroidManifest.xml中添加如下内容: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> 其中,`@xml/file_paths` 是一个xml文件,用于指定共享的文件路径。
异常解决:android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow Android13适配-Google官方照片视频选择器 Android13-图片视频选择器
 
推荐文章