5

アプリ内課金の仕組みについて非常に混乱しています。私はドキュメントを読みましたが、これを機能させるためにアプリケーションに実装する必要がある最終ステップを理解していないため、何かを見落としているに違いありません。アプリ内課金はうまく機能しますが、ユーザーがアプリをアンインストールし、後日再度インストールした場合、アプリはアプリ内購入が以前に行われたかどうかを判断する方法を知りません。これは、これらすべてを処理しようとするメイン クラスのスニペットです。

@Override
public void onCreate(Bundle savedInstanceState)
{
    mContext = this;
    startService(new Intent(mContext, BillingService.class));
    BillingHelper.setCompletedHandler(mTransactionHandler);
}

dungeons サンプル プロジェクトのサンプル クラスを使用しています。私が理解していないのは、購入時に以下のコードがどのように機能するかですが、再実行しても、何かが既に購入されているかどうかを確認するために機能しません。私はこの部分で約1か月間立ち往生しており、非常に不満を感じています.

public Handler mTransactionHandler = new Handler()
{
    public void handleMessage(android.os.Message msg)
    {
        Log.i(TAG, "Transaction complete");
        Log.i(TAG, "Transaction status: "
            + BillingHelper.latestPurchase.purchaseState);
        Log.i(TAG, "Item purchased is: "
            + BillingHelper.latestPurchase.productId);

        if (BillingHelper.latestPurchase.isPurchased())
        {
            new Message("Thank you!", getApplicationContext());
            PAY_VERSION = true;
            SharedPreferences purchasePreferences = getSharedPreferences(PURCHASE_PREFERENCES, Activity.MODE_PRIVATE);
            Editor purchaseEditor = purchasePreferences.edit();
            purchaseEditor.putBoolean("purchased", PAY_VERSION);
            purchaseEditor.commit();
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }
    };

私が必要としているのは、このアイテムが購入されたかどうかをサーバーに問い合わせる方法です。PURCHASE_STATE_CHANGEDどこかに何かがあることは理解していますが、状態が変化したと判断したときに何かを行う方法や、チェックを開始する方法がわかりません。私は道に迷っており、今のところ私は完全に道に迷っているので、必要なのは正しい方向へのプッシュだけです。

編集:

また、JSON を解析する必要があると聞いたことがありますが、それを開始する方法さえわかりません。

編集2:

これを電話して確認する必要がありますか?

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());
BillingHelper.getPurchaseInformation(new String[] {"myItem"});

そのコードは以前、私の姉妹の電話 ( SGS3ICS) でクラッシュしましたが、私の ( GNICS、およびJB職場) ではクラッシュしませんでした。onCreate()私は最初の活動でそれを呼んでいました。呼び出された後、何をすべきか本当にわかりませんgetPurchaseInformation(...)。戻り値がないので、JSONやるべきことを解析できるかどうかわかりません...

また、これらの2行は私にこれを与えます:

08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
4

2 に答える 2

0

JSON

サブスクリプション購入トークンを含むJSON注文オブジェクトの例を以下に示します。

{ "nonce" : 1836535032137741465,

  "orders" :
    [{ "notificationId" : "android.test.purchased",
       "orderId" : "transactionId.android.test.purchased",
       "packageName" : "com.example.dungeons",
       "productId" : "android.test.purchased",
       "developerPayload" : "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
       "purchaseTime" : 1290114783411,
       "purchaseState" : 0,
       "purchaseToken" : "rojeslcdyyiapnqcynkjyyjh" }]
}

Javaで解析するJSON方法。

Android JSONライブラリをサポート

Androidの請求

リモートサーバーを使用している場合は、デバイスのローカルデータベースではなく、サーバーに購入情報を保存することをお勧めします。ここを見てください

ユーザーアカウントごとの管理、管理されていない、またはサブスクリプションについて読む

私は次のような請求を使用します:

  1. onCreateで

     BillingHelper.setCompletedHandler(handlerTransaction);
    

    コードにハンドラーがあります。

  2. ネクストインonClickか何か

     BillingHelper.requestPurchase(this, currentMarketProduct.getMarketId());
    
于 2012-08-28T19:51:31.973 に答える
0

2 回目の更新で正しい軌道に乗っています。秘訣は、すべてが非同期で行われることを認識することです。

一般的な流れは次のとおりです。

  1. ユーザーがアプリをインストールします。

  2. アプリの初回読み込み時に、購入を復元する必要があるかどうかを確認します。

  3. その場合は、RESTORE_TRANSACTION 同期リクエストを Google に送信します。

  4. Google は、RESTORE_TRANSACTION リクエストに対して確認応答を返します。(これは、彼らがあなたの要求を受け取ったことを確認するだけです。)

  5. この時点で、すでに Google に復元リクエストを送信済みであり、アプリから復元を送信する必要がないことをマークする必要があります。

  6. これで、ユーザーが以前に購入したアプリ内購入ごとに、非同期でGoogle が「PURCHASE_STATE_CHANGED」イベントをアプリに送信し始めます。この呼び出しは、ユーザーが初めて購入した場合に Google が送信するものと同じです。

  7. 同じ呼び出しであるため、アプリはイベントを取得し、ユーザーがアプリ内製品を購入したかのように通常どおり処理します (これにより、購入した機能が「復元」されます)。

手順 2 と 5 に関して、アプリに対して行ったことは、既定で false に設定されている 'APP_INITIALISED' という名前の SharedPreference 値を保持することです。アプリが起動するたびに、'APP_INITIALISED' が false の場合、Google に RESTORE_TRANSACTION を指示し (ステップ 2)、APP_INITIALISED を true に設定します (ステップ 5)。

于 2012-08-29T23:31:01.943 に答える