Reputation: 457
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
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
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
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