Merhaba, bir önceki yazımda runtime permission‘dan bahsetmiştim. Bu yazımda da bunu daha kolay bir hale getiren Dexter library hakkında bahsedeceğim ve örneklerle destekleyeceğim.
İlk olarak build içerisine aşağıdaki kodu yazıyoruz:
implementation 'com.karumi:dexter:6.0.0'
Tekli izin isteği
Eğer sadece bir tane permission request atacaksanız withPermission() metoduyla rahatça yapabilirsiniz. Kamera izni için örnek kod:
Dexter.withActivity(this) .withPermission(Manifest.permission.CAMERA) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse response) { // permission is granted, open the camera } @Override public void onPermissionDenied(PermissionDeniedResponse response) { // check for permanent denial of permission if (response.isPermanentlyDenied()) { // navigate user to app settings } } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { token.continuePermissionRequest(); } }).check();
Çoklu izin isteği
Aynı anda birden fazla izin almayı gerçekleştirebilirsiniz. Aşağıda kamera ve disk yazma/okuma izinleri için örnek kodu görebilirsiniz. Eğer izin verildiyse fotoğrafı çektirecek ve çekilen fotoğrafı onActivityResult() metodu içerisinde diske yazma işlemlerine başlayacaktır. Eğer izin verilmediyse izin continuePermissionRequest() metodu yardımıyla izin istemeye devam edecektir.
private void takePictureFromCamera() { Dexter.withActivity(this) .withPermissions( Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE ).withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport report) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } @Override public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) { token.continuePermissionRequest(); } }).check(); }
Error handling
Dexter kullanırken herhangi bir hata durumu oluşması durumunda bunun handle edilmiş olması gerekmektedir. Aşağıda örnek handle kodu görebilirsiniz:
Dexter.withActivity(this) .withPermissions( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION) .withListener(listener) .withErrorListener(new PermissionRequestErrorListener() { @Override public void onError(DexterError error) { Toast.makeText(getApplicationContext(), "Error occurred! " + error.toString(), Toast.LENGTH_SHORT).show(); } }).check();