美文网首页
Android 11访问外部文件,又增加额外权限,需要另外申请A

Android 11访问外部文件,又增加额外权限,需要另外申请A

作者: 静候良机 | 来源:发表于2022-07-10 11:57 被阅读0次

    Android 陈芝麻烂谷子,屁事儿真多,提高版本,就会增加额外的权限;原有的项目,莫名其妙的就运行时发生崩溃;

    从发展的角度,Android的确越来越完善,但是这期间,新老版本的升级和过渡,对开发者确实不是很好友的,尤其是对于新手,需要考虑的事情太多,对老版本项目的理解,更是困难;

    Android 11
    如果需要支持Android 11(targetSDKVersion 30),那么就需要在AndroidManifest.xml中下列权限

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

    对于Android 10,还有设置

    android:requestLegacyExternalStorage="true"
    

    下面的方法是检查权限是否已授权或拒绝

    private boolean checkPermission() {
        if (SDK_INT >= Build.VERSION_CODES.R) {
            return Environment.isExternalStorageManager();
        } else {
            int result = ContextCompat.checkSelfPermission(PermissionActivity.this, READ_EXTERNAL_STORAGE);
            int result1 = ContextCompat.checkSelfPermission(PermissionActivity.this, WRITE_EXTERNAL_STORAGE);
            return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
        }
    }
    

    下面的方法可以用于在Android 11及较低版本申请权限:

    private void requestPermission() {
        if (SDK_INT >= Build.VERSION_CODES.R) {
            try {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.addCategory("android.intent.category.DEFAULT");
                intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
                startActivityForResult(intent, 2296);
            } catch (Exception e) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivityForResult(intent, 2296);
            }
        } else {
            //below android 11
            ActivityCompat.requestPermissions(PermissionActivity.this, new String[]{WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
        }
    }
    

    Android 11及更高版本,处理权限回调

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 2296) {
            if (SDK_INT >= Build.VERSION_CODES.R) {
                if (Environment.isExternalStorageManager()) {
                    // perform action when allow permission success
                } else {
                    Toast.makeText(this, "Allow permission for storage access!", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    

    Android 11以下版本,处理权限回调

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0) {
                    boolean READ_EXTERNAL_STORAGE = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean WRITE_EXTERNAL_STORAGE = grantResults[1] == PackageManager.PERMISSION_GRANTED;
    
                    if (READ_EXTERNAL_STORAGE && WRITE_EXTERNAL_STORAGE) {
                        // perform action when allow permission success
                    } else {
                        Toast.makeText(this, "Allow permission for storage access!", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
        }
    }
    

    注意:MANAGE_EXTERNAL_STORAGE是特殊权限,只有少数应用才被允许,比如反病毒、文件管理等。在上架应用市场时,可能需要说明原因。

    相关文章

      网友评论

          本文标题:Android 11访问外部文件,又增加额外权限,需要另外申请A

          本文链接:https://www.haomeiwen.com/subject/mwewbrtx.html