首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MANAGE_EXTERNAL_STORAGE和requestLegacyExternalStorage解决EACCES (权限被拒绝)问题

使用MANAGE_EXTERNAL_STORAGE和requestLegacyExternalStorage解决EACCES (权限被拒绝)问题
EN

Stack Overflow用户
提问于 2022-03-11 13:03:16
回答 1查看 102关注 0票数 0

如果您在文件权限方面有问题,下面的解决方案在API 27、29和30上适用于我。我还没有尝试使用28,但我认为它也适用于28,因为文件访问权限与API版本29不同。

EN

回答 1

Stack Overflow用户

发布于 2022-03-11 13:03:16

AndroidManifest.xml

代码语言:javascript
复制
<manifest
  ...
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="29"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="29"/>
  <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
  ...
  <application
    ...
    android:requestLegacyExternalStorage="true"
    >
  ...
  </application>

</manifest>

main.java

代码语言:javascript
复制
private static final int PERMISSIONS_REQUEST_CODE = 1240;
private ArrayList<String> appPermissions;
private  ActivityResultLauncher<Intent> permissionLauncher;

private void checkPermissionsGranted() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        if ( !Environment.isExternalStorageManager() ) {
            requestPermission();

        } else {
            // app has permissions, init app
            initApp();
        }

    } else {
        // older API-Versions
        checkAndRequestPermissions();
    }
}


private void requestPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        permissionLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(), result -> {
                    if (result.getResultCode() == Activity.RESULT_OK) {
                        // app has permissions, init app
                        initApp();

                    } else {
                        //permission is denied
                        finish();
                    }
                });
        try {
            Intent intent = new Intent(android.provider.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, AppConstants.STORAGE_PERMISSION_CODE);
            permissionLauncher.launch(intent);
        } catch (Exception e) {
            Log.e(TAG, "Exp... " + e.toString());
            Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
            permissionLauncher.launch(intent);
        }
    }
}

public void checkAndRequestPermissions(){

    // check which permissions are granted
    List<String> listPermissionsNeeded = new ArrayList<>();

    for (String perm:appPermissions){
        if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED){
            listPermissionsNeeded.add(perm);
        }
    }

    // ask for non-granted
    if (!listPermissionsNeeded.isEmpty()){
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), PERMISSIONS_REQUEST_CODE);

    } else {
        // app has all permissions, init app
        initApp();
    }
}

private void initApp() {
    /**
     * TODO
     * */
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSIONS_REQUEST_CODE) {
        HashMap<String, Integer> permissionResults = new HashMap<>();
        int deniedCount = 0;

        for (int i = 0; i < grantResults.length; i++) {
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                permissionResults.put(permissions[i], grantResults[i]);
                deniedCount++;
            }
        }

        if (deniedCount == 0) {
            // app has all permissions, init app
            initApp();

        } else {
            // denied
            for (Map.Entry<String, Integer> entry : permissionResults.entrySet()) {
                String permName = entry.getKey();
                int permResult = entry.getValue();

                // permission is denied (this is first time, when "newer ask again" is not checked)
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, permName)) {
                    // show dialog
                    new MaterialAlertDialogBuilder(MainActivity.this)
                    .setTitle("Title")
                    .setMessage(getString(R.string.confirmation_permissions))
                    .setPositiveButton(getString(R.string.confirm_permissions_ok), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            checkAndRequestPermissions();
                        }
                    })
                    .setNegativeButton(getString(R.string.confirm_permissions_cancel), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // finish App
                            finish();
                        }
                    })
                    .show();

                } else {
                    //permission is denied ("newer ask again" is checked)
                    finish();
                }
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71438946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档