2013年6月30日日曜日

課金処理も終りアプリを公開
課金がちゃんと動くかな?と見てみると下の画像の表示なっていました




「これはテスト用の注文です。課金は発生しません。」


え?と、思い調べてみると
アクセスした端末のアカウントがテスト用のアカウントとして登録してある場合にこのような表示になるようです

テスト用アカウントだということが分かりやすくて良いですが、ちょっとビックリしますね

2013年6月28日金曜日

In-App Billing Version 3を使ってみました

同じように困っている人がいるかもしれないので、メモの意味もかねてブログに書いておきます

テストで行った課金処理がクリアできない


アプリ内課金でテスト用に用意されている「android.test.purchased」というアイテムで購入処理の動作を確認する訳ですが、一度購入すると2回目からは既に購入済みとなってテストが出来ない
そこで購入情報のクリア方法をググってみるとGoogle Playのキャッシュを削除するといいという情報があった

[設定]→[アプリ]からGoogle Playを探して「キャッシュを消去」をしました

しかし、購入情報がクリアされません

ならば!と「データを消去」の方を実行したところ購入情報がクリアされました

検証端末:Android 4.2.2 のGalaxy Nexus

「キャッシュを消去」で上手くいかない人は「データを消去」を試してみてください


課金処理後のonActivityResultが呼び出されない


In-App Billing Version 3ではstartIntentSenderForResult (IntentSender intent, int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) を使って購入処理が実行されて、購入処理後に結果がonActivityResult (int requestCode, int resultCode, Intent data)に返ってきます
アプリ側ではonActivityResult (int requestCode, int resultCode, Intent data)で返却を待って購入後の処理(たとえば購入ボタンを非表示にするなど)を行えば良い訳です

しかし、あるページでは上手く動作するのにあるページでは上手く動かないという現象が発生しました

yanzmさんのブログ「Y.A.M の 雑記帳」にある「In-app billing V3 は singleInstance な Activity では使えない
をみて、ひょっとしてsingleInstanceにしてたっけ?
と見てみましたが違いました

もっと単純でした

課金処理はスーパークラスに記載して、サブクラスから購入処理を実行したのですが、このサブクラスにonActivityResult (int requestCode, int resultCode, Intent data)がありオーバーライドしていた事が原因でした
ですので
super.onActivityResult (int requestCode, int resultCode, Intent data)
を追加したら上手く動きました

単純なミスですが見つけにくかった・・・


ほかにもあったような気がしますが思い出したら追記することにします

しかし、In-App BillingがVersion 3になって簡単になりましたね
簡単といってもお金が関わる所なので慎重なテストが必要となるで作業としては大変ですね

2013年6月26日水曜日

AndroidのProguardで次のようなエラーがでて数時間格闘していた


No server options fields detected.  To suppress this message either add a field with the @Parameter annotation, or override the load() method

このエラーの後にAdMobのメディエーションでカスタムイベントの呼び出しの際にClass.forNameで呼び出すクラスのnameがnullで広告が表示されないという問題が出ていた


これを解決するために以下を追加した
-keepattributes *Annotation*
これをつけることによってアノテーションが削除されなくなる

アノテーションが削除されて正しい動作をしていなかったようですね

上記の設定でメディエーションは動作するようになったのですが、次はGoogleDrivが動作しません
どうやらSignatureも必要なようですね
併せてSignature,InnerClassも付けて次のようにしておきました
-keepattributes *Annotation*,Exception,Signature,InnerClass


■参考にさせて頂いたサイト

NO_NAME 
Proguardでコードの圧縮・最適化・難読化を行う

とあるプログラマのしらべごと
アプリにProguardを適用する