#android #android-6.0-marshmallow #android-permissions
#Android #android-6.0-marshmallow #android-разрешения
Вопрос:
Я пытаюсь получить доступ к местоположениям пользователей и просто разобраться с разрешениями. Итак, я понимаю, что на 23 и выше, независимо от манифеста, пользователь должен предоставить разрешение.
Итак, у меня это есть в манифесте, подобном этому, для более старых версий:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Для более новой версии > = 23 я тестирую так, прежде чем показывать диалоговое окно:
// Check for runtime location permissions
private boolean hasRunTimeLocationPermission() {
int courseLocationPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_COARSE_LOCATION);
return (courseLocationPermission == PackageManager.PERMISSION_GRANTED );
}
Насколько я понял, это должно возвращать false в первый раз, но оно возвращает true.
Действительно ли пользователь должен отключать службы определения местоположения или это считается «опасным» и должно быть одобрено в первый раз?
Также я использую новый api-интерфейс эмулятора 23, когда я просматриваю разрешения на местоположение, в нем говорится, что ни одно приложение не запрашивало местоположение.
Спасибо за вашу помощь
Комментарии:
1. Вы проверяете это условие фрагментарно?
2. Да, я это меняет?
3. В методе запуска фрагмента
4. @MadhukarHebbar Спасибо, разрешение для приложения установлено на вкл. Я думал, что это не было сделано по умолчанию?
5. @MadhukarHebbar Это то, что вызвало проблему, Спасибо! по какой-то причине эмулятор запустился с тем, что для этого разрешения установлено значение true. Вы знаете, что это произойдет?
Ответ №1:
Попробуйте это.
// Check for runtime location permissions
private boolean hasRunTimeLocationPermission() {
int courseLocationPermission = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION);
return (courseLocationPermission == PackageManager.PERMISSION_GRANTED );
}
Комментарии:
1. Спасибо за ваш ответ. Это ничего не меняет, хотя извините.
Ответ №2:
ПОПРОБУЙТЕ ЭТО:
private boolean hasRunTimeLocationPermission() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
{
return false;
}
else
{
return true;
}
}
Ответ №3:
Проверьте разрешения следующим образом :-
Check permissions like this :-
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
//Show Information about why you need the permission
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Need Location Permission");
builder.setMessage("This app needs location permission.");
builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, ACCESS_COARSE_LOCATION_CONSTANT);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
} else if (permissionStatus.getBoolean(Manifest.permission.ACCESS_COARSE_LOCATION,false)) {
//Previously Permission Request was cancelled with 'Dont Ask Again',
// Redirect to Settings after showing Information about why you need the permission
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Need Location Permission");
builder.setMessage("This app needs location permission.");
builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
sentToSettings = true;
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
Toast.makeText(getBaseContext(), "Go to Permissions to Grant Location", Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
} else {
//just request the permission
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, ACCESS_COARSE_LOCATION_CONSTANT);
}
SharedPreferences.Editor editor = permissionStatus.edit();
editor.putBoolean(Manifest.permission.ACCESS_COARSE_LOCATION,true);
editor.commit();
} else {
//You already have the permission, just go ahead.
proceedAfterPermission();
}
Ответ №4:
Добавьте это в манифест даже для api>23
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
А затем запрашивайте разрешения во время выполнения следующим образом :-
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
1);
И для обработки результатов восстановления используйте это:-
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
} else {
// permission denied, boo!
Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
}
}