2013-05-28 2 views
0

J'ai implémenté l'exemple d'Android sur la façon d'implémenter le In-App Billing (IAB). Voici l'une des 10 classes que j'ai dû ajouter à mon code pour faire ce travail. Je pensais que je l'avais fonctionné, mais quand je l'ai testé sur un téléphone et naviguer l'application à l'activité BibleStudy ci-dessous, l'écran se charge et commence à "scintiller" ou éventuellement recharger l'écran encore et encore et ainsi il semble que l'écran est juste clignotant encore et encore.Écran clignotant plusieurs fois (rechargement?) Pendant un écran/une activité de facturation In-App

Je ne comprends pas complètement le processus IAB dans cette classe (et les 9 autres classes, d'ailleurs) donc je suis un peu confus sur où l'erreur est dans mon code ci-dessous. Donc, ma question est, qu'est-ce que c'est dans mon code ci-dessous qui fait que mon activité scintille continuellement quand elle se charge?

public class BibleStudy extends SwarmActivity { 

    static final String SKU_SPREADSHEET = "spreadsheet"; 

    boolean mIsPurchased = false; 

    TextView title, link; 
    Button purchaseBtn; 

    Context c; 

    IabHelper mHelper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.biblestudy); 

     c = this; 

     String base64EncodedPublicKey = a + b + d + e + f + g + h + i + j + k; 

     // Create the helper, passing it our context and the public key to verify signatures with 
     mHelper = new IabHelper(this, base64EncodedPublicKey); 

     // Start setup. This is asynchronous and the specified listener will be called once setup completes. 
     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
      public void onIabSetupFinished(IabResult result) { 

       if (!result.isSuccess()) { 
        // Oh noes, there was a problem. 
        complain("An error has occurred. We apologize for the inconvenience. " + c.getResources().getString(R.string.problem1) + " " + result); 
        return; 
       } 

       // Hooray, IAB is fully set up. Now, let's get an inventory of stuff we own. 
       mHelper.queryInventoryAsync(mGotInventoryListener); 
      } 
     }); 

     if(mIsPurchased == true) { 
      purchaseBtn.setText(c.getResources().getString(R.string.thankyou2)); 
      title.setText(c.getResources().getString(R.string.thankyou)); 
      purchaseBtn.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        alreadyOwned(); 
       } 
      }); 
     } else { 
      title.setText(c.getResources().getString(R.string.biblestudy)); 
      purchaseBtn.setText(c.getResources().getString(R.string.purchaseBtn)); 
      purchaseBtn.setOnClickListener(new OnClickListener() { 
       // User clicked the "Download NOW!" button. 
       public void onClick(View v) { 
        String payload = ""; 
        test(payload); 
       } 
      }); 
     } 
    } 

    public void alreadyOwned() { 

     final Dialog dialog = new Dialog(c); 
     dialog.setContentView(R.layout.alreadyowned); 

     TextView tv = (TextView)dialog.findViewById(R.id.tv); 

     tv.setText(c.getResources().getString(R.string.alreadyowned)); 

     dialog.show(); 
    } 

    public void test(String payload) { 
     mHelper.launchPurchaseFlow(this, SKU_SPREADSHEET, 10001, mPurchaseFinishedListener, payload); 
    } 

    // Listener that's called when we finish querying the items and subscriptions we own. 
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
      if (result.isFailure()) { 
       complain("An error has occurred. We apologize for the inconvenience. " + c.getResources().getString(R.string.failedtoquery) + " " + result); 
       return; 
      } 

      /* 
      * Check for items we own. Notice that for each purchase, we check 
      * the developer payload to see if it's correct! See 
      * verifyDeveloperPayload(). 
      */ 

      Purchase spreadsheetPurchase = inventory.getPurchase(SKU_SPREADSHEET); 

      mIsPurchased = (spreadsheetPurchase != null && verifyDeveloperPayload(spreadsheetPurchase)); 

      updateUi(); 
     } 
    }; 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     // Pass on the activity result to the helper for handling 
     if(!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
      // not handled, so handle it ourselves (here's where you'd 
      // perform any handling of activity results not related to in-app 
      // billing... 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 

    /** Verifies the developer payload of a purchase. */ 
    boolean verifyDeveloperPayload(Purchase p) { 
     String payload = p.getDeveloperPayload(); 

     /* 
     * TODO: verify that the developer payload of the purchase is correct. It will be 
     * the same one that you sent when initiating the purchase. 
     * 
     * WARNING: Locally generating a random string when starting a purchase and 
     * verifying it here might seem like a good approach, but this will fail in the 
     * case where the user purchases an item on one device and then uses your app on 
     * a different device, because on the other device you will not have access to the 
     * random string you originally generated. 
     * 
     * So a good developer payload has these characteristics: 
     * 
     * 1. If two different users purchase an item, the payload is different between them, 
     * so that one user's purchase can't be replayed to another user. 
     * 
     * 2. The payload must be such that you can verify it even when the app wasn't the 
     * one who initiated the purchase flow (so that items purchased by the user on 
     * one device work on other devices owned by the user). 
     * 
     * Using your own server to store and verify developer payloads across app 
     * installations is recommended. 
     */ 

     return true; 
    } 

    // Callback for when a purchase is finished 
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
      if(result.isFailure()) { 
       complain("An error has occurred. We apologize for the inconvenience. " + result); 
       return; 
      } 

      if(!verifyDeveloperPayload(purchase)) { 
       complain("An error has occurred. We apologize for the inconvenience. " + c.getResources().getString(R.string.error2)); 
       return; 
      } 

      else if(purchase.getSku().equals(SKU_SPREADSHEET)) { 
       // this appears to the user immediately after purchasing. 
       alert(c.getResources().getString(R.string.purchased)); 
       mIsPurchased = true; 
       updateUi(); 
      } 
     } 
    }; 

    // updates UI to reflect model 
    public void updateUi() { 

     if(mIsPurchased == true) { 
      link.setClickable(true); 
      link.setMovementMethod(LinkMovementMethod.getInstance()); 
      String a = "<a href='https://docs.google.com/spreadsheet/ccc?key=0At8avx-xtho6dHhkVzRUNkpJWFBNeGc4S3U1X0k0RFE&usp=sharing'>here</a>"; 
      String b = c.getResources().getString(R.string.link1) + " "; 
      String e = " " + c.getResources().getString(R.string.link3); 
      String d = b + a + e; 
      link.setText(Html.fromHtml(d)); 

      Intent intent = new Intent(BibleStudy.this, BibleStudy.class); 
      startActivity(intent); 
     } 
    } 

    void complain(String message) { 
     alert("Error: " + message); 
    } 

    void alert(String message) { 
     AlertDialog.Builder bld = new AlertDialog.Builder(this); 
     bld.setMessage(message); 
     bld.setNeutralButton("OK", null); 
     bld.create().show(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if(mHelper != null) mHelper.dispose(); 
     mHelper = null; 
    } 
} 

