У меня возникла небольшая проблема с исключением NullPointerException в моем приложении после завершения тестовой покупки через библиотеку In Billing V3.
Я могу успешно вызвать тестовую покупку, просто щелкнув конкретный пункт меню.Моя проблема в том, что после закрытия окна тестовой покупки вместо получения информации о том, был ли предмет уже куплен, или какой-либо другой информации в logcat, он выдает ошибку NPE, как я вставлю ниже:
Error in handleActivityResult
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
at org.json.JSONTokener.nextValue(JSONTokener.java:94)
at org.json.JSONObject.<init>(JSONObject.java:156)
at org.json.JSONObject.<init>(JSONObject.java:173)
at com.anjlab.android.iab.v3.BillingProcessor.handleActivityResult(BillingProcessor.java:932)
at com.example.android.visitri.MainActivity.onActivityResult(MainActivity.java:806)
at android.app.Activity.dispatchActivityResult(Activity.java:6931)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4090)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4137)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
В противном случае кажется, что моя настройка функций библиотеки для биллинга в приложении правильная?Может быть, я получаю эту ошибку NPE, чтобы выбросить, потому что я просто использую пробную покупку или что-то с моей настройкой неправильно?
Вы можете найти onActivityResult (где возникает ошибка) в нижней части кода, вставленного ниже.
BillingProcessor bp;
---
bp = BillingProcessor.newBillingProcessor(this, null, this);
bp.initialize();
---
if (i == R.id.more_menu) {
View menuItemView = findViewById(R.id.more_menu);
PopupMenu popup = new PopupMenu(this, menuItemView);
// Inflate the menu from xml
popup.inflate(R.menu.popup_more_menu);
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_remove_ads:
boolean isAvailable =
BillingProcessor.isIabServiceAvailable(MainActivity.this);
// If the Play Store isn't installed on the phone (if it's a certain
// Chinese phone, older phone, or otherwise), don't run the purchase.
if (!isAvailable) {
return true;
}
// Checks to see if Billing is supported,
// and if it is, run the purchase.
boolean isOneTimePurchaseSupported = bp.isOneTimePurchaseSupported();
if (isOneTimePurchaseSupported) {
bp.purchase(MainActivity.this, "android.test.canceled");
}
return true;
}
}
});
---
@Override
public void onBillingInitialized() {
/*
* Called when BillingProcessor was initialized and it's ready to purchase
*/
}
@Override
public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
/*
* Called when requested PRODUCT ID was successfully purchased
*/
}
@Override
public void onBillingError(int errorCode, @Nullable Throwable error) {
/*
* Called when some error occurred. See Constants class for more details
*
* Note - this includes handling the case where the user canceled the buy dialog:
* errorCode = Constants.BILLING_RESPONSE_RESULT_USER_CANCELED
*/
}
@Override
public void onPurchaseHistoryRestored() {
/*
* Called when purchase history was restored and the list of all owned PRODUCT ID's
* was loaded from Google Play
*/
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!bp.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onDestroy() {
if (bp != null) {
bp.release();
}
super.onDestroy();
}
Большое спасибо за любой совет или вклад, который вы могли бы получить для меня!:)