2017-04-03 13 views
0

コード内でアプリ内課金を実行することができます。ただし、アプリをインストールして購入をやり直すと、再び購入されます。アンインストール後の購入の復元

問題はどこですか?ここで

はコードです:

 case R.id.action_disable_ads: 
      try { 
       mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001, 
         mPurchaseFinishedListener); 
      } catch (IabHelper.IabAsyncInProgressException e) { 
       //e.printStackTrace(); 
      } 
      return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

//functions special for in App Billing 
@Override 
protected void onActivityResult(int requestCode, int resultCode, 
           Intent data) 
{ 
    if (!mHelper.handleActivityResult(requestCode, 
      resultCode, data)) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
     = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, 
             Purchase purchase) 
    { 
     if (result.isFailure()) { 
      // Handle error 
      return; 
     } 
     else if (purchase.getSku().equals(ITEM_SKU)) { 
      consumeItem(); 
      //buyButton.setEnabled(false); 
     } 

    } 
}; 
public void consumeItem() { 
    try { 
     mHelper.queryInventoryAsync(mReceivedInventoryListener); 
    } catch (IabHelper.IabAsyncInProgressException e) { 
     //e.printStackTrace(); 
    } 
} 

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

     if (result.isFailure()) { 
      // Handle failure 
     } else { 
      try { 
       mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), 
         mConsumeFinishedListener); 
      } catch (IabHelper.IabAsyncInProgressException e) { 
       //e.printStackTrace(); 
      } 
     } 
    } 
}; 

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = 
     new IabHelper.OnConsumeFinishedListener() { 
      public void onConsumeFinished(Purchase purchase, 
              IabResult result) { 

       if (result.isSuccess()) { 
        //first save purchase state 
        SharedPreferences settings = getPreferences(0); 
        SharedPreferences.Editor settingsEditor = settings.edit(); 
        settingsEditor.putString("adfree", "purchased"); 
        settingsEditor.apply(); 
        //then, hide the disable ads button 
        MenuItem disableAds = mainMenu.findItem(R.id.action_disable_ads); 
        disableAds.setVisible(false); 
        //then display a message that the transaction is successful 
        Toast.makeText(getApplicationContext(), "AdFree bundle purchased successfully!", Toast.LENGTH_SHORT).show(); 
        //then change the state of ad-free bundle for current session: 
        adFreeBundle = "purchased"; 
        //then disable ads 
        interstitialAd = null; 
        mAdView.setVisibility(View.GONE); 

       } else { 
        //display an error message that the transaction was not successful 
        AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); 

        builder.setTitle("TRANSACTION FAILED!"); 
        builder.setMessage("Unfortunately, the transaction was unsuccessful!"); 

        builder.setPositiveButton("CLOSE", new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int which) { 
          // Do nothing but close the dialog 
          dialog.dismiss(); 
         } 
        }); 

        final AlertDialog alert = builder.create(); 
        alert.setOnShowListener(new  DialogInterface.OnShowListener() { 
         @Override 
         public void onShow(DialogInterface arg0) { 
           alert.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.parseColor("#000000")); 
         } 
        }); 
        alert.show(); 
       } 
      } 
     }; 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mHelper != null) try { 
     mHelper.dispose(); 
    } catch (IabHelper.IabAsyncInProgressException e) { 
     //e.printStackTrace(); 
    } 
    mHelper = null; 
} 

アプリ内課金-のプロセスがうまく機能しました。しかし、私はアプリを再インストールすると、購入したアイテムを取得しようとするとうれしいです。

答えて

0

これは、あなたが購入を消費しており、sharedPreferencesにフラグを設定しているためです。

誰でも正しいツールを使用してsharedPreferencesを変更できます。

あなたのアプリをアンインストールすると、sharedPreferencesがリセットされ、あなたの「購入」が失われます。

アイテムを消費するため、2回目の試用で在庫が適切なSKUを使用できなくなるため、再度購入するように促されます。

購入ボタンを常に表示させると、クリックごとにお支払いいただくよう求められます。この

がアイテムを消費しないでください、そして最も重要なことはsharedPreferences内の任意のフラグを設定していない固定するために

。これはSQLデータベースにも当てはまります。

がかかるが、非消耗品に使用されることを意味しない、これはあなたがとても幸せではありません。このユーザーを消費しようとした場合、広告を削除するようにユーザーに課金されますので、あなたのケースである

在庫が適切なSKUを持っている場合は、アプリを起動して在庫を確認し、ユーザーに製品を提供します。

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     @Override 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       return; 
      } 

      // Have we been disposed of in the meantime? If so, quit. 
      if (mHelper == null) return; 

      // IAB is fully set up. Now, let's get an inventory of stuff we own. 
      Log.d(TAG, "Setup successful. Querying inventory."); 
      try { 
       mHelper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() { 
        @Override 
        public void onQueryInventoryFinished(IabResult result, Inventory inv) { 
         handleInventory(result, inv); 
        } 
       }); 
      } catch (IabHelper.IabAsyncInProgressException e) { 
       complain("Error querying inventory. Another async operation in progress."); 
       e.printStackTrace(); 
      } 
     } 
    }); 

public void handleInventory(IabResult result, Inventory inventory) {  
    if (mHelper == null) return; 

    // Is it a failure? 
    if (result.isFailure()) {   
     return; 
    } 

    Log.d(TAG, "Query inventory was successful."); 
    Purchase premiumPurchase = inventory.getPurchase(YOUR SKU); 
    //verify Developer Payload here, it's recommended but not mandatory. 
    //mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase)); 
    mIsPremium = premiumPurchase != null; 

    if (mIsPremium) {   
     //Enable feature 
    }else{ 
     //Disable feature 
    } 
} 
+0

ただし、アイテムを「消費する」ことはできません。また、sharedPreferencesの代わりに購入を呼び出すにはどうすればよいですか?推奨されるコードは高く評価されます。 –

+0

私は今ここに例を掲示するつもりですが、これを達成するためのコードの90%を持っているのでこれを行う方法を知っていると思っていました –

+0

少し失われています..私はコードを実装するいくつかのコードを見ましたJSON配列にgetPurchases()を追加するには、IABHelperで実装する必要がありますが、MainActivityではいくつかのことが言えます。また、私はトークンを使用していません。あなたのサンプルコードは非常に高く評価されています..百万のおかげで! –

関連する問題