6

Google Play In App Billing と連携する Unity3D 用の Android プラグインを作成しようとしています。これには既存のプラグインがあることは承知していますが、自分でやりたいと思っています。

GPlay IAB SDK を介して正常な購入を処理するには、Android の Activity::onActivityResult をキャッチする必要があるようです。私の問題は、実際の Unity アプリケーションの背後でバックグラウンドで実行する必要があるため、Java クラスにアクティビティが含まれていないことです。

これは、購入フローを開始する GPlay IAB SDK のコードです。アクティビティとして「UnityPlayer.currentActivity」を渡すと、Google Play がポップアップし、正常に製品を購入できます。ただし、OnIabPurchaseFinishedListener への成功メッセージを受け取りません。購入が失敗した場合 (つまり、既に製品を所有している場合)、そこでコールバックを受け取ります。

public void launchPurchaseFlow(Activity act, String sku, String itemType, int requestCode,
                        OnIabPurchaseFinishedListener listener, String extraData)
...
...
act.startIntentSenderForResult(pendingIntent.getIntentSender(),
                                           requestCode, new Intent(),
                                           Integer.valueOf(0), Integer.valueOf(0),
                                           Integer.valueOf(0));

完全なソースはこちら: http://pastebin.com/xwUbrwTz

そして、これは成功したコールバックを投稿するGoogle Play In App Billing SDKの(コード例)のセクションです(私は受け取っていません)

/**
     * Handles an activity result that's part of the purchase flow in in-app billing. If you
     * are calling {@link #launchPurchaseFlow}, then you must call this method from your
     * Activity's {@link android.app.Activity@onActivityResult} method. This method
     * MUST be called from the UI thread of the Activity.
     *
     * @param requestCode The requestCode as you received it.
     * @param resultCode The resultCode as you received it.
     * @param data The data (Intent) as you received it.
     * @return Returns true if the result was related to a purchase flow and was handled;
     *     false if the result was not related to a purchase, in which case you should
     *     handle it normally.
     */
    public boolean handleActivityResult(int requestCode, int resultCode, Intent data)

完全なソース: http://pastebin.com/VTfxJhKx

Google のサンプル コードが onActivityResult コールバックを処理する方法を次に示します。

@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.");
        }
    }

ここで、UnityPlayerActivity クラスをオーバーライドしたくない理由 (Google で「UnityPlayerActivity Java コードの拡張」を検索してください。これは 2 番目のリンクです。評判が悪いため、直接リンクを投稿できません。) androidmanifest.xml が新しい「ランチャー」を指すようにする - これは問題です。Android 用の既存の広告プラットフォームのいくつかでは、独自の Java クラスを指すようにランチャーを変更する必要があるためです。これらと共存できるようにしたいので、既存の Unity アクティビティを拡張できません。

Java クラス (Unity によって問題なく生成される) 内で独自の Activity を開始しようとしましたが、Unity アプリケーションが最小化され、空白の Activity が表示されます - 明らかに私が望むものではありません。

私の質問: 既存の UnityAndroidPlayer クラスに拡張/キャッチ/フックして、onActivityResult 関数を追加できますか (デフォルトではありません)。

いいえの場合、電話にフォーカスしない Android プラグイン内でアクティビティを作成できますか?

いいえの場合、別の方法で通知するように Google Play SDK (act.startIntentSenderForResult(..)) のコードを変更できますか?

いいえの場合、どうすればよいですか?

4

1 に答える 1

0

私ができる最善の提案は、Export ビルド オプションを使用することです (これにより、Eclipse ワークスペースに相当するプロジェクトをすぐに実行できます)。Unity のアクティビティは単なるコードであるため、独自のコードをサブクラス化せずにフックできます。これは、通常の Build および Build and Run ビルドを使用できないことを意味しますが (少なくとも、この特定の機能をテストする場合はそうではありません)、動作します。ビルドごとにプロセスを自動化するには、Unity でビルド後のスクリプトを記述します。

于 2013-12-03T16:45:35.063 に答える