2016-12-24 10 views
0

У меня есть кнопка местоположения в ActionBar. При нажатии на нее будет загружена заданная функция cityLocation().Диалоговое окно разрешения на доступ не отображается правильно в действии

Код выполняется следующим образом

  1. При нажатии в первый раз он просит разрешения местонахождения
  2. Восприняв это работает showCity(), иначе она всплывает Тост
  3. Если нажата снова после того, как отвергая, она выполняет shouldShowRequestPermissionRationale() часть (PS. Я не нажимал не показывать)

Во всяком случае это было только второй раз, когда я нажал на кнопку, и вместо того, чтобы о f, спрашивая у меня разрешение на размещение (с флажком не показывать снова), он выполняет часть shouldShowRequestPermissionRationale().

Я хочу, чтобы код запрашивал разрешение на размещение с помощью флажка «Не спрашивать снова», если это разрешение было отклонено в первый раз, а затем, если я снова его отклоню (с помощью флажка), а затем щелкните элемент панели действий, то он должен запустить код MaterialDialog.Builder.

Вот код, у меня прямо сейчас:

private void cityLocation() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (ActivityCompat.checkSelfPermission(WeatherActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(WeatherActivity.this, 
        Manifest.permission.ACCESS_COARSE_LOCATION)) { 
       MaterialDialog dialog; 
       MaterialDialog.Builder builder = new MaterialDialog.Builder(this); 
       builder.title("Permission needed") 
         .content("This Action Requires the Location Setting to be enabled. Go to Settings and check the Location Permission inside the Permissions View") 
         .positiveText("SETTINGS") 
         .negativeText("CANCEL") 
         .onPositive(new MaterialDialog.SingleButtonCallback() { 
          @Override 
          public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 
           final Intent i = new Intent(); 
           i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
           i.addCategory(Intent.CATEGORY_DEFAULT); 
           i.setData(Uri.parse("package:" + getApplicationContext().getPackageName())); 
           i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
           i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
           i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
           startActivity(i); 
          } 
         }) 
         .onNegative(new MaterialDialog.SingleButtonCallback() { 
          @Override 
          public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 
           dialog.dismiss(); 
          } 
         }); 
       dialog = builder.build(); 
       dialog.show(); 
      } 
      else 
       requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
         READ_COARSE_LOCATION); 
     } else { 
      showCity(); 
     } 
    } 
    else { 
     showCity(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             @NonNull String[] permissions, 
             @NonNull int[] grantResults) { 
    if (requestCode == READ_COARSE_LOCATION 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     showCity(); 
    } 
    else { 
     Toast.makeText(getApplicationContext() , "Denied Location Permission" , Toast.LENGTH_SHORT).show(); 
    } 
} 

В ожидании решения.

ответ

1

здесь Полная проверка выполнения permisssion код:

private void cityLocation() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (!checkIfAlreadyhavePermission()) { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, READ_COARSE_LOCATION); 
     } else { 
      showCity(); 
     } 
    } else { 
     showCity(); 
    } 
} 

private boolean checkIfAlreadyhavePermission() { 
    int result = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION); 
    return result == PackageManager.PERMISSION_GRANTED; 
} 

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

      } else { 
       permission_denied(); 
      } 
      break; 
     } 
     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

public void permission_denied() { 
    // permission was not granted 
    //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission 
    // shouldShowRequestPermissionRationale will return true 
    //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup. 
    if (ActivityCompat.shouldShowRequestPermissionRationale(WeatherActivity.this, 
      Manifest.permission.ACCESS_COARSE_LOCATION)) { 
     showDialogOK("Permission is required for register", 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         switch (which) { 
          case DialogInterface.BUTTON_POSITIVE: 
           showCity(); 
           break; 
          case DialogInterface.BUTTON_NEGATIVE: 
           // proceed with logic by disabling the related features or quit the app. 
           break; 
         } 
        } 
       }); 
    } //permission is denied (and never ask again is checked) 
    //shouldShowRequestPermissionRationale will return false 
    else { 
     Toast.makeText(getApplicationContext(), "Go to settings and enable External storage permissions", Toast.LENGTH_LONG).show(); 
     showMaterialDialog(); 
    } 
} 

public void showMaterialDialog() { 
    MaterialDialog dialog; 
    MaterialDialog.Builder builder = new MaterialDialog.Builder(this); 
    builder.title("Permission needed") 
      .content("This Action Requires the Location Setting to be enabled. Go to Settings and check the Location Permission inside the Permissions View") 
      .positiveText("SETTINGS") 
      .negativeText("CANCEL") 
      .onPositive(new MaterialDialog.SingleButtonCallback() { 
       @Override 
       public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 
        final Intent i = new Intent(); 
        i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
        i.addCategory(Intent.CATEGORY_DEFAULT); 
        i.setData(Uri.parse("package:" + getApplicationContext().getPackageName())); 
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
        i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
        startActivity(i); 
       } 
      }) 
      .onNegative(new MaterialDialog.SingleButtonCallback() { 
       @Override 
       public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 
        dialog.dismiss(); 
       } 
      }); 
    dialog = builder.build(); 
    dialog.show(); 

} 

private void showDialogOK(String message, DialogInterface.OnClickListener okListener) { 
    new AlertDialog.Builder(getActivity()) 
      .setMessage(message) 
      .setPositiveButton("OK", okListener) 
      .setNegativeButton("Cancel", okListener) 
      .create() 
      .show(); 
} 
  1. он покажет диалог, если пользователь отрицает разрешение ...

  2. если пользователь также не проверяет и не спрашивать будет покажите диалог материала.

  3. Если пользователь предоставит разрешение, он выполнит требуемую функцию.

+0

Это сработало для меня. Спасибо, сэр. – Sparker0i

0

Если выбран флажок neverAskAgain в диалоговом окне разрешения, то

ActivityCompat.shouldShowRequestPermissionRationale() 

метод возвращает ложь. поэтому ваша логика повторного отображения диалогового окна материала не будет работать, если вы сохраните его внутри блока if.

Если вам нужно его снова показать, сделайте это в блоке else.

+0

Сэр, я пробовал это, но он дает мне бесконечный цикл диалога разрешения, и когда я нажимаю кнопку «Не спрашивать снова», он запускает диалоговое окно материала. – Sparker0i