ZeroZerg
ZeroZerg

Reputation: 457

How to read the state of current permission status?

In my app, I need GPS to locate the user. I wish my app provide following kinds of result.

1.The current location.(Success)
2.Failed to get current location because of device error or something else. (Failed)
3.The user refused the permission. (Permission denied)

I use LocationManager to do the job.

locationManager = (LocationManager)mActivity.getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

If the permission is denied, the location will be null.

But I don't know what the location will be if the function failed. And I 'm not sure whether that location is null and user refuse to open GPS are equal.

With the following code, I might know whether the permission is added in the AndroidManifest.xml. But I can't get the information I need.

boolean getLocationOn = (PackageManager.PERMISSION_GRANTED ==   
           pm.checkPermission("android.permission.ACCESS_FINE_LOCATION", "my_package"));

Upvotes: 3

Views: 2406

Answers (3)

Rainmaker
Rainmaker

Reputation: 11080

First implement an onRequestPermissionResult like this:

@Override 
public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_ACCESS_LOCATION: { 
                // If request is cancelled, the result arrays are empty. 
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // permission was granted, do your stuff!
                locationManager = (LocationManager)mActivity.getSystemService(Context.LOCATION_SERVICE);
                Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (location != null) {
                } else { 
                //location wasn't found
                }

            } else { 

               //user denied permission additionally you can check  
               //ActivityCompat.shouldShowRequestPermissionRationale if user checked on "do not show again" while clicking deny
            } 
            return; 
        } 
     } 
} 

Upvotes: 0

Rishabh Sharma
Rishabh Sharma

Reputation: 268

Create a method to check permissions.

public static final int MULTIPLE_PERMISSIONS = 15;
String[] permissions= new String[]
{
    Manifest.permission.ACCESS_COARSE_LOCATION,
    Manifest.permission.ACCESS_FINE_LOCATION

};

Below function will request for permissions.

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

    if (requestCode == MULTIPLE_PERMISSIONS) {

        Log.v("Nopermissionz", "No permission granted , " + permissions.length);

        if (permissions.length == 2
                && grantResults[0] == PackageManager.PERMISSION_GRANTED
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) {

            Log.v("Nopermission1", "Permission granted , " + permissions.length);

        } else {
            Log.v("Nopermission2", "No permission granted");
            Snackbar.make(findViewById(android.R.id.content), "Please allow this App with some permissions", Snackbar.LENGTH_INDEFINITE)
                    .setAction("SETTINGS", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent();
                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivity(intent);
                        }
                    })
                    .show();
        }
    }
}

Call the method checkPermissions() to check if permissions are granted.

private  boolean checkPermissions() 
{
    int result;
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String p:permissions) 
    {
        result = ContextCompat.checkSelfPermission(MainActivity.this,p);
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(MainActivity.this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),MULTIPLE_PERMISSIONS );
        return false;
    }
    return true;
}

Upvotes: 0

Jay Patel
Jay Patel

Reputation: 628

Use below code to check and request permission

private void checkAndRequestPermissions() {
    int camera = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA);
    int storage = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int loc = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION);
    int loc2 = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION);
    int logs = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_LOGS);
    int networkstate = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_NETWORK_STATE);
    int internet = ContextCompat.checkSelfPermission(this, android.Manifest.permission.INTERNET);
    int wifistate = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_WIFI_STATE);
    int externalstorage = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE);
    int phonestate = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
    int wakelock = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WAKE_LOCK);
    int alarm = ContextCompat.checkSelfPermission(this, android.Manifest.permission.SET_ALARM);
    int audio = ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO);
    int accounts = ContextCompat.checkSelfPermission(this, android.Manifest.permission.GET_ACCOUNTS);
    int contacts = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS);
    List<String> listPermissionsNeeded = new ArrayList<>();

    if (camera != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.CAMERA);
    }
    if (storage != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (loc2 != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (loc != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
    }
    if (logs != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.READ_LOGS);
    }
    if (networkstate != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.ACCESS_NETWORK_STATE);
    }
    if (internet != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.INTERNET);
    }
    if (wifistate != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.ACCESS_WIFI_STATE);
    }
    if (externalstorage != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
    }
    if (phonestate != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.READ_PHONE_STATE);
    }
    if (wakelock != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.WAKE_LOCK);
    }
    if (alarm != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.SET_ALARM);
    }
    if (audio != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.RECORD_AUDIO);
    }
    if (accounts != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.GET_ACCOUNTS);
    }
    if (contacts != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.READ_CONTACTS);
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
    }
}

Call checkAndRequestPermissions() to check and request for permission.

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

Upvotes: 1

Related Questions