Dexter kullanımı

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();