robotmedia / AndroidBillingLibrary

Android Market In-app Billing Library
532 stars 179 forks source link

Configuration is null #18

Closed tuanbach closed 13 years ago

tuanbach commented 13 years ago

Hi,

First of all thanks so much for your great work.

I'm playing with the lib for few days now and i reached an issue since this morning i can't figure out how does it happen.

The code seems to work and since yesterday the Billingcotroller replies me to set the public key. I already set up the public key and as i said the code worked for few days.

By inspecting the code (BillingController), i found that the configuration is always null that's why i got this warning. But i can't figure why...

Any help is welcome.

here is the simple code i use:

    public class InAppBilling extends AbstractBillingActivity {

    private boolean once;       

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);     

        final Bundle msg = this.getIntent().getExtras();            

        //InAppBilling.this.requestPurchase(msg.getString("item"));

        //test
        this.requestPurchase("android.test.purchased");

        once  = true;        
    }

    // billing

    public void showInfo(String msg)
    {
        AlertDialog alert = new AlertDialog.Builder(this).create();
        alert.setTitle("Information");
        alert.setMessage(msg);
        alert.setIcon(R.drawable.icon);
        alert.setButton("Ok", new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int which) {
                 InAppBilling.this.onBackPressed();
            } });
        alert.show();
    }

    @Override
    protected void onResume() {
       super.onResume();   
       if(once)
            {once=!once;}
        else
            {onBackPressed();}
   }

    @Override
    public void onBillingChecked(boolean supported) {
        if(supported)
            return;
        showInfo("Sorry In-App billing is not available from your phone, try our product later.");
    }
    @Override
    public void onPurchaseCancelled(String itemId) {
        showInfo("You sucessfully cancelled the item " + itemId);       
    }
    @Override
    public void onPurchaseExecuted(String itemId) {         
        showInfo("Thank you. You sucessfully purchased the item " + itemId);
        ModelList.unlocked(this,itemId);
    }       

    @Override
    public void onPurchaseRefunded(String itemId) {
        showInfo("You sucessfully refunded the item " + itemId);
    }
    @Override
    public byte[] getObfuscationSalt() {
        // TODO Auto-generated method stub          
        return null;
    }
    @Override
    public String getPublicKey() {
        // TODO Auto-generated method stub
        return "myKEYwasHERE";
    }       
    }
hpique commented 13 years ago

I suggest putting a break-point in BillingController.setConfiguration and make sure it's called by AbstractBillingActivity.onCreate.

tuanbach commented 13 years ago

It's actually what I did, i changed the code as below:

 /**
 * Sets the configuration instance of the controller.
 * 
 * @param config
 *            configuration instance.
 */
public static void setConfiguration(IConfiguration config) {
    if(config == null)
        Log.w(TAG,"setConfiguration param is null");
    configuration = config;
    if(configuration == null)
        Log.w(TAG,"setConfiguration is not working");       
}

I got the two logs warning. That's why i got lost, how "this" (InAppBilling extends AbstractBillingActivity) could be null if actually it's "this" who called the method....

So my guess is something happened after the call which change the configuration to null...

Thanks for your support

hpique commented 13 years ago

You should get the two log warnings when setConfiguration is called by onDestroy (which sets it to null).

I suggest to add a break-point and debug. Make sure setConfiguration is called on onCreate before onDestroy is called.

tuanbach commented 13 years ago

Thank you I fixed it. Actually I called onBackPressed() too quickly so the onDestroy was called before onPurchase{State}()

Now I wait for the answer. But it rises a new problem, what if there is no answer? I mean it could happen that phone lost the network or any other problem. In this case I don't want the user stock on my purchase screen. How can i handle this case please?

Is there any "default" method which will be call after a timeout?

Many thks.

hpique commented 13 years ago

Unfortunately that's an Android in-app billing issue. There's not much our library can do about it.