31

I am trying add run time permissions android(6.0.1) API 23,If I use SDK version(min and target version both 23) it woks fine, like below,

    <uses-sdk
                android:minSdkVersion="23"
                android:targetSdkVersion="23" />

If I change android:minSdkVersion(less then 23)

For example:

I am getting error below:

Call requires API level 23 (current min is 14): android.app.Activity#requestPermissions,checkSelfPermission

For following 2 methods,

1)requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)

2)checkSelfPermission(permission)

I tried ActivityCompat.checkSelfPermission() and ContextCompat.checkSelfPermission() both are not working.

What I missing could not understand..

Dhaval Parmar
  • 18,812
  • 8
  • 82
  • 177
Joe
  • 550
  • 2
  • 11
  • 21
  • 2
    ContextCompat.checkSelfPermission() is exactly what you want, could you please be more specific about why it's not working? – Egor Mar 03 '16 at 12:00
  • Are you getting any errors when using ActivityCompat or ContextCompat? If yes, what error? – Srijith Mar 03 '16 at 12:01
  • following is the error I am getting if I use ActivityCompat "The method checkSelfPermission(String) is undefined for the type ActivityCompat" – Joe Mar 03 '16 at 12:23
  • It's not ActivityCompat, it's ContextCompat. – Egor Mar 03 '16 at 12:24
  • @Egor this code I am using ContextCompat.requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); Following is the error I am getting, "The method requestPermissions(String[], int) is undefined for the type ContextCompat" – Joe Mar 03 '16 at 12:28
  • @Joe Please check my answer below – Egor Mar 03 '16 at 12:33

5 Answers5

41

Either check for target >=23 or simply add below line above your method

@TargetApi(Build.VERSION_CODES.M)

For example, If you are checking for storage permissions, then you can refer to this function,

@TargetApi(Build.VERSION_CODES.M)
    public boolean CheckStoragePermission() {
        int permissionCheckRead = ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_EXTERNAL_STORAGE);
        if (permissionCheckRead != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
                ActivityCompat.requestPermissions((Activity) context,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        Define.PERMISSION_STORAGE);
            } else {
                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions((Activity) context,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        Define.PERMISSION_STORAGE);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
            return false;
        } else
            return true;
    }
ranjitzade
  • 541
  • 5
  • 14
40

Check for permissions:

ContextCompat.checkSelfPermission(Context context, String permission)

Request permissions:

ActivityCompat.requestPermissions(Activity activity, String[] permissions, int requestCode)

or inside a support-v4 Fragment

requestPermissions(String[] permissions, int requestCode)

Egor
  • 39,695
  • 10
  • 113
  • 130
20

try this way

if (Build.VERSION.SDK_INT >= 23) {
    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            requestContactsPermissions1();
    } else {
        // your code
    }
}

EDITED:

Add in dependencies block in lower-level(your app) build.gradle:

compile 'com.android.support:appcompat-v7:23.1.1'

or add below only if you need design support lib

compile 'com.android.support:design:23.1.1'

use one of above

Dhaval Parmar
  • 18,812
  • 8
  • 82
  • 177
  • following is the error I am getting if I use ActivityCompat "The method checkSelfPermission(String) is undefined for the type ActivityCompat" – Joe Mar 03 '16 at 12:24
  • @Joe: check edited answer – Dhaval Parmar Mar 03 '16 at 12:26
  • I think it is better to use simpler alternative - just annotate class or method with the @TargetApi(23) because on API version less than 23 permissions are granted automatically so condition block has no sense. So anyone who suggests condition alternative have useless code indent and possibly useless "else" block. – mikep Sep 04 '19 at 10:37
7

That is because checkSelfPermission() was added in API 23. So you'll have to code conditionally like:

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
    //use checkSelfPermission()
} else {
    //simply use the required feature
    //as the user has already granted permission to them during installation
}
camelCaseCoder
  • 1,447
  • 19
  • 32
1

check the device sdk before calling the request permission

 if(Build.VERSION.SDK_INT==Build.VERSION_CODES.M)
{
//call the request permission here 
}
prasanthMurugan
  • 597
  • 6
  • 21