'패션을 찾아줘'의 사진 불러오기 기능을 사용하기 위해 사용자에게 파일 접근에 대한 권한 요청을 해야 된다.
구글 검색 결과 대부분 AppActivity 자체의 소스를 추가하는 방식이었는데, 다행히 cocos2dx와 연동되는 샘플 소스를 찾아 적용할 수 있었다.
cocos2dx-runtime-permission - 앱 시작 시 요청이 아닌 해당 기능 사용 시 요청하는 소스.
AppActivity - onCreate 밑에 추가.
// sample sources
private static final int PERMISSION_REQUEST_CODE = 9001;
public static native void Permissioncallback(boolean granted); // change
// 사진 기능을 사용할 때 호출하며 결과를 onRequestPermissionsResult()로 콜백해준다.
@Keep // Annotation for ProGuard not to delete
public static void askForPermission() {
if (!hasPermission()) {
ActivityCompat.requestPermissions(Cocos2dxHelper.getActivity(),
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSION_REQUEST_CODE);
}
}
// 권한이 허용되어 있는지 여부를 리턴해준다.
@Keep // Annotation for ProGuard not to delete
public static boolean hasPermission() {
boolean result = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
result = (ContextCompat.checkSelfPermission(Cocos2dxHelper.getActivity(),
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
}
return result;
}
// 권한 허용 및 거부의 결과를 cocos2dx 소스로 콜백해준다.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
Permissioncallback(grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED);
break;
}
}
소스 추가
사진 불러오기 부분에서 소스 수정 - 샘플 소스에서 HelloWorld.h/cpp에 해당하는 부분
// Appactivity return
// 포토 읽기 권한 존재할 경우 앨범 오픈.
if(hasPermission())
{
auto opener = PhotoOpener::createScene();
opener->setName("opener");
Director::getInstance()->pushScene(opener);
}
else // 권한이 없을 경우 물어본다.
{
// go Appactivity source
// 허용할 경우 Permissioncallback에서 앨범이 오픈된다.
// 허용한 다음부터 위 hasPermission에서 true 리턴.
askForPermission(CC_CALLBACK_1(MenuLayer::Permissioncallback, this ));
}
권한 요청에 대한 콜백
void MenuLayer::Permissioncallback(bool granted) {
if (granted) {
//label->setString("granted");
log("Permissioncallback | granted");
// 권한 허용했을 경우 정상적으로 기능을 사용한다.
auto opener = PhotoOpener::createScene();
opener->setName("opener");
Director::getInstance()->pushScene(opener);
} else{
// 권한 거부일 경우 아무일도 일어나지 않음.
//label->setString("denied");
log("Permissioncallback | denied");
}
}
main.cpp 수정 - java에서 cocos2dx로 Permissioncallback 호출
#include "Permission.h" // 헤더 추가.
// 아래 Permissioncallback은 AppActivity에서 추가된 함수(샘플소스에서는 그냥 callback이었는데 이름을 바꿈.)
// called from java
extern "C" {
JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_Permissioncallback(JNIEnv *env, jclass, jboolean granted) {
LOGD("Permissioncallback called - granted: %s", granted ? "true" : "false");
returnFromJava(granted);
}
}
확인
댓글
댓글 쓰기