• 安卓文件权限总结


    对于 Android 用户来说,这是一项非常优秀的改进。自从 Android M(6) 以来,我已经遇到许多不给读写外存权限就无法使用的 App 了。结果是打开文件管理就能看到一堆乱七八糟的文件和文件夹,这对习惯自己整理存储空间的人来说太痛苦了。

    但读写外存的权限并非必要的。通过Context.getExternalFilesDir可以获取到属于 App 自身的文件路径,通常是~/Android/data//**/。在该目录中读写文件均不需要申请权限,当 App 被卸载时,该文件夹及内容也会全部删除。

    Android Q (10)中删除了READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE两项危险权限,限制 App 只能使用自己的应用空间存放文件。

    当 App 需要保存一些不能随卸载删除的文件时,需要根据存放位置动态申请新增的权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO 或 READ_MEDIA_AUDIO(分别对应系统的媒体文件夹)。 比较特殊的是 Downloads 文件夹:写入和读取自身写入的数据不需要申请权限,但想获取其他 App 存进去的文件时,必须使用系统的文件选择器,由用户选择。

    1.Android SDK低于23(Android6.0)直接在 AndroidManifest.xml中申请即可


    2.Android SDK大于23(Android6.0)、小于30(Android11)在 AndroidManifest.xml中申请,并且代码中也需要动态申请


    private void requestPermission(){
        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PERMISSION_GRANTED){//判断是否已经赋予权限
                ActivityCompat.requestPermissions(this,
                        new String[]{
                                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE
                != PERMISSION_GRANTED){
                Toast.makeText(this, "请开启存储权限", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this, "存储权限开启成功", Toast.LENGTH_SHORT).show();
            }
        }
    }

    3.Android SDK大于等于30(Android11)在 AndroidManifest.xml中申请,并且代码中也需要动态申请




            android:name=".application.MainApplication"
            android:allowBackup="true"
            android:icon="@mipmap/biao"
            android:label="@string/app_name"
            android:persistent="true"
            android:requestLegacyExternalStorage="true"
            android:sharedUserId="android.uid.system"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            android:preserveLegacyExternalStorage="true"
            android:usesCleartextTraffic="true">


    private void requestPermission(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//30
            // 先判断有没有权限
            if (!Environment.isExternalStorageManager()) {
                //跳转到设置界面引导用户打开
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, 3);
            }
        }
    }
    @SuppressLint("NewApi")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode==3){
            if (Environment.isExternalStorageManager()){
                //自己的操作
            } else {
                showToast("存储权限获取失败");
            }
        }
    }

    Manifest.permission.WRITE_EXTERNAL_STORAGE,
    Manifest.permission.READ_EXTERNAL_STORAGE,
    如果Android11及以上申请以上的读写存储权限,用户允许后,允许的只是媒体文件,并不能操作手机的文件管理(例如:创建文件到指定目录下);只有申请通过
    ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION此权限才允许操作手机中的文件管理

  • 相关阅读:
    瑞吉外卖 —— 7、手机验证码登录
    悄然而至,低/无代码的出现真能撬动传统开发的蛋糕?
    java-net-php-python-47ssm志愿者管理系统程序计算机毕业设计程序
    剑指offer常见题 - 二叉树问题(三)
    linux服务-配置ntp时间服务
    硬件设计电源系列文章-DCDC转换器布局设计
    【JavaEE初阶】计算机是如何工作的
    GZ033 大数据应用开发赛题第06套
    波生发生器的设计仿真图
    [MATLAB]:基础知识学习
  • 原文地址:https://blog.csdn.net/wanghonghongkx/article/details/132837613