Pregunta

Ok, he estado tratando de solucionar esto durante días, y no voy a buscar a alguien que haga mi trabajo por mí, ya que he estado solucionando los problemas y arreglado cada mensaje de error en el LogCat. Estoy desarrollando un juego de Android usando AndEngine (esto podría ser parte del problema, por lo que estar familiarizado con él podría ayudar). No estoy haciendo nada demasiado elegante, mis actividades de juego son una escena única y no tienen física ni nada por el estilo, solo un montón de sprites y texturas. También usé AndEngine para todas las otras actividades en mi juego porque me parece una manera muy fácil de configurar pantallas gráficamente atractivas. Una de esas pantallas es mi tienda en la aplicación, donde los usuarios pueden comprar paquetes de nivel y nuevos sprites. La parte de facturación de esto funciona muy bien, las compras pasan al mercado y no hay nada demasiado complicado allí ...

Cuando el usuario hace clic en Compre, la pantalla de mercado aparece y carga el producto que ha seleccionado (estos son productos reales, no las pruebas de Android, aunque el juego no se publica). La pantalla de mercado aparece sobre la actividad actual, independientemente de si utilizo la implementación "Android 2.0" donde forma parte de la pila del juego o uso la implementación "Android 1.6" y es parte de su propia pila. Preferiría usar la implementación de Android 2.0, pero si solo puedo hacer que el 1.6 funcione, lo tomaré. Entonces, de todos modos, el problema surge cuando el usuario cancela la compra usando el botón Atrás o completa la compra con una tarjeta de crédito, ambos resultan en la pantalla de mercado que desaparece y que la aplicación comienza una nueva actividad que es solo una pantalla negra (que eventualmente veces veces fuera y causa una fuerza cerca). La compra pasa por OK, pero el usuario no obtiene el producto porque la fuerza del juego deja antes de llegar al código para cambiar los elementos del usuario en el juego. Ahora, para algún código, utilicé este tutorial (http://www.anddev.org/advanced-tutorials-f21/simple-inapp-billing-payment-t52060.html) sin cambiar mucho de nada. La clase BillingHelper es lo más importante, ya que posee el método SoldPurchase () y los métodos STARTBUPAGACTIVITIVY (). Llamo a la compra de solicitud de mi actividad de escaparate como esta:

            BillingHelper.requestPurchase(StoreFront.this, itemID); 

Y en la información de la tienda tengo estas cosas (como lo dice el 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
        }
    };

};

Así que no creo que el problema se encuentre allí. Aquí están las partes relevantes de 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());
    }
}

Que he intentado llamar desde la tienda con una variedad de argumentos como "actividades con texto" como la tienda. Esto, getApplicationContext (), un almacén de contexto estático en otro lugar, una actividad estática almacenada en otro lugar, getBasecontext () cualquier cosa que pueda pensar ...

Aquí está la otra actividad relevante

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

Nada lujoso, solo quiero que el usuario sea devuelto a cualquiera de mis diversas actividades (preferiblemente en la tienda) cuando compran el artículo o presionan durante el proceso. ¡AYUDA POR FAVOR!

EDITAR: Quiero cualquier solución posible para permitir que la facturación en la aplicación regrese a mi aplicación después de que se complete la compra, incluso la solución más desordenada.

EDITAR

Un LogCat y el método llaman de lo que el problema:

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

También he probado esto en un teléfono diferente (otro desarrollador con el que estoy trabajando, que en realidad puede comprar cosas, pero aún obtiene el error de la pantalla negra) y él nunca recibió los mensajes del controlador que mencionó en su comentario tampoco.

Editar: si tuviera que adivinar dónde está el error, diría que es esto

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

Tenga en cuenta que la Biblioteca AndEngine espera la excepción interrumpida, por lo que es un arenque rojo.

Además (espero que esto esté permitido aquí) ofreceré una recompensa de PayPal por una solución. Si esto está en contra de los términos, entonces simplemente elimine esta línea, no cierre esta pregunta.

¿Fue útil?

Solución

Puedo saber qué pasa y tengo una prueba para que hagas. La pantalla de compra ejecuta una llamada de finalización después de que el usuario cancela la compra o completa la compra. Para mí, por alguna razón, la llamada de acabado se estaba reduciendo a la actividad actualmente en ejecución y (¿cerrando?).

Aquí está la línea relevante del registro:

06-16 11: 20: 22.774: Warn/ActivityManager (132): Solicitud de finalización duplicada para HistoryRecord {40ACE828 com.android.vending/.billing.inappbuyypageactivity}

Creo que solucioné esto en mi problema de código es que no puedo recordar exactamente lo que hice (tal vez no llamé finalizado en mi compra de controlador completo ...)

No sé nada sobre ygen, pero ¿qué pasaría si se convocara una llamada de finalización en la actividad principal ygen? Me imagino que detendría la ejecución y podría obtener una pantalla negra y un bloqueo de la aplicación.

Entonces, para probar esto, cree una actividad separada para comprar la página. No necesita ser complicado, tal vez solo compre un producto enlatado después de que se inicia. Ejecute su código y vea si todavía le da la pantalla negra de Doom. Mi apuesta: puede salir de la actividad de regreso a tu juego, pero creo que funcionará.

¡Espero que esto ayude y buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top