1

項目 ID: android.test.purchased のテスト デバイスでテストした状況があります。次に、その文字列を実際のアイテム ID に変更すると、購入ボタンを押したときにアイテムが見つかりませんというエラーが発生し始めました。

また、購入アイテムはサブスクリプションであり、1 回限りの購入ではありません。それは違いがありますか?

コードのどの部分に問題があるのか​​ 、何が欠けているのかわからなかったので、これのクラスは次のとおりです。

public class SubscribeIntroActivity extends BaseActivity
{
    IabHelper mHelper;

    // Does the user have the premium upgrade?
    boolean isSubscriber = false;   

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 105;

    // Subscribe SKU
    static final String SUBSCRIBE_SKU = "11";

    // Subscribe SKU
    static final String TAG = "BILLING";

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



        String base64EncodedPublicKey = "my_real_key";

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

        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) 
            {
                if (!result.isSuccess()) 
                {
                    // Oh noes, there was a problem.
                    //complain("Problem setting up in-app billing: " + result);
                    return;
                }

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

        // Listener that's called when we finish querying the items we own
        IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
            public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

                if (result.isFailure()) 
                {
                    //complain("Failed to query inventory: " + result);
                    return;
                }

                Log.d(TAG, "Query inventory was successful.");

                // Do we have the premium upgrade?
                isSubscriber = inventory.hasPurchase(SUBSCRIBE_SKU);
                Log.d(TAG, "User is " + (isSubscriber ? "SUBSCRIBER" : "NOT SUBSCRIBER"));

                // Check for gas delivery -- if we own gas, we should fill up the tank immediately
                if (inventory.hasPurchase( SUBSCRIBE_SKU )) 
                {
                    Log.d(TAG, "HAS SUBSCRIPTION");
                    return;
                }


                //updateUi();
                // TODO: TELL USER HE IS SUBSCIBED AND TAKE THEM TO THE QUESTION



                //setWaitScreen(false);
                Log.d(TAG, "Initial inventory query finished; enabling main UI.");
            }
        };



        Button subscribe = (Button)findViewById(R.id.subscribe);
        subscribe.setOnClickListener(new Button.OnClickListener() 
        {  
           public void onClick(View v) 
           {              
               // FIRST CHECK IF THE USER IS ALREADY A SUBSCRIBER.
              mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);


               // Send me an email that a comment was submitted on a question. 
              //sendEmail("My Questions -> Add Question", "Someone clicked on add-question from my questions.  User id: " + user_id  );   

              //Intent myIntent = new Intent(MotivationActivity.this, WePromoteActivity.class);
              //MotivationActivity.this.startActivity(myIntent);              
           }
        });         






//        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
//             public void onIabSetupFinished(IabResult result) 
//             {
//                if (!result.isSuccess()) 
//                {
//                   // Oh noes, there was a problem.
//                    
//                   Log.d("INAPP BILLING", "Problem setting up In-app Billing: " + result);
//                }            
//                      
//                // Hooray, IAB is fully set up!  
//                
//                
//                // First arg is whether product details should be retrieved
//                // The List argument consists of one or more product IDs (also called SKUs) for the products that you want to query.
//                // the QueryInventoryFinishedListener argument specifies a listener is 
//                // notified when the query operation has completed 
//                // and handles the query response.
////                  mHelper.queryInventoryAsync(false, new ArrayList ( ).add("1"), 
////                          mQueryFinishedListener);
//                
//                //mHelper.queryInventoryAsync(mGotInventoryListener);
//                
//                
////                  mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, "11" , 105, mPurchaseFinishedListener, "" );             
//             }
//          });        
    }

    IabHelper.QueryInventoryFinishedListener 
    mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() 
    {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory)   
        {
           if (result.isFailure()) {
              // handle error
              return;
            }

            String applePrice =
               inventory.getSkuDetails("1").getPrice();
            String bananaPrice =
               inventory.getSkuDetails(SUBSCRIBE_SKU).getPrice();
        }
        // update the UI 
    };

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
    = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
    {
       if (result.isFailure()) 
       {
          Log.d("ERROR", "Error purchasing: " + result);
          return;
       }      
       else if (purchase.getSku().equals("1")) 
       {
          // consume the gas and update the UI
       }

       else if (purchase.getSku().equals(SUBSCRIBE_SKU)) 
       {
          // give user access to premium content and update the UI
           Log.d(TAG, "PURCHASED: " + result);

       }
    }
 };    

     IabHelper.QueryInventoryFinishedListener mGotInventoryListener 
     = new IabHelper.QueryInventoryFinishedListener() {
     public void onQueryInventoryFinished(IabResult result,
        Inventory inventory) {

        if (result.isFailure()) {
          // handle error here
        }
        else 
        {
          // does the user have the premium upgrade?
          isSubscriber = inventory.hasPurchase(SUBSCRIBE_SKU);        
          // update UI accordingly
        }
     }
    }; 


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + 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);
        }
        else {
            Log.d(TAG, "onActivityResult handled by IABUtil.");
        }
    }

    @Override
    public void onDestroy() 
    {
       super.onDestroy();   

       if (mHelper != null) mHelper.dispose();
       mHelper = null;
    }
}
4

4 に答える 4

3

これはサブスクリプションであるため、次の行を置き換える必要があると思います。

mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);

これで:

mHelper.launchSubscriptionPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);

少なくともこれは私のコードで使用しているものであり、テストに成功しました。

于 2013-02-20T05:33:58.650 に答える
1

もう1つ知っておくべきことがあります。購入はすぐには表示されません。公開してから 2 ~ 3 時間後にテストできます。

私の英語でごめんなさい=)

于 2013-01-25T16:47:52.167 に答える
1

新しいアプリ内課金バージョン 3 は、現在サブスクリプションをサポートしていないと思います。私が間違っている可能性がありますが、サンプル コードやドキュメントでサブスクリプションについて言及していないため、「アイテムが見つかりません」というエラーが表示されるのはそのためかもしれません。

一般に、実際のアイテムの購入をテストするには、アプリのバージョンを開発者コンソールにアップロードする必要があり (ただし、公開する必要はありません)、同じ (署名済み) バージョンを使用してテストする必要があります。 . また、Google Play が新しく追加されたアイテムを処理/伝播するのにも時間がかかります...そのため、残念ながら待つ必要がある場合があります。まだ行っていない場合は、developer.android.com /training/in-app-billing/test-iab-app.html を確認してください。

于 2013-01-02T23:07:43.193 に答える
0

リクエストごとに 20 アイテムの制限があります。20 項目ごとに分割しても、

skuList.addAll(inv.getAllOwnedSkus(itemType));

number_of_owned_items + number_of_queried_itemsが 20 より大きい場合、特にnumber_of_owned_itemsが 21の場合、エラーが保証されます。

これで、誰かが最初からコードをゼロから書き直すことを提案した理由がわかりました。

于 2013-11-20T13:08:56.480 に答える