Frage

OK, also habe ich seit Tagen versucht, dies zu beheben, und ich komme nicht hierher und suche jemanden, der meine Arbeit für mich erledigt, da ich jede einzelne Fehlermeldung in der Logcat beherrscht und behoben habe. Ich entwickle ein Android -Spiel mit Andegine (dies könnte Teil des Problems sein, so dass es helfen kann, damit vertraut zu sein). Ich mache nichts zu schick, meine Spielaktivitäten sind alle einzelnen Szene und haben keine Physik oder ähnliches, nur ein paar Sprites und Texturen. Ich habe auch Anding für alle anderen Aktivitäten in meinem Spiel verwendet, weil ich es für eine sehr einfache Möglichkeit finde, grafisch ansprechende Bildschirme einzurichten. Ein solcher Bildschirm ist mein In-App-Store, in dem Benutzer Levelpacks und neue Sprites kaufen können. Der Rechnungsteil davon funktioniert alles großartig, die Einkäufe gehen auf den Markt und dort gibt es nichts zu kompliziertes ...

Wenn der Benutzer auf Kauf klickt, wird der Marktbildschirm angezeigt und lädt das von ihm ausgewählte Produkt (dies sind echte Produkte, nicht die Android -Tests, obwohl das Spiel nicht veröffentlicht wird). Der Marktbildschirm taucht über die aktuelle Aktivität auf, unabhängig davon, ob ich die Implementierung von "Android 2.0" verwende, wo sie Teil des Stacks des Spiels oder die Implementierung "Android 1.6" und Teil seines eigenen Stapels verwendet. Ich würde es vorziehen, die Android 2.0 -Implementierung zu verwenden, aber wenn ich nur die 1.6 zur Arbeit bringen kann, werde ich das nehmen. Das Problem tritt jedoch auf, wenn der Benutzer den Kauf entweder mit der Rückbutton abbricht oder den Kauf mit einer Kreditkarte abschließt. Beide führen dazu raus und verursacht eine Kraft in der Nähe). Der Kauf geht OK durch, aber der Benutzer erhält das Produkt nicht, da die Game Force beendet, bevor wir zum Code kommen, um die Artikel des Benutzers im Spiel zu ändern. Jetzt habe ich dieses Tutorial (http://www.anddev.org/advanced-tutorials-f21/simple-inapp-billing-payment-t52060.html) verwendet, ohne viel von irgendetwas zu ändern. Die Billinghelper -Klasse ist am wichtigsten, da sie die Methode von RequestPurchase () und die StartBuypageActivity () -Methoden hält. Ich rufe den Kauf von Anfragen bei meiner Storefront -Aktivität wie folgt an:

            BillingHelper.requestPurchase(StoreFront.this, itemID); 

Und im Vorfeld der Ladenfront habe ich dieses Zeug (wie es von der Tut erzählt wird):

        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
        }
    };

};

Ich glaube also nicht, dass das Problem dort liegt. Hier sind die relevanten Teile von 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());
    }
}

Was ich versucht habe, mit einer Vielzahl von Argumenten als "ActivityContext" wie StoreFront aufzurufen. Dies ist GetApplicationContext (), ein statischer Kontextspeicher an anderer Stelle, eine statische Aktivität, die an anderer Stelle gespeichert ist, getBaseContext () alles, was ich an denken kann ...

Hier ist die andere relevante Aktivität

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

Nichts Besonderes, ich möchte nur, dass der Benutzer zu einer meiner verschiedenen Aktivitäten zurückgegeben wird (vorzugsweise im Storefront), wenn er den Artikel entweder kaufen oder während des Vorgangs zurückdrückt. HILFE BITTE!

Bearbeiten: Ich möchte eine mögliche Lösung, damit die In-App-Abrechnung nach Abschluss des Kaufs zu meiner App zurückkehren kann, sogar die chaotischste Lösung.

BEARBEITEN

Ein Logcat und eine Methodeaufrufe des Problems:

  "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. 

Außerdem habe ich dies auf einem anderen Telefon getestet (ein anderer Entwickler, mit dem ich zusammenarbeite, der tatsächlich Dinge darin kaufen kann, aber dennoch den schwarzen Bildschirmfehler erhält) und er hat nie die Handlermeldungen erhalten, die Sie in Ihrem Kommentar erwähnt haben

Bearbeiten: Wenn ich erraten müsste, wo der Fehler ist, würde ich sagen, dass es das ist

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

Beachten Sie, dass die unterbrochene Ausnahme von der Andengine -Bibliothek erwartet wird, was ein roter Hering ist.

Auch (ich hoffe, dies ist hier erlaubt) Ich werde PayPal -Belohnung für eine Lösung anbieten. Wenn dies gegen die Bedingungen von SO ist, dann löschen Sie diese Zeile einfach, bitte schließen Sie diese Frage nicht.

War es hilfreich?

Lösung

Ich kann wissen, was los ist, und ich habe einen Test für Sie. Auf dem Kaufbildschirm wird ein Finish -Anruf ausgeführt, nachdem der Benutzer den Kauf gestrichen oder den Kauf abgeschlossen hat. Für mich driftete der Finish -Anruf aus irgendeinem Grund in die aktuell laufende Aktivität und (Schließung ??? It).

Hier ist die relevante Zeile aus dem Protokoll:

06-16 11: 20: 22.774: WARN/ActivityManager (132): DOPPICATION FINISHANGE ANFORMATION FÜR HistoryRecord {40ACE828 com.android.vending/.billing.inappbuypageaktivität}

Ich glaube, ich habe dies in meinem Codeproblem behoben, ist, dass ich mich nicht genau erinnern kann, was ich getan habe (vielleicht habe ich in meinem Kauf vollständig beendet ...)

Ich weiß nichts über und mitgen, aber was würde passieren, wenn ein Finish -Anruf auf die Haupt- und Generaktivität eingerufen würde? Ich würde mir vorstellen, dass es die Ausführung stoppen würde und Sie könnten einen schwarzen Bildschirm und einen App -Absturz bekommen.

Um dies zu testen, erstellen Sie eine separate Aktivität für Ihre Kaufseite. Muss nicht kompliziert sein - vielleicht kaufen Sie es einfach ein Konserven, nachdem es gestartet ist. Führen Sie Ihren Code aus und prüfen Sie, ob Sie noch den schwarzen Bildschirm des Untergangs erhalten. Meine Wette: Es kann aus der Aktivität zurück in Ihr Spiel herauskommen, aber ich denke, es wird funktionieren.

Hoffe das hilft und viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top