onIabPurchaseFinished는 호출되지 않았습니다.


111

첫 번째 앱에 대해 인앱 결제를 설정하려고 시도했으며 android.test.purchased sku를 사용하고 있습니다. 구매가 이루어지고 SKU를 내 인벤토리에 넣을 수는 있지만 제목에서 알 수 있듯이 onIabPurchaseFinished는 호출되지 않습니다.

이 로그와 관련이있을 수 있습니다. "포커스 된 뷰 com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0에 ID가 없기 때문에 어떤 뷰에 포커스가 있는지 저장할 수 없습니다." Google Play로 이동하기 직전에 나타납니다. 그게 무슨 뜻인지 잘 모르겠지만 ...

구매 시작 :

mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");

그리고 리스너 :

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {

    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase info) {
        System.out.println("Purchase Finish heard something");

        if (result.isFailure()) {
             Log.d(TAG, "Error purchasing: " + result);
             return;
        } else{
                Log.d(TAG,"Success!");
             }


    }
};

탭 내에서이 작업을 수행하려고한다는 것을 추가해야합니다
AAAton

프로그래밍 방식으로 ID를 설정했지만 차이는 없습니다.
AAAton 2013

답변:


206

다음을 호출하는 활동에 이것을 추가하십시오 mHelper.launchPurchaseFlow(..).

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}

16
같은 문제가 있었고 완벽하게 작동했습니다. 하지만 제가 알고 싶은 것은 왜 콜백이 사람이 생각하는 것처럼 실행되지 않는지, 왜 우리 자신에게 전화를 걸어야 하는가입니다. 종류의 콜백 쓸모가 있습니다 : /
스파이더

4
또한 나를 도왔다. @Spider, Activity에서이 메서드가 필요한 이유는 그렇지 않으면 mHelper의 handleActivityResult () 메서드가 호출되지 않기 때문입니다. 즉, 이것은 활동에 필요한 실제 / 표준 handleActivityResult ()이며 mHelper는 실제로 일반적인 오래된 방법입니다.
gcl1 2013-04-12

8
감사합니다. 문서의 버그입니다 (이것이 필요하거나 IabHelper에 필요하다고 언급 한 적이 없습니다. IabHelper의 launchPurchaseFlow ()는 startIntentSenderForResult를 호출합니다. 완료되면 활동의 onActivityResult ()를 호출합니다.
Jerry Brady

3
나는이 문제를 발견했을 때 나는 내 문제를 해결했다고 생각 ... 그때 나는 이미이 기능을 구현했고 그것이 아직도 작업 ... 않습니다 실현 한숨
매트 K

3
Fragment에서 onActivityResult ()를 재정의하는 것은 작동하지 않으며 Activity에서 수행되어야합니다
cprcrack

8

방금 또 다른 중요한 사실을 발견했습니다. 구매 흐름을 시작하는 데 사용되는 requestCode가> = 0이어야합니다!

난 "new Random (). nextInt ()"를 사용하여 임의의 requestCode를 생성했고 때로는 작동했지만 때로는 그렇지 않았습니다. 이제 다음 문서에서 requestCode가 음수가 아니어야한다는 것을 알았습니다.

http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29


3

나는 같은 문제가 있었고 onActivityResult 도 호출되지 않았습니다. @Ghulam의 답변
에서 영감을 얻어 활동 onActivityResult 가 조각의 onActivityResult를 자동으로 호출하지 않으므로 수동으로 수행해야 한다는 것을 깨달았습니다 .

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(mCurrentFragment!= null){
            mCurrentFragment.onActivityResult(requestCode, resultCode, data);
        }
    }

제 경우에는이 답변이 효과가 있었지만 기본 활동에 OnActivityResult 재정의를 추가해야했습니다 ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn

1

protected void onActivityResult ();를 호출해야합니다. MainActivity (Trivial Drive) 대신 부모 활동에서 Trivial Drive Activity 인 MainActivity를 호출합니다.

구매가 성공하면 결과 코드 값 -1을, 그렇지 않으면 0을 받게됩니다.


0

나는 같은 문제에 직면했고 수용된 솔루션이 이미 구현되었지만 그 원인을 알 수 없었습니다. 새로운 Google Play 결제 라이브러리 1.0 (2017 년 9 월 19 일 출시)으로 이동 하면 문제가 해결되었습니다.

다음 링크가 새 라이브러리를 구현하려는 사람에게 도움이되기를 바랍니다.

릴리스에 대한 Google의 블로그 게시물

Google의 YouTube 동영상

Play 결제 라이브러리 교육 강의

Google의 Trivial Drive v2 샘플

Google I / O 2017 중에 게시 된 Play 결제 라이브러리 코드 랩

Play 결제 라이브러리 문서

클래스 및 메서드에 대한 공식 참조

릴리스 노트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.