Répondre

0

assurez-vous que vous utilisez à droite base64EncodedPublicKey de données dans la console développeur Google.

J'ai vu votre code et j'ai du code peut-être cela va résoudre votre erreur. Vous n'avez pas inséré ce code dans votre activité, essayez d'ajouter ceci à votre activité. Si au cas où cela ne fonctionnerait pas, ne le supprimez pas, cela n'affectera pas votre code mais il est nécessaire pour l'application in-app -facturation.

// vous pouvez remplacer le fichier java BibleActivity par celui-ci. BibleActivity.java:

public class BibleStudy extends SwarmActivity { 

    static final String SKU_SPREADSHEET = "spreadsheet"; 

    boolean mIsPurchased = false; 

    TextView title, link; 
    Button purchaseBtn; 

    Context c; 

    IabHelper mHelper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.biblestudy); 

     c = this; 

     String base64EncodedPublicKey = a + b + d + e + f + g + h + i + j + k; 

     // Some sanity checks to see if the developer (that's you!) really 
    // followed the 
    // instructions to run this sample (don't put these checks on your app!) 
    if (base64EncodedPublicKey.contains("CONSTRUCT_YOUR")) { 
     throw new RuntimeException(
       "Please put your app's public key in MainActivity.java. See README."); 
    } 
      // add your packageName here 
    if (getPackageName().startsWith("add_your_package_name_here")) { 
     // throw new 
     // RuntimeException("Please change the sample's package name! See README."); 
    } 

     // Create the helper, passing it our context and the public key to verify signatures with 
     mHelper = new IabHelper(this, base64EncodedPublicKey); 

     // Start setup. This is asynchronous and the specified listener will be called once setup completes. 
     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
      public void onIabSetupFinished(IabResult result) { 

       if (!result.isSuccess()) { 
        // Oh noes, there was a problem. 
        complain("An error has occurred. We apologize for the inconvenience. " + c.getResources().getString(R.string.problem1) + " " + result); 
        return; 
       } 

       // Hooray, IAB is fully set up. Now, let's get an inventory of stuff we own. 
       mHelper.queryInventoryAsync(mGotInventoryListener); 
      } 
     }); 

     if(mIsPurchased == true) { 
      purchaseBtn.setText(c.getResources().getString(R.string.thankyou2)); 
      title.setText(c.getResources().getString(R.string.thankyou)); 
      purchaseBtn.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        alreadyOwned(); 
       } 
      }); 
     } else { 
      title.setText(c.getResources().getString(R.string.biblestudy)); 
      purchaseBtn.setText(c.getResources().getString(R.string.purchaseBtn)); 
      purchaseBtn.setOnClickListener(new OnClickListener() { 
       // User clicked the "Download NOW!" button. 
       public void onClick(View v) { 
        String payload = ""; 
        test(payload); 
       } 
      }); 
     } 
    } 

    public void alreadyOwned() { 

     final Dialog dialog = new Dialog(c); 
     dialog.setContentView(R.layout.alreadyowned); 

     TextView tv = (TextView)dialog.findViewById(R.id.tv); 

     tv.setText(c.getResources().getString(R.string.alreadyowned)); 

     dialog.show(); 
    } 

    public void test(String payload) { 
     // if device is not supported 
     if (!mHelper.subscriptionsSupported()) { 
      complain("Subscriptions not supported on your device yet. Sorry!"); 
     return; 
     } 

     mHelper.launchPurchaseFlow(this, SKU_SPREADSHEET, 10001, mPurchaseFinishedListener, payload); 
    } 

    // Listener that's called when we finish querying the items and subscriptions we own. 
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
      if (result.isFailure()) { 
       complain("An error has occurred. We apologize for the inconvenience. " + c.getResources().getString(R.string.failedtoquery) + " " + result); 
       return; 
      } 

      /* 
      * Check for items we own. Notice that for each purchase, we check 
      * the developer payload to see if it's correct! See 
      * verifyDeveloperPayload(). 
      */ 

      Purchase spreadsheetPurchase = inventory.getPurchase(SKU_SPREADSHEET); 

      mIsPurchased = (spreadsheetPurchase != null && verifyDeveloperPayload(spreadsheetPurchase)); 

      updateUi(); 
     } 
    }; 

    // replace your onActivityResult() with this one. 

    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," 
      + data); 

    if (mHelper == null) 
     return; 

    // Pass on the activity result to the helper for handling 
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
     // not handled, so handle it ourselves (here's where you'd 
     // perform any handling of activity results not related to in-app 
     // billing... 
     super.onActivityResult(requestCode, resultCode, data); 
    } else { 
     Log.d(TAG, "onActivityResult handled by IABUtil."); 
    } 
} 

    /** Verifies the developer payload of a purchase. */ 
    boolean verifyDeveloperPayload(Purchase p) { 
     String payload = p.getDeveloperPayload(); 

     /* 
     * TODO: verify that the developer payload of the purchase is correct. It will be 
     * the same one that you sent when initiating the purchase. 
     * 
     * WARNING: Locally generating a random string when starting a purchase and 
     * verifying it here might seem like a good approach, but this will fail in the 
     * case where the user purchases an item on one device and then uses your app on 
     * a different device, because on the other device you will not have access to the 
     * random string you originally generated. 
     * 
     * So a good developer payload has these characteristics: 
     * 
     * 1. If two different users purchase an item, the payload is different between them, 
     * so that one user's purchase can't be replayed to another user. 
     * 
     * 2. The payload must be such that you can verify it even when the app wasn't the 
     * one who initiated the purchase flow (so that items purchased by the user on 
     * one device work on other devices owned by the user). 
     * 
     * Using your own server to store and verify developer payloads across app 
     * installations is recommended. 
     */ 

     return true; 
    } 

    // Callback for when a purchase is finished 
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
      if(result.isFailure()) { 
       complain("An error has occurred. We apologize for the inconvenience. " + result); 
       return; 
      } 

      if(!verifyDeveloperPayload(purchase)) { 
       complain("An error has occurred. We apologize for the inconvenience. " + c.getResources().getString(R.string.error2)); 
       return; 
      } 

      if(purchase.getSku().equals(SKU_SPREADSHEET)) { 
       // this appears to the user immediately after purchasing. 
       alert(c.getResources().getString(R.string.purchased)); 
       Log.d(TAG, "Purchase is gas. Starting gas consumption."); 
      mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
       mIsPurchased = true; 
       updateUi(); 
      } 
     } 
    }; 

