onIabPurchaseFinishing không bao giờ được gọi.


111

Tôi đã cố gắng thiết lập thanh toán trong ứng dụng cho ứng dụng đầu tiên của mình và đang sử dụng sku android.test.purchased. Giao dịch mua được thực hiện và tôi quản lý để đưa SKU vào kho của mình, nhưng, như tiêu đề đã nói, onIabPurchaseFinishing, không bao giờ được gọi.

Tôi nghĩ rằng nó có thể liên quan đến Nhật ký này: "Không thể lưu chế độ xem nào có tiêu điểm vì chế độ xem có tiêu điểm com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 không có id". Nó bật lên, ngay trước khi chuyển đến Google Play. Tôi thực sự không chắc điều đó có nghĩa là gì ...

Khởi chạy mua hàng:

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

Và người nghe:

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!");
             }


    }
};

Tôi có thể nên nói thêm rằng tôi đang cố gắng thực hiện việc này từ trong một tab
AAAton

Tôi đã đặt id theo cách lập trình, nhưng không có sự khác biệt.
AAAton

Câu trả lời:


206

Hãy thử thêm điều này vào Hoạt động gọi 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
có cùng một vấn đề và điều đó hoạt động hoàn hảo. Nhưng điều tôi muốn biết là tại sao lệnh gọi lại không được thực thi như người ta vẫn nghĩ, tại sao chúng ta phải thực hiện lệnh gọi đó cho chính mình? Kiểu làm cho việc gọi lại trở nên vô ích: /
Spider

4
Cũng đã giúp tôi, thx. @Spider, lý do bạn cần phương thức này trong Activity của mình là vì nếu không phương thức handleActivityResult () của mHelper sẽ không được gọi. Nói cách khác, đây là handleActivityResult () thực / tiêu chuẩn cần thiết trong Activity và mHelper's thực sự chỉ là một phương thức cũ thông thường.
gcl1

8
Cảm ơn vì điều đó. Đó là một lỗi trong tài liệu (họ không bao giờ đề cập đến việc cần điều này hoặc trong IabHelper. IabHelper's khởi chạyPurchaseFlow () gọi startIntentSenderForResult - sẽ gọi hoạt động của bạn onActivityResult () khi nó kết thúc.
Jerry Brady

3
Tôi nghĩ rằng tôi đã giải quyết vấn đề của tôi khi tôi tìm thấy này ... sau đó tôi nhận ra rằng tôi đã thực hiện chức năng này và nó vẫn không làm việc ... thở dài
Matt K

3
Lưu ý rằng trọng onActivityResult () trên một Fragment không làm việc, nó phải được thực hiện trên một Hoạt động
cprcrack

8

tôi vừa phát hiện ra một điều quan trọng khác: Mã yêu cầu được sử dụng để khởi chạy quy trình mua hàng phải> = 0!

tôi đã sử dụng "new Random (). nextInt ()" để tạo một Mã yêu cầu ngẫu nhiên và đôi khi nó hoạt động, đôi khi không. bây giờ tôi phát hiện ra trong tài liệu sau, rằng Mã yêu cầu không được là một số âm:

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


3

Tôi gặp sự cố tương tự và kết quả onActivityResult cũng không được gọi.
Lấy cảm hứng từ câu trả lời của @ Ghulam, tôi nhận ra rằng hoạt động onActivityResult không tự động gọi onActivityResult của phân mảnh nên tôi phải làm thủ công.

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

Trong trường hợp của tôi, câu trả lời này làm việc, nhưng tôi đã phải thêm một ghi đè OnActivityResult trong hoạt động chính của tôi ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn

1

Bạn cần gọi void onActivityResult () được bảo vệ; Trong Hoạt động dành cho cha mẹ của bạn thay vì Hoạt động chính (Ổ đĩa nhỏ) mà từ đó bạn đang gọi Hoạt động chính của mình là Hoạt động ổ đĩa tầm thường.

bạn sẽ nhận được giá trị mã kết quả -1 nếu giao dịch mua thành công, ngược lại là 0.


0

Tôi đang gặp phải vấn đề tương tự và giải pháp được chấp nhận đã được triển khai nhưng không thể biết nguyên nhân gây ra điều này. Việc chuyển sang Thư viện thanh toán Google Play 1.0 mới (phát hành vào ngày 19 tháng 9 năm 2017) đã khắc phục sự cố cho tôi!

Tôi hy vọng các liên kết sau sẽ giúp ích cho ai đó muốn triển khai thư viện mới:

Bài đăng trên blog của Google về việc phát hành

Video youtube của Google

Lớp đào tạo Thư viện thanh toán Play

Mẫu Trivial Drive v2 của Google

Bảng mã Thư viện thanh toán Play được xuất bản trong Google I / O 2017

Tài liệu thư viện thanh toán trên Play

Tham khảo chính thức cho các lớp và phương pháp

Ghi chú phát hành

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.