android 6.0 권한관리 쉽게 적용하는 RxPermission 사용법
android 2017. 5. 12. 21:18안드로이드 개발에도 점점 RxJava 를 많이 사용하고 있는데요,
RxJava를 사용하고 있다면, mashmallow (android 6.0) 이상에서 구현해야 하는 권한 관리를 편하게 추가할 수 있습니다.
권한 설정 구현은 targetSdkVersion 23 이상으로 해서 빌드하면 반드시 구현해야 되는 항목입니다.
targetSdkVersion 23
RxPermisstion을 적용하는 단계는 다음과 같습니다.
[ 설정 ]
build.gradle에 다음과 같이 추가해 줍니다. dependencies 부분에..
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar' // 이부분
testCompile 'junit:junit:4.12'
}
만약에 RxJava2를 사용하고 있다면.. 아래 빨간 글씨처럼 2를 붙여주면 됩니다.
dependencies { compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar' }
[ 적용 ]
1단계
Activity의 onCreate() 에서 객체를 생성해 줍니다.
public class CameraActivity extends BaseActivity {
RxPermissions rxPermissions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_activity_layout);
rxPermissions = new RxPermissions(this);}
그런 다음에 필요한 권한을 요청하고 구독하면 됩니다.
아래는 camera 권한을 요청하고
사용자가 허가하면 ( granted ), 카메라를 열고
거절하면 alert을 띄워주는 흐름입니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_activity_layout);
rxPermissions = new RxPermissions(this);
rxPermissions
.request( Manifest.permission.CAMERA )
.subscribe(permission -> {
if (granted) {openCamera();
} else {
PermissionUtils.alertPermission(this, Manifest.permission.CAMERA );}
});
}
코드도 간략하고, 흐름도 너무 자연스러운게 좋습니다.
그냥 구현하려면, 사용자 응답을 받는 onRequestPermissionsResult 함수에서 뭘하고, 해야 하다 보면 흐름이 이상해지는 경우나, 꼬이거나 해서 코드가 지져분해지기 쉬운데요, RxPermissions를 사용하면 너무나 쉽게 적용할 수 있습니다.
request에 여러 permission을 동시해 요청할 수도 있습니다.
여러 권한을 요청하면 granted 값은 모든 요청을 사용자가 동의한 경우이고, 하나라도 거절하면 false로 들어옵니다.
rxPermissions
.request(Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
)
만약 여러권한에 대해서 개별적으로 응답을 받고 싶으면 request 대신에 requestEach를 사용하면 됩니다.
rxPermissions
.requestEach(Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
)
.subscribe(permission -> { // 요청한 permission 수만큼 호출된다.
if (permission.granted) {
} else {
}
});
그리고 어떤 권한이 있는지 확인 하기 위해서는 아래처럼 간단하게 호출해 볼수 있습니다.
if (rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
// 위치정보 관련 작업
}
[ 사용시 주의사항 ]
권한요청중에 앱이 다시 시잘될 수가 있으므로, onCreate같은 초기화 함수에서 request를 처리해야 합니다. 절대로 onResume에서 사용하면 안됩니다.
[Tip]
* RxPermissions 사용시 추가해야할 proguard 설정은? 없습니다.
더 자세한 정보를 위해서는 개발자의 page에 직접 방문해 보세요.
https://github.com/tbruyelle/RxPermissions