2

Android が提供する Dungeons の例から作業していますが、ほぼ正しく理解できたように感じますが、ユーザーが [戻る] ボタンを押して購入を取り消したかどうかを検出する方法がわかりません。これが私がこれまでに持っているものです:

Button buy = (Button)findViewById(R.id.buy); 
buy.setOnClickListener(new Button.OnClickListener() 
{  
   public void onClick(View v) 
   {                                           
     try
     {
        if (mBillingService.requestPurchase(issueProductId, 
                                                Consts.ITEM_TYPE_INAPP , null)) 
        {
          // Not sure what to do here. Has the person been sent to the buy screen yet or no?
          // There are these strings I need to check for but not entirely certain how:                

          if(mBillingService.checkBillingSupported(Consts.ITEM_TYPE_INAPP))
          { 
                 // OK
          } 
          else 
          {
             // If billing is not supported,  give them the item for free
                 Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
                 ExtraHelpActivity.this.startActivity(myIntent);    
          }    

          try
          {   
          if (mBillingService.requestPurchase(issueProductIdPsych, 
                     Consts.ITEM_TYPE_INAPP ,  null)) 
          {
                  // HOW DO I CHECK HERE IF THE USER CANCELED OUT OF THE PURCHASE? 
                  // EVEN ON CANCEL, THEY ARE BEING TAKEN TO THE ITEM THAT THEY NEED TO PAY FOR.  


              // Send them to the screen of the article.
                  Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
              ExtraHelpActivity.this.startActivity(myIntent);                         
          } 
        }
     catch ( Exception e )
     {
        // Report exception.
     }  
     });

混乱しているインラインコメントをいくつか追加しました。その人が商品を購入したのか、キャンセルしたのか、読み方がわかりません。誰かがこれで私を助けることができれば、それは素晴らしいことです.

現在、このコードによって購入画面が表示され、購入する人もいますが、キャンセルを押すと、購入していない商品に移動します。:)

編集:

ちなみに、ユーザーが購入済みのアイテムに戻ってきた場合、購入リクエストの状態は変化しませんよね?では、最終的にどのメソッドがトリガーされるのでしょうか? 1回の購入でテストしたところ、記事のある1つの画面へのアクセスを購入できましたが、支払い画面でそのアイテムを既に購入したことが示され、次のページに移動しないため、再びアクセスできなくなりました.

私の新しい onStateChanged メソッドは次のようになります。

@Override
public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
                int quantity, long purchaseTime, String developerPayload) 
{
    if (purchaseState == PurchaseState.PURCHASED) 
    {
        mOwnedItems.add(itemId);

        if ( itemId != null && itemId.trim().equals("3") )
        {
        Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
        ExtraHelpActivity.this.startActivity(myIntent);
        }
        if ( itemId != null && itemId.trim().equals("4") )
        {
           Intent myIntent = new Intent(ExtraHelpActivity.this, NumberOfBusinessesActivity.class);
    }                
   }
   else 
   if (purchaseState == PurchaseState.CANCELED) 
   {  
                // purchase canceled
   } 
   else 
   if (purchaseState == PurchaseState.REFUNDED) 
   {
                // user ask for a refund
   }
   else
   {   
                if ( itemId != null && itemId.equals("3") )
                {
                      Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
                      ExtraHelpActivity.this.startActivity(myIntent);
                }
                if ( itemId != null && itemId.equals("4") )
                {
                      Intent myIntent = new Intent(ExtraHelpActivity.this, NumberOfBusinessesActivity.class);
                      ExtraHelpActivity.this.startActivity(myIntent);   
                }                   
     }           
}

そして、私がそれをテストして記事を購入したときif (purchaseState == PurchaseState.PURCHASED)、itemId idが「3」または「4」であっても、その中にある場合は個人ではなく、個人には届きました

編集:

これは、アクティビティの開始時に製品 ID を宣言する方法です。

String issueProductIdWebMarketing = "1";    
    String issueProductIdDonate = "2";  
    String issueProductIdPsych = "3";
    String issueProductIdNumberofBusinesses = "4";

ありがとう!!

4

2 に答える 2

3

請求統合ガイドによると:

要求されたトランザクションの状態が変わると (たとえば、購入がクレジット カードに正常に請求された場合や、ユーザーが購入をキャンセルした場合)、Google Play アプリケーションは IN_APP_NOTIFY ブロードキャスト インテントを送信します。このメッセージには、REQUEST_PURCHASE リクエストのトランザクションの詳細を取得するために使用できる通知 ID が含まれています。

そして意図com.android.vending.billing.PURCHASE_STATE_CHANGEDは含まれていますpurchaseState

注文の購入状況。可能な値は、0 (購入済み)、1 (キャンセル済み)、2 (返金済み)、または 3 (期限切れ、サブスクリプション購入のみ) です。

ソース(表 4)


編集: ダンジョンのサンプルでは、​​ジョブを実行する内部クラスの拡張PurchaseObserver(Dungeonsアクティビティを参照) があります。特に ( onPurchaseStateChange)を参照してください。


EDIT2: いくつかの疑似コード

アクティビティDungeons内 (SDK サンプルのクラス):

Button buy = (Button)findViewById(R.id.buy); 
buy.setEnabled(false);
buy.setOnClickListener(new Button.OnClickListener() {  
    public void onClick(View v) 
    {
        // show purchase dialog and call mBillingService.requestPurchase() on dialog validation
    }
});

// request to see if supported
if (!mBillingService.checkBillingSupported()) {
    // not supported
}

オブザーバー(DungeonsPurchaseObserverサンプル内):

public void onBillingSupported(boolean supported, String type) {
    if (type == null || type.equals(Consts.ITEM_TYPE_INAPP)) {
        if (supported) {
           // billing supported: enable buy button
        } else {
           // billing not supported: disable buy button
        }
    }
}

public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
    int quantity, long purchaseTime, String developerPayload) {
    if (purchaseState == PurchaseState.PURCHASED) {
        // item purchased
    } else if (purchaseState == PurchaseState.CANCELED) {
        // purchase canceled
    } else if (purchaseState == PurchaseState.REFUND) {
        // user ask for a refund
    }
}
于 2012-08-25T13:30:11.283 に答える
1

問題は、呼び出しmBillingService.requestPurchaseが同期していないことです。そのため、購入が成功したかどうかをすぐに確認することはできません。

ライブラリAndroidBillingLibraryを使用することをお勧めします。それを使用すると、Google Play のすべてのイベントを簡単に取得できます。そのために、ヘルパーまたはからonRequestPurchaseResponse()およびを使用できます。onPurchaseStateChanged()AbstractBillingActivityAbstractBillingFragment

于 2012-08-26T12:00:41.467 に答える