본문 바로가기

나의 플랫폼/안드로이드

[Android] IAPHelper handleActivityResult

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

안드로이드 인앱 결제를 하고자 한다면, 

누구든지 TrivialDrive (https://github.com/googlesamples/android-play-billing) 샘플 소스를 한번 정도 테스트 해봤을 것이다. 


이번 내용에서 인앱 결제 샘플 소스에서 IapHelper에 정의된 값으로 넘어오지 않아 고민하는 분들에게 참고드리고자 올린다.

(정말 간단한 내용이라.. 올리기도 그렇지만 자그마한 도움이라도 됐으면 해서...)


IapHelper 클래스에 보시면 아래와 같이 정의가 되어 있습니다.


// Billing response codes

    public static final int BILLING_RESPONSE_RESULT_OK = 0;

    public static final int BILLING_RESPONSE_RESULT_USER_CANCELED = 1;

    public static final int BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE = 2;

    public static final int BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE = 3;

    public static final int BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE = 4;

    public static final int BILLING_RESPONSE_RESULT_DEVELOPER_ERROR = 5;

    public static final int BILLING_RESPONSE_RESULT_ERROR = 6;

    public static final int BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED = 7;

    public static final int BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED = 8;


// IAB Helper error codes

    public static final int IABHELPER_ERROR_BASE = -1000;

    public static final int IABHELPER_REMOTE_EXCEPTION = -1001;

    public static final int IABHELPER_BAD_RESPONSE = -1002;

    public static final int IABHELPER_VERIFICATION_FAILED = -1003;

    public static final int IABHELPER_SEND_INTENT_FAILED = -1004;

    public static final int IABHELPER_USER_CANCELLED = -1005;

    public static final int IABHELPER_UNKNOWN_PURCHASE_RESPONSE = -1006;

    public static final int IABHELPER_MISSING_TOKEN = -1007;

    public static final int IABHELPER_UNKNOWN_ERROR = -1008;

    public static final int IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE = -1009;

    public static final int IABHELPER_INVALID_CONSUMPTION = -1010;

    public static final int IABHELPER_SUBSCRIPTION_UPDATE_NOT_AVAILABLE = -1011;


저같은 경우는 구매 요청 하고나서 소비가 되지 않았다는 콜백을 받고 싶었는데 

샘플 소스를 보면 계속 IABHELPER_USER_CANCELLED 값만 넘어옵니다.

소비가 되지 않았다는 내용을 알수가 없었죠.


원인을 보니 IapHelper 안에 있는 handleActivityResult 함수에 있었습니다.


안에 보시면 아래와 같이 되어 있어요.


else if (resultCode == Activity.RESULT_CANCELED) {
logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));
result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled.");
if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);
}

resultCode는 Canceled 가 맞는데, 중요한 부분이 reponseCode 입니다.

responseCode와는 상관 없이 기본 IapHelper 에서는 IABHELPER_USER_CANCELLED 를 넘기고 있죠.

그래서 아래와 같이 수정을 하면!


else if (resultCode == Activity.RESULT_CANCELED) {
logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));
result = new IabResult(responseCode, getResponseDesc(responseCode));
if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);
}

responseCode에 맞게 결과를 받을 수 있습니다.

소스에서 보신 바와 같이 onIabPurchaseFinished 콜백 함수를 통해서 확인 하실 수 있어요.


참고하세요.