cocos2d-x Android In App Billing Dungeons Sample 연동하기

 개발중인 App의 서명된 APK를 만들어 Google Play 개발자 센터에 등록하고,  인앱 제품까지 추가했다면 이제 코딩 연동만이 남았네요. 이번 포스팅에서는 cocos2d-x에 Android In App Billing을 연동을 정리해보겠습니다. 전에 다른 포스팅에서도 공개를 했지만 전 Java, Objective-C를 모르는 C++ 개발자이기 때문에 이번 구글 인앱 빌링 연동 역시 Google Play Billing Library에 있는 Sample을 가져다가 수정해서 붙여보겠습니다. 일일이 Android Java소스를 다 구현할 수는 없으니까요.

 Android SDK Manager를 열어 Extras에서 Google Play Billing Library를 Install합니다.

 기존에 개발중인 Project를 열고 File -> Import -> General -> File System -> Android-SDK설치 디렉토리\extras\google\play_billing 에서 src와 res의 layout, values를 선택 후 Finish를 클릭합니다. 이때 res 때문에 overwrite할 것이냐고 물어보는데 기존에 cocos2d-x project에 있는것은 app_name이외 별것 없으므로 덮어써도 무관합니다.

 역시나 import한 인앱빌링 예제인 dungeons에서 에러가 발생하는군요. 어느정도 예상했던 문제입니다. 전에 GREE SDK의 Sample을 cocos2d-x에 연동할 때도 같은 문제가 있었습니다. 해결책은 Organize Imports를 사용하면 됩니다. 역시 정리를 해놓으니 필요할 때 금방 찾게 되네요.

 자 이제 코드든 xml이든 수정에 들어가야합니다. 먼저 AndroidManifest.xml을 수정해봅니다.

        <service android:name="com.example.dungeons.BillingService" />
        <receiver android:name="com.example.dungeons.BillingReceiver">
            <intent-filter>
                <action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
                <action android:name="com.android.vending.billing.RESPONSE_CODE" />
                <action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
            </intent-filter>
        </receiver>
 위 내용을 </application>이 끝나기 전에 추가해 줍니다.


        <activity android:name="com.example.dungeons.Dungeons"
                 android:configChanges="orientation" >
        </activity>
 Sample에 있는 Dungeons가 Activity를 extends 했기 때문에 위와 같이 activity를 추가해줍니다.


 당연히 Billing 관련 Uses Permission도 추가되어 있어야 합니다.


 다음으로 공개 키값을 입력해야합니다. Google Play 개발자 콘솔에 로그인 하신 후 프로필 수정에 가시면 공개키가 있습니다. 내용을 복사 클립보드에 복사합니다.

 Security.java 파일의 verifyPurchase함수에 스샷에서 보이는 것과 같이 your public key here에 클립보드에 복사했던 공개키를 붙여 넣습니다.

 Google Play 개발자 콘솔에 추가했던 인앱 제품을 코드에 심어주기 위해 Dungeons.java 파일에서 CATALOG 변수를 수정해줍니다. 저는 관리되는 유형 testitem1과 관리되지 않는 유형으로 testitem2로 추가해뒀던 것을 위 스샷과 같이 수정했습니다. 나머지 밑에꺼는 뭔지 몰라 일단 놔뒀구요.

 이제 특정 버튼을 눌러 JNI를 통해 개발중인 App의 Activity에서 Dungeons Activity를 실행해줘야 합니다.

///< 개발중인 App의 java파일입니다. 먼저 import를 추가해줍니다.
import com.example.dungeons.Dungeons;

public class MyAppActivity extends Cocos2dxActivity{
 private Cocos2dxGLSurfaceView mGLView;
...
        ///< 메세지 ID 정의
        private final static int DUNGEONS_SHOW = 1000;
        ///< 핸들러와 메인액티비티 변수
        private static Handler handler;
        private static Activity gameActivity;

...

