#android #android-studio #permissions #android-6.0-marshmallow #android-permissions
#Android #android-studio #разрешения #android-6.0-marshmallow #android-разрешения
Вопрос:
Я разрабатываю приложение, для которого требуется несколько разрешений, поэтому я добавил его и также создал код marshmallow, но проблема в том, что когда я повторно открываю приложение в marshmallow, оно всегда запрашивает разрешение, я хочу спросить, только если оно не предоставлено.
пожалуйста, помогите мне написать код для этого, заранее спасибо!
Комментарии:
1. Даже если в разрешении отказано, вы не хотите показывать его снова?
2. если это отрицается, то только это показывает, что в противном случае не @King
3. Вы можете использовать общие настройки, чтобы проверить, что разрешение запрашивается в первый раз.
4. @Pratik просто нужно поставить галочку, если она уже предоставлена или нет
5. @king нужна ли мне SharedPreference?
Ответ №1:
Просто проверьте наличие разрешения и запрашивайте только при необходимости.
Проверьте разрешение с помощью
checkSelfPermission(Manifest.permission.READ_CONTACTS)
Проверьте, предоставлено ли разрешение уже или нет
if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant
return;
}
Затем обработайте разрешение
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! do the
} else {
// permission denied, Disable the
// functionality that depends on this permission.
}
return;
}
}}
Ответ №2:
система разрешений изменилась. Но вот хорошее объяснение, как с этим правильно справиться.
https://developer.android.com/training/permissions/requesting.html
Таким образом, диалоговое окно открывается только один раз, если пользователь предоставляет разрешение. Если он откажется, у вас есть возможность показать объяснение при следующем запросе разрешения.
У них также есть раздел с рекомендациями, который стоит прочитать:
https://developer.android.com/training/permissions/best-practices.html
Ответ №3:
public Boolean marshmallowPermission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkPermission()) {
Toast.makeText(this,"Permission already granted.", Toast.LENGTH_SHORT).show();
} else {
requestPermission();
//marshmallowRequest();
}
}
return true;
}
@TargetApi(Build.VERSION_CODES.M)
public boolean checkPermission(){
int phone= checkSelfPermission(android.Manifest.permission.CALL_PHONE);
if (phone == PackageManager.PERMISSION_GRANTED ){
return true;
} else {
return false;
}
}
@TargetApi(Build.VERSION_CODES.M)
private void requestPermission(){
if (shouldShowRequestPermissionRationale(android.Manifest.permission.CALL_PHONE)){
Toast.makeText(this," Permission must be needed which allows you to access an app. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
this.startActivity(intent);
} else {
requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE},101);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 101:
if (grantResults.length > 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this,"Permission Granted, Now you can access an app.",Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this,"Permission Denied, You cannot access call.", Toast.LENGTH_LONG).show();
}
break;
}
}
Ответ №4:
Выполните следующие действия :
- Создайте группу разрешений, к которым вам нужен доступ.
- Передайте group / array для проверки предоставленного разрешения или нет
Пример кода для справки :
public static boolean hasPermissions(Context context, String[]permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M amp;amp; context != null amp;amp; permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
Приведенный выше код проверит вашу группу разрешений позже, передав их все, чтобы запросить один раз
int PERMISSION_ALL = 1;
//create all permissions array
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, //all your permissions};
//Now check whether permissions are granted or not
if(!hasPermissions(this, PERMISSIONS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
Надеюсь, это сработает для вас.