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(..)) のコードを変更できますか?
いいえの場合、どうすればよいですか?