В приложениях. Проблемы с ожидаемыми намерениями и переключением мероприятий

StackOverflow https://stackoverflow.com/questions/6352150

Вопрос

Итак, я пытался исправить это в течение нескольких дней, и я не приезжаю сюда ищу кого -то, кто выполняет свою работу для меня, так как я устранения неполадок и исправил каждое сообщение об ошибке в 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. Моя ставка: это может выйти из деятельности обратно в вашу игру, но я думаю, что это сработает.

Надеюсь, что это помогает и удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top