-1

AndroidManifest.xml :

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Code :

button.setOnClickListener {
var permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
  toast("success")
} else {
  toast("fail")}}

Why does this return "fail" ?

Tim
  • 41,901
  • 18
  • 127
  • 145
rotten_flesh
  • 69
  • 2
  • 13

8 Answers8

0

For Android 6.0+ or targetSdk=23 you have to consider asking for run-time permissions. The permissions android.permission.ACCESS_FINE_LOCATION is considered dangerous so you have to ask for it at run-time. See Normal and Dangerous Permissions for an overview.

What you have to do is to ask it at run-time e.g.

from the developer guidelines

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an explanation 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.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Read more here at Requesting Permissions at Run Time

Murat Karagöz
  • 35,401
  • 16
  • 78
  • 107
0

In this case you should request the permission like:ActivityCompat.requestPermissions(thisActivity, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); and you should get an answer in onRequestPermissionsResult callback. Then, if the user grant the permission, at the next time you will use the checkSelfPermission method you will get success.

For more details read this: https://developer.android.com/training/permissions/requesting.html

Sagi Mymon
  • 958
  • 9
  • 12
0

It seems you are using target sdk >=23 and run app on device with api level also >=23. So since api 23 there is new flow to recive permissions. Permissions are divided into two categories, normal and dangerous. Dangerous permissions should be asked in runtime like this: ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_LOCATION);

This will show system dialog for user: Android 6.0 runtime permissions dialog

So result of user's selections will be returned to public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)

With request code that you passed in ActivityCompat.requestPermissions, in my case it is MY_PERMISSIONS_REQUEST_LOCATION

Permissions' names will be in String permissions[] and user's selections will be accordingly in int[] grantResults, with can be PackageManager.PERMISSION_GRANTED or PERMISSION_DENIED.

Also it's good to explain to user why you need that permission before asking it.

See more here:Requesting Permissions at Run Time

kaktus23
  • 39
  • 4
0

You can check Permission after/in Android 6.0

public class MainActivity extends AppCompatActivity {

    private final int PERMISSIONS_CODE = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       Button button = (Button) findViewById(R.id.button1);
       button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION,}, PERMISSIONS_CODE);

            } else {

                // You can do you operation directly. If you added permissions in AndroidManifest...
                // Or visit following link to read about permission check.
                // https://stackoverflow.com/questions/7203668/how-permission-can-be-checked-at-runtime-without-throwing-securityexception

            }
        }
    });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_CODE:
            if (grantResults.length > 0 && grantResults[grantResults.length-1] == PackageManager.PERMISSION_GRANTED) {
                Log.d("permission", "accepted");
            } else {
                Log.d("permission", "denied");
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            break;
    }
}

}

Happy coding...

Divakar Murugesh
  • 1,207
  • 1
  • 10
  • 14
0

for Android 6.0 and your targetSdkVersion >=23 , you should ask permission at run time,I have two advise: 1、you can change your targetSdkVersion in model gradle file,eg:

targetSdkVersion=22

but,I don't recommend use this method. 2、this return 'fail' mean you don't have this permission,your should consider if your have request but user refuse,in this your can show a dialog to tell use ,why you need this perssion,and then request the permession you want,you can use this code below:

   private boolean check(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            //you have this permession
            return true;
        }else{
            //don't hava permession ,you shoud check if you can request
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                //the use refuse you request this permission ,the system well't show request dialog,you shoul show a dialog tu explain why you need this permission
                //and guide he go to system setting open this permission.
            }else {
                // you can request permission direct
                //requestCode is a integer code,that you can use is in onRequestPermissionsResult
                ActivityCompat.requestPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION, requestCode);

            }

        }
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //in this you can listen the request result
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
            //user Agree permission
        }else{
            //user reject permission
        }
    }

I'm sorry,I only know java,so,this code is jave. hope this can help you to deal this problem.

Mr.jie
  • 42
  • 6
0

Requesting permissions is too confusing for me, EasyPermissions solved all my problems

Manifest :

compile 'pub.devrel:easypermissions:0.4.2'

Code :

button.setOnClickListener {
    if (EasyPermissions.hasPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
        toast("yes !")
    } else {
        EasyPermissions.requestPermissions(this, getString(R.string.location_perm), 1, Manifest.permission.ACCESS_FINE_LOCATION )
    }}

worked perfect first try

rotten_flesh
  • 69
  • 2
  • 13
0
    public static int CAMERA_PERMISSSION_CODE = 1;
        public static int STORAGE_PERMISSSION_CODE = 2;
        public static int FINE_LOCATION_PERMISSSION_CODE = 3;
        public static int COARSE_LOCATION_PERMISSSION_CODE = 3;
        public static int READ_PHONESTATE_PERMISSSION_CODE = 4;




 private void askForunTimePermissions() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


            if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {


                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSSION_CODE);

            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {


                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {

                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, FINE_LOCATION_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, COARSE_LOCATION_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.READ_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, READ_PHONESTATE_PERMISSSION_CODE);
            } else {



            }


        }


    }


   @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        try {
            if (requestCode == CAMERA_PERMISSSION_CODE) {

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }


            } else if (requestCode == STORAGE_PERMISSSION_CODE) {

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }


            } else if (requestCode == FINE_LOCATION_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            } else if (requestCode == COARSE_LOCATION_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            } else if (requestCode == READ_PHONESTATE_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            }

        } catch (Exception e) {
            Toast.makeText(PermissionsActivity.this, "No permission requests matched", Toast.LENGTH_SHORT).show();
        }
    }


//call this method where u want
  askForunTimePermissions();
adi
  • 11
  • 3
0

To check Location Permission via PermissionChecker.checkSelfPermission, you need to enable Location first. Otherwise PermissionChecker.checkSelfPermission will always return -2.

Ahamadullah Saikat
  • 4,437
  • 42
  • 39