[Android] Sử dụng thư viện Dexter để yêu cầu Permissions trong Runtime
Trong Android, việc thực thi runtime permissions là một quá trình tẻ nhạt và cần rất nhiều code chỉ để có được một quyền duy nhất. Trong bài này, chúng ta sẽ tìm hiểu cách đơn giản hóa quá trình này bằng cách sử dụng thư viện Dexter.
Bài viết này sẽ giới thiệu về Dexter bao gồm các tính năng cơ bản được cung cấp bởi thư viện như sử dụng nó với SnackBar, các loại listeners khác nhau, xử lý lỗi ,... Bạn có thể tìm hiểu thêm thông tin trên website của Dexter.
1. Thêm Dexter vào project của bạn
Để bắt đầu sử dụng Dexter, chúng ta add dependency vào build.gradle (Module: app)
dependencies {
// Dexter runtime permissions
implementation 'com.karumi:dexter:4.2.0'
}
2. Yêu cầu 1 quyền
Để request 1 quyền, bạn có thể sử dụng phương thức withPermission() gắn với 1 callback PermissionListener để nhận trạng thái cho phép.
- onPermissionGranted(): được gọi khi quyền được cho phép.
- onPermissionDenied(): được gọi khi quyền bị từ chối. Ở đây bạn có thể kiểm tra xem sự cho phép bị từ chối vĩnh viễn bằng cách sử dụng điều kiện response.isPermanentlyDenied().
Ví dụ yêu cầu truy caajo CAMERA
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();
3. Yêu cầu nhiều quyền
Để request nhiều quyền cùng 1 lúc, chúng ta sử dụng method withPermissions()
Ví yêu cầu quyền sử dụng STORAGE và LOCATION
Dexter.withActivity(this)
.withPermissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
// check if all permissions are granted
if (report.areAllPermissionsGranted()) {
// do you work now
}
// check for permanent denial of any permission
if (report.isAnyPermissionPermanentlyDenied()) {
// permission is denied permenantly, navigate user to app settings
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
})
.onSameThread()
.check();
4. Xử lý lỗi
Chúng ta cũng có thể bắt bất kỳ lỗi nào xảy ra trong khi tích hợp thư viện bằng cách sử dụng PermissionRequestErrorListener.
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();
Qua bài viết hy vọng các bạn sẽ biết thêm một cách đơn giản hơn để yêu cầu quyền cho ứng dụng của mình.
Cảm ơn các bạn đã đọc bài viết.
Chào thân ái và quyết thắng!
Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!