// Called when consumption is complete it is required for the console to verify transaction consume is completed. 
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
    public void onConsumeFinished(Purchase purchase, IabResult result) { 
     Log.d(TAG, "Consumption finished. Purchase: " + purchase 
       + ", result: " + result); 

     // We know this is the "gas" sku because it's the only one we 
     // consume, 
     // so we don't check which sku was consumed. If you have more than 
     // one 
     // sku, you probably should check... 
     if (result.isSuccess()) { 
      // successfully consumed, so we apply the effects of the item in 
      // our 
      // game world's logic, which in our case means filling the gas 
      // tank a bit 
      Log.d(TAG, "Consumption successful. Provisioning."); 
      mTank = mTank == TANK_MAX ? TANK_MAX : mTank + 1; 
      // saveData(); 
      alert("You filled 1/4 tank. Your tank is now " 
        + String.valueOf(mTank) + "/4 full!"); 
     } else { 
      complain("Error while consuming: " + result); 
     } 
     // updateUi(); 
     // setWaitScreen(false); 
     Log.d(TAG, "End consumption flow."); 
    } 
}; 


    // updates UI to reflect model 
    public void updateUi() { 

     if(mIsPurchased == true) { 
      link.setClickable(true); 
      link.setMovementMethod(LinkMovementMethod.getInstance()); 
      String a = "<a href='https://docs.google.com/spreadsheet/ccc?key=0At8avx-xtho6dHhkVzRUNkpJWFBNeGc4S3U1X0k0RFE&usp=sharing'>here</a>"; 
      String b = c.getResources().getString(R.string.link1) + " "; 
      String e = " " + c.getResources().getString(R.string.link3); 
      String d = b + a + e; 
      link.setText(Html.fromHtml(d)); 

      Intent intent = new Intent(BibleStudy.this, BibleStudy.class); 
      startActivity(intent); 
     } 
    } 

    void complain(String message) { 
     alert("Error: " + message); 
    } 

    void alert(String message) { 
     AlertDialog.Builder bld = new AlertDialog.Builder(this); 
     bld.setMessage(message); 
     bld.setNeutralButton("OK", null); 
     bld.create().show(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if(mHelper != null) mHelper.dispose(); 
     mHelper = null; 
    } 
} 

Espoir il vous aidera.

Questions connexes