Aynı sorunu yaşadım ve anladım. Hayatı daha basit hale getirmek için, çalışma zamanı izinlerini işlemek için bir util sınıfı yazdım.
public class PermissionUtil {
public static boolean shouldAskPermission() {
return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
}
private static boolean shouldAskPermission(Context context, String permission){
if (shouldAskPermission()) {
int permissionResult = ActivityCompat.checkSelfPermission(context, permission);
if (permissionResult != PackageManager.PERMISSION_GRANTED) {
return true;
}
}
return false;
}
public static void checkPermission(Context context, String permission, PermissionAskListener listener){
if (shouldAskPermission(context, permission)){
if (((Activity) context).shouldShowRequestPermissionRationale(permission)) {
listener.onPermissionPreviouslyDenied();
} else {
if (PreferencesUtil.isFirstTimeAskingPermission(context, permission)) {
PreferencesUtil.firstTimeAskingPermission(context, permission, false);
listener.onPermissionAsk();
} else {
listener.onPermissionDisabled();
}
}
} else {
listener.onPermissionGranted();
}
}
public interface PermissionAskListener {
void onPermissionAsk();
void onPermissionPreviouslyDenied();
void onPermissionDisabled();
void onPermissionGranted();
}
}
Ve PreferenceUtil yöntemler aşağıdaki gibi bulunmaktadır.
public static void firstTimeAskingPermission(Context context, String permission, boolean isFirstTime){
SharedPreferences sharedPreference = context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE;
sharedPreference.edit().putBoolean(permission, isFirstTime).apply();
}
public static boolean isFirstTimeAskingPermission(Context context, String permission){
return context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE).getBoolean(permission, true);
}
Şimdi, ihtiyacınız olan tek şey checkPermission yöntemini uygun argümanlarla kullanmaktır.
İşte bir örnek,
PermissionUtil.checkPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE,
new PermissionUtil.PermissionAskListener() {
@Override
public void onPermissionAsk() {
ActivityCompat.requestPermissions(
thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
REQUEST_EXTERNAL_STORAGE
);
}
@Override
public void onPermissionPreviouslyDenied() {
}
@Override
public void onPermissionDisabled() {
Toast.makeText(context, "Permission Disabled.", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionGranted() {
readContacts();
}
});
Durum 1: Uygulamanın bir izni yok ve kullanıcıdan daha önce izin istenmemiş. Bu durumda, shouldShowRequestPermissionRationale (), kullanıcıya ilk defa sorduğumuz için yanlış döndürür.
Durum 2: Kullanıcı izni reddetti ve "Bir daha sorma" seçeneğini seçti, bu durumda daShowRequestPermissionRationale () yanlış döndürecektir.
Kullanıcıyı Durum 2'deki Uygulamanın ayarlar sayfasına göndermek istiyorum. Bu iki durumu nasıl ayırt edebilirim?
Üzerinde geri arama alırsınız onPermissionAsk durumda 1 ve onPermissionDisabled durumda 2 için.
Mutlu kodlamalar :)