Подтвердить что ты не робот

IabHelper.startSetup() вызывает NullPointerException

Мое приложение использует In App Billing и отлично работает на моем телефоне (Android 2.3.6). Но когда я запускаю его на эмуляторе (Android 4.4.2), он продолжает сбой при создании помощника для выполнения при покупке приложений. Он выбрасывает NullPointerException:

mHelper = new IabHelper(MainActivity.this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
    public void onIabSetupFinished(IabResult result) {
        if (!result.isSuccess()) {
            Log.d("x", "In-app Billing setup failed: " + result);
        } 
        else {             
            Log.d("x", "In-app Billing is set up OK");
        }                             
    }
});

Этот ответ говорит, что я должен поместить код выше в блок try и поместить catch в ответ ниже. При этом я получаю сообщение об ошибке, и рекомендуемое решение также помещает это в блок try-catch. Несмотря на то, что я это сделал, он все равно падает.

Может ли кто-нибудь сказать мне, как это сделать? Я полностью застрял.

Трассировка стека:

12-24 10:59:51.908: E/AndroidRuntime(2273): FATAL EXCEPTION: main
12-24 10:59:51.908: E/AndroidRuntime(2273): Process: com.sandradiependaal.mediatie, PID: 2273
12-24 10:59:51.908: E/AndroidRuntime(2273): java.lang.NullPointerException
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.sandradiependaal.meditatie.util.IabHelper.startSetup(IabHelper.java:267)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.sandradiependaal.meditatie.MainActivity$4.onItemClick(MainActivity.java:142)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AdapterView.performItemClick(AdapterView.java:299)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AbsListView$3.run(AbsListView.java:3638)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.os.Handler.handleCallback(Handler.java:733)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.os.Looper.loop(Looper.java:136)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.app.ActivityThread.main(ActivityThread.java:5017)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at java.lang.reflect.Method.invokeNative(Native Method)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at java.lang.reflect.Method.invoke(Method.java:515)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at dalvik.system.NativeStart.main(Native Method)

IabHelper.java:

 Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
 serviceIntent.setPackage("com.android.vending");
 if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {
     // service available to handle that Intent
     mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
 }
4b9b3361

Ответ 1

Это потому, что возвращаемый список не просто пуст, а фактически null. Вы можете добавить простую проверку, если список null. Почему реализация не возвращает пустой список вместо null, выходит за рамки моего понимания, но это именно то, как оно было построено.

Изменить на это:

List<ResolveInfo> queryIntentServices = mContext.getPackageManager().queryIntentServices(serviceIntent, 0);
if (queryIntentServices != null && !queryIntentServices.isEmpty()) {
        // service available to handle that Intent
        mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}

Это, по крайней мере, сделало трюк для меня с эмулятором. Это не требуется в реальном устройстве, если оно выполнено правильно.

Ответ 2

Кажется, это старый поток. Надеюсь, что этот ответ поможет кому-то, кто сталкивается с проблемой позже.  В настоящий момент BI сталкивается с той же проблемой.

IAB хелпер генерирует NPE в startSetup() только на эмуляторе. Но это происходит только на AVD, созданных с Android x.x.x в качестве цели.

Попробуйте создать свой AVD с Google API в качестве целевой. IAB хелпер не падает там, но вы по-прежнему не можете проверить фактические функции выставления счетов.

Ответ 3

Чтобы протестировать In-app Billing в приложении, вы должны установить приложение на устройстве на базе Android. Вы не можете использовать эмулятор Android для тестирования In-app Billing.

http://developer.android.com/google/play/billing/billing_testing.html