Understanding the Android 6 permission method

后端 未结 3 2190
眼角桃花
眼角桃花 2021-01-18 21:25

I am trying to take an image from Gallery and set it to an imageview but in Android 6 there are some permission problems. Below is the method to ask for the permission. Shou

3条回答
  •  梦毁少年i
    2021-01-18 22:16

    EDIT

    I have rewritted the code and posted in another answer.

    Old answer:

    Yes, you have to check and ask for permission every time.

    Usually I write the code like this:

    private int requestPermissionCode;
    private Runnable requestPermissionRunnable;
    
    private void runPermissionCode(String requestPermission, int requestCode, Runnable codeToRun) {
        if (android.os.Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
    
                requestPermissionCode = requestCode;
                requestPermissionRunnable = codeToRun;
    
                requestPermissions(new String[]{requestPermission},
                        requestCode);
            }
        } else {
            codeToRun.run();
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        if (requestCode == requestPermissionCode) {
            if (grantResults.length == 1 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                if (requestPermissionRunnable != null)
                    requestPermissionRunnable.run();
            } else {
                Toast.makeText(getActivity(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    

    and run it like this:

        runPermissionCode(Manifest.permission.READ_EXTERNAL_STORAGE, READ_CONTACTS_PERMISSIONS_REQUEST, new Runnable() {
    
            @Override
            public void run() {
                // your code here
            }
        });
    

    I am sure it is not a best way, but at least it gives a possibility to request permission and make actions easier.

提交回复
热议问题