Android marshmallow request permission?

后端 未结 24 2053
無奈伤痛
無奈伤痛 2020-11-21 06:40

I am currently working on an application that requires several \"dangerous\" permissions. So I tried adding \"ask for permission\" as required in Android Marshmallow(API Lev

24条回答
  •  渐次进展
    2020-11-21 07:18

    I went through all answers, but doesn't satisfied my exact needed answer, so here is an example that I wrote and perfectly works, even user clicks the Don't ask again checkbox.

    1. Create a method that will be called when you want to ask for runtime permission like readContacts() or you can also have openCamera() as shown below:

      private void readContacts() {
          if (!askContactsPermission()) {
              return;
          } else {
              queryContacts();
          } }
      

    Now we need to make askContactsPermission(), you can also name it as askCameraPermission() or whatever permission you are going to ask.

        private boolean askContactsPermission() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }
        if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
            return true;
        }
        if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
            Snackbar.make(parentLayout, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                    .setAction(android.R.string.ok, new View.OnClickListener() {
                        @Override
                        @TargetApi(Build.VERSION_CODES.M)
                        public void onClick(View v) {
                            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                        }
                    }).show();
        } else if (contactPermissionNotGiven) {
            openPermissionSettingDialog();
        } else {
            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
            contactPermissionNotGiven = true;
    
        }
        return false;
    }
    

    Before writing this function make sure you have defined the below instance variable as shown:

        private View parentLayout;
        private boolean contactPermissionNotGiven;;
    
    
    /**
     * Id to identity READ_CONTACTS permission request.
     */
    private static final int REQUEST_READ_CONTACTS = 0;
    

    Now final step to override the onRequestPermissionsResult method as shown below:

    /**
     * Callback received when a permissions request has been completed.
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                queryContacts();
            }
        }
    }
    

    Here we are done with the RunTime permissions, the addon is the openPermissionSettingDialog() which simply open the Setting screen if user have permanently disable the permission by clicking Don't ask again checkbox. below is the method:

        private void openPermissionSettingDialog() {
        String message = getString(R.string.message_permission_disabled);
        AlertDialog alertDialog =
                new AlertDialog.Builder(MainActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
                        .setMessage(message)
                        .setPositiveButton(getString(android.R.string.ok),
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Intent intent = new Intent();
                                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                                        intent.setData(uri);
                                        startActivity(intent);
                                        dialog.cancel();
                                    }
                                }).show();
        alertDialog.setCanceledOnTouchOutside(true);
    }
    

    What we missed ? 1. Defining the used strings in strings.xml

    "Contacts permissions are needed to display Contacts."
        You have disabled the permissions permanently,
            To enable the permissions please go to Settings -> Permissions and enable the required Permissions,
            pressing OK you will be navigated to Settings screen

    1. Initializing the parentLayout variable inside onCreate method

      parentLayout = findViewById(R.id.content);

    2. Defining the required permission in AndroidManifest.xml

    1. The queryContacts method, based on your need or the runtime permission you can call your method before which the permission was needed. in my case I simply use the loader to fetch the contact as shown below:

      private void queryContacts() {
      getLoaderManager().initLoader(0, null, this);}
      

    This works great happy coding :)

提交回复
热议问题