Android11及以上文件读写权限申请详细介绍

目录
  • Android11 读写权限申请
  • AndroidManifest添加权限设置
  • 代码申请动态权限
  • Android11申请权限
  • 补充:Android 11 及以上申请外部存储权限
  • 总结

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下读写文件。

根目录下可以创建自定义文件夹、文件。

补充:Android 11 及以上申请外部存储权限

升级 targetSdkVersion

android
    defaultConfig {
        targetSdkVersion 30
    }
}

添加清单权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

代码动态申请

public final class PermissionActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1024;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestPermission();
    }

    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // 先判断有没有权限
            if (Environment.isExternalStorageManager()) {
                writeFile();
            } else {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                startActivityForResult(intent, REQUEST_CODE);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 先判断有没有权限
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                writeFile();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            }
        } else {
            writeFile();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                writeFile();
            } else {
                ToastUtils.show("存储权限获取失败");
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (Environment.isExternalStorageManager()) {
                writeFile();
            } else {
                ToastUtils.show("存储权限获取失败");
            }
        }
    }

    /**
     * 模拟文件写入
     */
    private void writeFile() {
        ToastUtils.show("写入文件成功");
    }
}

总结

到此这篇关于Android11及以上文件读写权限申请的文章就介绍到这了,更多相关Android11文件读写权限申请内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

    对Android的SD卡进行读取权限设置时: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 结果报错: 依然提示我没有权限,于是百度说是版本问题,23.0版本(笔者的版本是25.0)以上的

  • Android申请相机权限和读写权限实例

    开发一个相机应用,需要申请三个权限:相机.读文件.写文件. 1.在AndroidManifest.xml中添加 <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name

  • android检测SD卡读写权限方法

    一.解析 做项目遇到了一个棘手的问题,SD卡的读写权限问题. 1.android版本在6.0以上版本时,以下代码才有用: if (Build.VERSION.SDK_INT >= 23) { UiUtils.getInstance().showToast("1"); //减少是否拥有权限checkCallPhonePermission != PackageManager.PERMISSION_GRANTED int checkCallPhonePermission = Conte

  • Android11及以上文件读写权限申请详细介绍

    目录 Android11 读写权限申请 AndroidManifest添加权限设置 代码申请动态权限 Android11申请权限 补充:Android 11 及以上申请外部存储权限 总结 Android11 读写权限申请 Android11系统对应用写入权限做了严格的限制.本文介绍如何获取文件读写权限.项目中 build.gradle 的targetSdkVersion >= 29 ,会出现读写问题. 当targetSdkVersion = 29,通过设置requestLegacyExterna

  • Android11文件管理权限申请详细介绍

    目录 Android 11文件管理权限申请 Android 11和低版本的存储权限结合 工具类封装 Android 11申请管理所有文件权限的Bug Android 11文件管理权限申请 Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDcard根目录写文件,Android 11之后要使用分区存储,但是分区存储使用起来很麻烦,所以可以申请文件管理权限,这样就可以随意读写SDcard了,写到根目录也没问题. 清单文件声明如下: <?xml ver

  • Linux 文件权限的详细介绍

    Linux 的优秀之处就在于它的多用户.多任务的系统.Linux 一般将文件可存取访问的身份分为 3 个类别,分别是 owner.group.others,且 3 种身份各有 read.write.execute 等权限. 权限的三种身份 文件所有者(owner) 用户级别的文件权限,通常为文件的创建者,可以通过 chown 修改文件所有者. 用户组(group) 如果把用户组比作团队,用户就是其中的成员,团队中的队员对于该文件都有相同的权限.可以通过 chgrp 修改文件的用户组. 用户组最有

  • Linux系统下如何查看及修改文件读写权限

    查看文件权限的语句: 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是类型 中间那三个 rw- 代表的是所有者(user) 然后那三个 rw- 代表的是组群(group) 最后那三个 r-- 代表的是其他人(other) 然后我再解释一下后面那9位数: r 表示文件可以被读(read) w 表示文件可以被写(write) x 表示文件可以被执行(如果它是程序的话)

  • .h和.cpp文件的区别(zt)详细介绍

    因刚接触VC++的开发,需要对C++一些原理性的东西进行掌握.特别是对源文件和头文件的概念,需要深入对它了解: 关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话, 就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上 就可以分别放在一个单元,也就是cpp里面) 那么就是一个

  • Bash中文件描述符的详细介绍

    前言 Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是可以改变的,比如将其改成其他文件,这样的话想read等命令就会默认从相应的文件读取数据了. 简单地说,一个文件描述符可以和一个文件挂钩,一旦挂钩就可以通过取地址运算符&获得该文件的句柄,比如&0就可以获得STDIN设备在内存中的句柄(设备在系统中也被当

  • ASP.NET中Web.config文件的层次关系详细介绍

    Web.config 是一个基于 XML 的配置文件,该文件的作用是对应用程序进行配置,比如规定客户的认证方法,基于角色的安全技术的策略,数据绑 定的方法,远程处理对象等. 可以在网站的根目录和子目录下分别建立自己的 Web.config 文件,也可以一个Web.config 文件都不建立,Web.config 并不是网站必备的文件.这是因为服务器有一个总 的配置文件,名为"Machine.config" ,默认安装在"C:\Windows\Microsoft.NET\ Fr

  • C#文件后缀名的详细介绍

    .sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文件,创建应用程序所需的引用.数据连接.文件夹和文件的信息. .aspx:Web 窗体页由两部分组成:视觉元素(HTML.服务器控件和静态文本)和该页的编程逻辑.Visual Studio 将这两个组成部分分别存储在一个单独的文件中.视觉元素在.aspx 文件中创建. .ascx:ASP.NET的用户控件(也叫做"pagelets"),是作为一种封装了特定功能和行为(这两者要被用在W

  • Android 6.0权限申请详解及权限资料整理

    在android 6.0开始,部分的权限需要我们动态申请,也就是说当我们的打开app的时候系统不会主动像您申请app所需要的部分权限,需要客户在使用app的时候主动的去申请. 一.权限的申请两步骤: 1.权限申请: /** * @param permissions需要申请的权限 * @param requestCode申请回调code */ public static void requestPermissions(final @NonNull Activity activity,final @

  • 深入解读Python如何进行文件读写

    open Python提供了非常方便的文件读写功能,其中open是读写文件的第一步,通过open读写文件的方式和把大象装冰箱是一样的 f = open("test.txt",'w') #第一步,把冰箱门(文件)打开 f.write("this is content") #第二步,把大象(文件内容)装进去 f.close() #第三步,把冰箱门关上,否则大象可能会跑掉 open的定义方式为 file=open(path,mode='r',buffering=-1,en

随机推荐