В приложениях. Проблемы с ожидаемыми намерениями и переключением мероприятий
-
28-10-2019 - |
Вопрос
Итак, я пытался исправить это в течение нескольких дней, и я не приезжаю сюда ищу кого -то, кто выполняет свою работу для меня, так как я устранения неполадок и исправил каждое сообщение об ошибке в LogCat. Я разрабатываю игру Android, используя AndEngine (это может быть частью проблемы, чтобы быть знакомым с ней может помочь). Я не делаю ничего особенного, мои игровые занятия - все это одна сцена, и у меня нет физики или чего -то подобного, просто куча спрайтов и текстур. Я также использовал Andengine для всех других действий в моей игре, потому что я считаю, что это очень простой способ создания графически привлекательных экранов. Одним из таких экранов является мой магазин в приложении, где пользователи могут покупать уровни и новые спрайты. Счетная часть всего этого отлично работает, покупки переходят на рынок, и там нет ничего сложного ...
Когда пользователь нажимает на покупку, рыночный экран появляется и загружает выбранную ими продукт (это настоящие продукты, а не тесты Android, хотя игра не опубликована). Рыночный экран появляется из -за текущей деятельности, независимо от того, использую ли я реализацию «Android 2.0», где она является частью стека игры, или я использую реализацию «Android 1.6» и является частью его собственного стека. Я бы предпочел использовать реализацию Android 2.0, но если я смогу получить только 1.6 для работы, я возьму это. Так или иначе, проблема возникает, когда пользователь либо отменяет покупку, используя кнопку «Назад», либо завершает покупку с помощью кредитной карты, оба приводят к исчезновению экрана рынка, а приложение начинает новое действие, которое является лишь черным экраном (что в конце концов времена Вне и приводит к закрытию силы). Покупка проходит OK, но пользователь не получает продукт, потому что игра игры уходит, прежде чем мы доберемся до кода, чтобы изменить элементы пользователя в игре. Теперь для некоторого кода я использовал этот учебник (http://www.anddev.org/advanced-tutorials-f21/simple-inappling-payment-t52060.html), не изменив многое из чего-либо. Класс BillingHelper наиболее важен, поскольку он содержит метод requestPurchase () и методы StartBuypagebitiation (). Я звоню в запрос на покупку из моей витрины на витрине так:
BillingHelper.requestPurchase(StoreFront.this, itemID);
и в «Второе витрины» у меня есть это (как сказано TUT):
startService(new Intent(mContext, BillingService.class));
BillingHelper.setCompletedHandler(mTransactionHandler);
...
//some handler that billing needs
public Handler mTransactionHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
Log.i(TAG, "Transaction complete");
Log.i(TAG, "Transaction status: "+BillingHelper.latestPurchase.purchaseState);
Log.i(TAG, "Item purchased is: "+BillingHelper.latestPurchase.productId);
if(BillingHelper.latestPurchase.isPurchased()){
//TODO do something here if we've completed our latest purchase,
//this should be with the status bar notifications and
//saved preferences
}
};
};
Так что я не думаю, что проблема лежит там. Вот соответствующие части BillingHelper
protected static void requestPurchase(Context activityContext, String itemId){
if (amIDead()) {
return;
}
Log.i(TAG, "requestPurchase()");
Bundle request = makeRequestBundle("REQUEST_PURCHASE");
request.putString("ITEM_ID", itemId);
try {
Bundle response = mService.sendBillingRequest(request);
//The RESPONSE_CODE key provides you with the status of the request
Integer responseCodeIndex = (Integer) response.get("RESPONSE_CODE");
//The PURCHASE_INTENT key provides you with a PendingIntent, which you can use to launch the checkout UI
PendingIntent pendingIntent = (PendingIntent) response.get("PURCHASE_INTENT");
//The REQUEST_ID key provides you with a unique request identifier for the request
Long requestIndentifier = (Long) response.get("REQUEST_ID");
Log.i(TAG, "current request is:" + requestIndentifier);
C.ResponseCode responseCode = C.ResponseCode.valueOf(responseCodeIndex);
Log.i(TAG, "REQUEST_PURCHASE Sync Response code: "+responseCode.toString());
startBuyPageActivity(pendingIntent, new Intent(), activityContext);
} catch (RemoteException e) {
Log.e(TAG, "Failed, internet error maybe", e);
Log.e(TAG, "Billing supported: "+isBillingSupported());
}
}
Который я пытался вызывать из Storefront с различными аргументами в качестве «ActivityContext», таких как StoreFront.This, GetApplicationContext (), статический контекст в другом месте, статическое действие, хранящееся в другом месте, getBaseContext () Все, о чем я мог бы подумать ... ...
Вот другая соответствующая деятельность
private static void startBuyPageActivity(PendingIntent pendingIntent, Intent intent, Context context){
//android 1.6 method
try {
pendingIntent.send(context, 0, intent);
} catch (CanceledException e){
Log.e(TAG, "startBuyPageActivity CanceledException");
}
}
Ничего особенного, я просто хочу, чтобы пользователь был возвращен в любую из моих различных видов деятельности (желательно магазин), когда они либо покупают товар, либо нажимали во время процесса. ПОМОГИТЕ, ПОЖАЛУЙСТА!
РЕДАКТИРОВАТЬ: Я хочу, чтобы любое возможное решение позволило внести счет в приложение вернуться в мое приложение после завершения покупки, даже самое беспорядочное решение.
РЕДАКТИРОВАТЬ
Logcat и метод вызовы в том, в чем проблема:
"BillingService Starting",
BillingHelper.setCompletedHandler(),
StoreFront.onStart() called,
StoreFront.onResume() called,
"BillingService Service starting with onCreate",
"BillingService Market Billing Service Successfully Bound",
"BillingService Market Billing Service Connected",
BillingHelper.instantiateHelper(),
then this is where I actually click the buy button in the store (all of that runs just when opening StoreFront):
BillingHelper.setCompletedHandler(),
BillingHelper.isBillingSupported(),
BillingHelper.amIDead(),
BillingHelper.makeRequestBundle(),
"BillingService isBillingSupported response was: RESULT OK",
BillingHelper.requestPurchase(),
BillingHelper.amIDead(),
"BillingService requestPurchase()",
BillingHelper.makeRequestBundle(),
"BillingService current request is ......",
"BillingService REQUEST PURCHASE Sync Response code: RESULT OK",
BillingHelper.startBuyPageActivity(),
"BillingService Recieved action: com.android.vending.billing.RESPONSE CODE",
"BillingService checkResponseCode got requestID..."
"BillingService checkResponseCode go responseCode RESULT ERROR"
(this is because I can't purchase on this device),
and then I get an Error message saying: "E 32427 Surface surface (identity=5925) is invalid, err=-19 (No such device)" and from there nothing works anymore.
Также я проверил это на другом телефоне (другой разработчик, с которым я работаю, который действительно может купить в нем вещи, но все еще получает ошибку черного экрана), и он никогда не получил сообщения о обработке, которые вы упомянули в своем комментарии, тоже
Изменить: если бы мне пришлось угадать, где ошибка, я бы сказал, что это
06-16 11:20:23.635: DEBUG/dalvikvm(3807): GC_EXPLICIT freed 53K, 45% free 3710K/6663K, external 1K/513K, paused 102ms
06-16 11:20:23.885: ERROR/Surface(3807): surface (identity=158) is invalid, err=-19 (No such device)
06-16 11:20:23.905: ERROR/Surface(3807): surface (identity=158) is invalid, err=-19 (No such device)
06-16 11:20:23.905: ERROR/Surface(3807): surface (identity=158) is invalid, err=-19 (No such device)
06-16 11:20:23.905: ERROR/Adreno200-EGL(3807): egliSwapWindowSurface: unable to dequeue native buffer
Обратите внимание, что прерванное исключение ожидается библиотекой Антингина, так что это красная сельдь.
Также (я надеюсь, что это допущено здесь), я предложу PayPal вознаграждение за решение. Если это против условий, так что просто удалите эту строку, не закройте этот вопрос.
Решение
Я могу знать, что случилось, и у меня есть тест для вас. Экран покупки запускает отдельный звонок после того, как пользователь отменяет покупку или завершает покупку. По какой -то причине финишный звонок превратился в в настоящее время работающую деятельность и (закрытие ???
Вот соответствующая строка из журнала:
06-16 11: 20: 22.774: Warn/ActivityManager (132): Duplicate Finish Presford для HistoryRecord {40ACE828 com.android.vending/.billing.inappbuypageActivity}
Я думаю, что я исправил это в своей проблеме с кодом, я не могу точно вспомнить, что я сделал (возможно, не позвонил в свою покупку полного обработчика ...)
Я ничего не знаю о иген, но что произойдет, если будет вызван отдельный звонок на главную и генерирующую деятельность? Я полагаю, что это прекратит выполнение, и вы можете получить черный экран и приложение.
Итак, чтобы проверить это, создайте отдельное занятие для вашей страницы покупки. Не нужно быть сложным - возможно, попросите его купить один консервированный продукт после того, как он запустится. Запустите свой код и посмотрите, дает ли он вам черный экран Doom. Моя ставка: это может выйти из деятельности обратно в вашу игру, но я думаю, что это сработает.
Надеюсь, что это помогает и удачи!