마시멜로우 이후에 단순히 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();
}
}
'Programming > Android' 카테고리의 다른 글
Glide Svg 이미지관련 (0) | 2017.05.19 |
---|---|
RealmList와 Realm + Rx2 사용 이슈 (0) | 2017.05.19 |
Dagger2, MVP, annotation (좀 더 내 취향의 코드) (0) | 2017.04.15 |
Android Studio java1.8관련 에러 (0) | 2017.02.25 |
Dagger2 및 Annotation 사용중 관련에러 (0) | 2017.02.18 |