Piszę aplikacje która będzie potrzebować uprawnień uses permissions. O ile w starszych androidach nie było z tym problemu, wystarczyło w manifeście dodać odpowiedni tag o tyle problem pojawia się w nowszych wersjach. Wiem że jest dokumentacja itp, ale nie rozwiało to moich wątpliwości. Mam sobie taki kod:
private boolean checkAndRequestPermissions() {
List<String> listPermissionsNeeded = new ArrayList<>();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.INTERNET);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.ACCESS_NETWORK_STATE);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_ALL_PERMISSIONS);
return false;
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_ID_ALL_PERMISSIONS: {
Map<String, Integer> perms = new HashMap<>();
perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.ACCESS_COARSE_LOCATION, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.INTERNET, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.ACCESS_NETWORK_STATE, PackageManager.PERMISSION_GRANTED);
if (grantResults.length > 0) {
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED) {
Log.d("Uprawnienia", "Nadano uprawienia lokalizacji i internetu");
} else {
Log.d("Uprawnienia", "Któreś z uprawnień nie zostało nadane, zapytaj ponownie ");
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.INTERNET) ||
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_NETWORK_STATE) ||
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) ||
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
DialogWindow.showDialogOK(this,"Lokalizacja i dostęp do internetu wymagany do prawidłowego działania aplikacji",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
checkAndRequestPermissions();
break;
case DialogInterface.BUTTON_NEGATIVE:
// wylacz apke
break;
}
}
});
} else {
Log.d("Uprawnienia", "Uprawnienia zabronione (nigdy nie pytaj jest zaznaczone");
Toast.makeText(this, "Włącz w ustawieniach telefonu uprawienia lokalizacji i internetu", Toast.LENGTH_LONG)
.show();
finish();
System.exit(0);
}
}
}
}
}
}
-
Kod jest umieszczony w klasie rozszerzającej klasę AppCompatActivity czyli po prostu jest to activity. I teraz zaświeciła mi się żarówka w głowie i sobie pomyślałem. Hej, czy w klasie odpowiadającej za wyświetlenie coś użytkownikowi w ogóle takie coś powinno mieć miejsce?
-
Co jeśli kolejna aktywność będzie także potrzebować uprawnień (tych samych bądź innych), czy wtedy cały kod trzeba będzie kopiować do nowej aktywności? (to straszne)
-
O ile dało się przenieść do osobnej klasy metodę statyczną odpowiadającą za wyświetlanie okienka dialogowego DialogWindow.showDialogOK, tak z pozostałymi metodami jest problem. Mógłbym spróbować to przenieść, ale czy sam mechanizm uses permission będzie wtedy poprawnie działał?