        protected void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  
  if (detectOpenGLES20()) {
...
...
 // Set framelayout as the content view
        setContentView(framelayout);
        ///< 메인 액티비티 저장
        setGameActivity( this );

...
        ///< Handler 처리
        handler = new Handler(){
          public void handleMessage(Message msg){
           switch(msg.what){
           case DUNGEONS_SHOW:
           {

                                      Intent intent = new Intent(getGameActivity(), Dungeons.class);
                                      getGameActivity().startActivity(intent);            

                    Log.d("Dungeons", "Dungeons...SHOW OK");
           }
           break;
...
}


public static Activity getGameActivity() {
  return gameActivity;
 }

 public static void setGameActivity(Activity gameActivity) {
  MyAppActivity .gameActivity = gameActivity;
 }


///< C++에서 JNI로 호출되는 함수
public static void ShowDungeons()
{
  Message msg = new Message();
        msg.what = DUNGEONS_SHOW;
       handler.sendMessage(msg);
}

 빌드 후 실행하고 C++딴에서 JNI로 연결한 것을 호출되면 이렇게 게임에서 Dungeons Activity로 전환이 됩니다. 가운데 콤보박스를 누르면 다른 아이템을 선택 할 수 있죠. 전 Potions 즉 관리되지 않는 유명인 소모성 아이템 testitem2로 바꿔서 Buy버튼을 눌렀습니다.

 Google Play 스토어가 열리더군요. 그런데 '항목을 찾을 수 없습니다'. 라는 오류가 뜹니다. 이것 말고도 다른 에러가 발생할 수 있습니다. 해결책은 따로 정리를 했으니 링크를 확인하세요.

 위 링크를 통해 에러들을 해결 후 진행을 하면 위 스샷과 같은 화면이 나올 수 있습니다. 저는 결제 수단을 아직 추가를 안했기 때문인데요, 계속하기를 누릅니다.

 신용카드 추가를 선택 한 후 계속

 신용카드 정보를 기입해 줍니다. 밑으로 더 입력란이 있으니 스크롤 하셔서 마져 입력 후 저장을 누릅니다.

 드디어 인앱 제품이 나옵니다. Google Play 결제 시스템 서비스 약관에 동의합니다. 옆의 체크박스를 체크하면 동의 및 구매 버튼이 Enable이 됩니다. 구매를 하시면,

MarketBillingService.sendResponseCode: Sending response RESULT_OK for request xxxxxxxxxxxxxxxxxx to org.xxxx.game.

 로그와 '감사합니다 곧 아이템이 추가됩니다' 메세지와 함께 다시 Dungeons 위젯창으로 넘어갑니다.

 소모성 말고 관리되는 유형의 아이템을 한번 구입 후 다시 구입하면 위와 같이 '이 항목을 이미 구입했거나 구입 대기중입니다.' 이미 구입한 항목임 메세지가 나오며

MarketBillingService.sendResponseCode: Sending response RESULT_DEVELOPER_ERROR for request xxxxxxxxxxxxxxx to org.xxxx.game.

 이상하게 로그는 RESULT_DEVELOPER_ERROR 이게 나오는군요. 아무튼 중요한 것은 최대한 빨리,


 Google Checkout으로 가서 판매자 계정으로 로그인 하신 후 결제 취소를해서 환불처리해야 합니다. 안 그러면 실제로 신용카드로 결제가 이루어진것이라 돈 날라갑니다. 테스트 계정으로 등록된 상태인데도 실제로 결제가 되네요.

 마지막으로 중요한 부분이 있는데 인앱 상품 구입이 이루어진 후 결과값에 대한 처리를 해야겠죠. Dungeons.java 파일의 onRequestPurchaseResponse 함수르 그 역활을 합니다. 로그만 출력하고 있는데 이부분을 ResponseCode와 request.mProductId에 따라 처리하면 되겠죠.

 또한 Dungeons를 개발중인 App에 바로 쓰기보다는 최적화를 통해 버릴건 버리고 해야할 듯합니다. 특히나 Layout부분은 불필요해 보이고 여기저기 뺄 부분이 있네요.

 결과값에 대한 처리는 Android쪽 출시만 고려한다면 Java로 개발해도 되겠지만 저희 회사 상황은 그렇지 안죠. 이제 저는 Framework쪽에 C++에서 공개 키 설정과 아이템 설정, 구매등을 JNI로 Android에 보내는 것과 Android에서 인앱 결과 정보를 게임에서 활용하기 위해 C++로 넘겨서 주는 것이 남아있네요.

 마지막으로 App을 종료하면 이렇게 'Dungeons & Subscriptions Example(이)가 중지되었습니다. 에러가 발생하는데 대충보니 Android관련 BillingService쪽 문제인 듯합니다. 이는 따로 정리를 해놨으니 링크를 참고하세요

댓글

  1. 아아앓핳아아맘나나아아아아앜앜앜아아아
    사랑합니다

    답글삭제
  2. 염치없지만 질문드려봅니다..Android에서 인앱 결과 정보를 게임에서 활용하기 위해 C++로 넘겨 주는 방법에 대한 자료를 얻을 수 있을까요 ㅠ

    답글삭제
    답글
    1. jni부분을 말씀하시는 것 같은데
      http://westwoodforever.blogspot.kr/2012/10/cocos2d-x-jni-activity-ui-thread.html
      여기를 함 봐보세요..

      삭제

댓글 쓰기

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

크로스 스레드 작업이 잘못되었습니다. xxx 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다