Pratik Pitale
Pratik Pitale

Reputation: 1845

Marshmallow permissions should ask only if not already granted

I'm developing an app that require multiple permissions, so i added it and did marshmallow code too, but the problem is when i re-open an app in marshmallow it always ask for permission, i want to ask only if its not granted.

kindly help me to code for it, Thanks in Advance!

Upvotes: 1

Views: 1669

Answers (4)

Anurag
Anurag

Reputation: 1170

Follow these steps :

  • Create a group of permission you need to access.
  • Pass the group/array to check permission granted or not

Sample code for your reference :

public static boolean hasPermissions(Context context, String[]permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
    for (String permission : permissions) {
        if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
}
return true;

Above code will check your group of permissions later pass these all to ask for once

int PERMISSION_ALL = 1; 
//create all permissions array
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, //all your permissions};

//Now check whether permissions are granted or not
if(!hasPermissions(this, PERMISSIONS)){
   ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}

Hope this will works out for you.

Upvotes: 0

Anuj.T
Anuj.T

Reputation: 1628

Just check for the permission and only request if neccessary.

Check permission with the help of

checkSelfPermission(Manifest.permission.READ_CONTACTS)

Check if permission is already granted or not

if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant

    return;
}

Then handle the permission

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! do the

        } else {
            // permission denied, Disable the
            // functionality that depends on this permission.
        }
        return;
    }
}}

Upvotes: 1

vimal raj
vimal raj

Reputation: 295

public Boolean marshmallowPermission(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkPermission()) {
            Toast.makeText(this,"Permission already granted.", Toast.LENGTH_SHORT).show();
        } else {
            requestPermission();
            //marshmallowRequest();
        }
    }
    return true;
}
@TargetApi(Build.VERSION_CODES.M)
public boolean checkPermission(){

    int phone= checkSelfPermission(android.Manifest.permission.CALL_PHONE);
    if (phone == PackageManager.PERMISSION_GRANTED ){
        return true;
    } else {
        return false;
    }
}

@TargetApi(Build.VERSION_CODES.M)
private void requestPermission(){

    if (shouldShowRequestPermissionRationale(android.Manifest.permission.CALL_PHONE)){

        Toast.makeText(this," Permission must be needed which allows you to access an app. Please allow  in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", this.getPackageName(), null);
        intent.setData(uri);
        this.startActivity(intent);

    } else {

        requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE},101);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(this,"Permission Granted, Now you can access an app.",Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(this,"Permission Denied, You cannot access call.", Toast.LENGTH_LONG).show();

            }
            break;
    }
}

Upvotes: 0

wirthra
wirthra

Reputation: 153

the Permission system has changed. But here is a good explanation how to deal with it properly.

https://developer.android.com/training/permissions/requesting.html

This way the dialog is only opened once if the user grants permission. If he declines you have a option to show a explanation the next time the permission is requested.

They also have a section with best practices that is worth to read:

https://developer.android.com/training/permissions/best-practices.html

Upvotes: 0

Related Questions