본문 바로가기

Programming/Android

Permission check관련

마시멜로우 이후에 단순히 manifest에 permission을 등록하는 것만으로는 해결이 안됨

(runtime exception?이었나 에러뜸)


유저들에게 권한 허용여부에 대해 물어봐야 함


직접 구현할 수도 있으나 이미 잘 되어있는 라이브러리들이 있으니...


https://github.com/Karumi/Dexter


현재 내가 쓰고 있는 라이브러리


사용법도 깔끔하고, 클래스를 따로 빼둬서 모든 액티비티나 프래그먼트에서 사용가능하게끔 구현...

(dagger로 inject하는데 좀 더 효율적인 방법이 있을지 이건 고민해봐야 할 듯)


무거운 프로세스의 경우 background에서

// Background permission check (heavy process)
public class BaseBackgroundPermissionListener extends BasePermissionListener {
Handler handler = new Handler(Looper.getMainLooper());

public BaseBackgroundPermissionListener(AppCompatActivity activity) {
super(activity);
}

public BaseBackgroundPermissionListener(Fragment fragment) {
super(fragment);
}

@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
handler.post(() -> {
BaseBackgroundPermissionListener.super.onPermissionGranted(response);
});
}

@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
handler.post(() -> {
BaseBackgroundPermissionListener.super.onPermissionDenied(response);
});
}

@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
handler.post(() -> {
BaseBackgroundPermissionListener.super.onPermissionRationaleShouldBeShown(permission, token);
});
}
}


다수의 permission check필요시


// Multiple permission check
public class BaseMultiplePermissionListener implements MultiplePermissionsListener {

AppCompatActivity activity;
Fragment fragment;

public BaseMultiplePermissionListener(AppCompatActivity activity) {
this.activity = activity;
}

public BaseMultiplePermissionListener(Fragment fragment) {
this.fragment = fragment;
}

@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
report.areAllPermissionsGranted();
}

@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}


한 개의 permission check

// Single permission check
public class BasePermissionListener implements PermissionListener {

@Inject
protected StartPresenter presenter;

AppCompatActivity activity;
Fragment fragment;

public BasePermissionListener(AppCompatActivity activity) {
this.activity = activity;
}

public BasePermissionListener(Fragment fragment) {
this.fragment = fragment;
}

@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
Logger.d(response.getPermissionName());
response.getPermissionName();
}

@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
if (response.isPermanentlyDenied()){
presenter.showPermissionGuide(activity.getString(R.string.permission_permanently_denied));
} else {
Logger.d(response.getPermissionName());
presenter.showPermissionGuide(response.getPermissionName());
}
}

@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
Logger.d("");
token.continuePermissionRequest();
}
}