android 6.0 권한관리 쉽게 적용하는 RxPermission 사용법

android 2017. 5. 12. 21:18

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 개발에도 점점 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





: