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);
                        }
                    }
                }
            }
        }
    }
  1. 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?

  2. 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)

  3. 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ł?