2013年5月アーカイブ


In App Billing v3 の実装テストで、一度テスト購入したものをもう一度テストしたかったので、Google checkout の管理画面で該当トランザクションをキャンセルして、もう一度購入処理を実行してみた。

ところが、すでに購入済みの動きになってしまって、購入画面が出てこない。

checkout のキャンセル反映に時間がかかるのかと思い、しばらく待ってから試してみるが、同様に購入画面が出てこない。

調べてみたところ、In App Billing v3 は購入結果をキャッシュして、動作を高速化しているようだ。

推測だが、キャッシュに購入済みのフラグがあって、それを見て購入済みと判断されているらしい。

では、どうするか。

単純に考えるとキャッシュを削除すれば良さそうだ。

[設定] - [アプリケーション管理] - [Google Play ストア] - [キャッシュを消去]

でキャッシュを削除して、もう一度トライ。。。

無事に購入画面が表示されました。

意外とシンプルに解決。
はまらなくて良かった。。


In App Billing v3 でサンプルを参考に実装したが Can't start async operation (launchPurchaseFlow)となる。

一回目の処理はちゃんと走るのだが、そのまま二回目の処理に入ろうとするとこのエラーがでる。
メッセージの通り、前の launchPurchaseFlow が走っているので新しい launchPurchaseFlow は開始できないよ、ということなのだが対応はいかに。

05-22 06:54:05.451: E/AndroidRuntime(9179): FATAL EXCEPTION: main
05-22 06:54:05.451: E/AndroidRuntime(9179): java.lang.IllegalStateException: Can't start async operation (launchPurchaseFlow) because another async operation(launchPurchaseFlow) is in progress.
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.example.inappbilling.util.IabHelper.flagStartAsync(IabHelper.java:794)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.example.inappbilling.util.IabHelper.launchPurchaseFlow(IabHelper.java:358)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.example.inappbilling.util.IabHelper.launchPurchaseFlow(IabHelper.java:324)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at co.example.exampleapp.TutorialActivity.doPayment(ExampleActivity.java:641)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at co.example.exampleapp.TutorialActivity.onClick(ExampleActivity.java:625)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.view.View.performClick(View.java:2552)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.view.View$PerformClick.run(View.java:9229)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.os.Handler.handleCallback(Handler.java:587)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.os.Looper.loop(Looper.java:130)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.app.ActivityThread.main(ActivityThread.java:3701)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at java.lang.reflect.Method.invokeNative(Native Method)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at java.lang.reflect.Method.invoke(Method.java:507)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at dalvik.system.NativeStart.main(Native Method)

対応は onActivityResult を実装する。でした。
実装が抜けてました。
サンプルを参考にして onActivityResult を実装したら無事に動作しました。


Galaxy S3 アルファ、Windows 7マシンに昨日まで接続できていたのに、今日接続しようと思ったら Unknown USB device になって接続できない。

ドライバが正しくインストールできません、的な感じで認識しません。

Kies を起動してドライバをインストールしなおしても、相変わらず認識できず、PCを再起動してもだめ、デバイスマネージャで一旦削除してもダメ。

途方に暮れそうになっていたとき、ふと、やっていないことがあることに気付いた。

端末の再起動である。

Galaxy側を再起動して再度チャレンジ。。

ドライバのインストールが始まり、あっさり認識しました。

なんだよぉ。。



webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(this, "activity");
view.loadUrl("javascript:window.activity.someMethod();") ;

というコードで activity の
public void someMethod() {
  ...
}
が呼ばれれいたのだが、android 4.2 から呼ばれなくなった。

調べたところ、4.2でセキュリティを考慮した仕様変更があったようです。

対応は、呼ばれるメソッドの宣言に
@JavascriptInterface
を記述するということのようです。

@JavascriptInterface
public void someMethod() {
  ...
}

な感じ。

JavascriptInterface cannot be resolved to a type
と言われたら

import android.webkit.JavascriptInterface;
を付けましょう。

targetSdkVersionも17以上になっているか確認しましょう。


startActivityForResult で起動したのに onActivityResult が呼ばれない。

なぜだろう。

悩んで調査した結果
呼び出し先のactivity に android:launchMode="singleTask" が指定してあったのが原因でした。

この記述を削除(デフォルト)にしたら無事 onActivityResult が呼ばれるようになりました。

singleTask だと使いまわされるから終了せずに onActivityResult が呼ばれないのだろうか。。



ScrollView にImageView を追加したが、LayoutParamが効いていないようだ。

画像の縦横比がおかしくなっている。

調べてみたところ間に LinearLayout を入れると良いようだ。

ScrollView - LinearLayout - ImageView

この構成にしたら、きちんと横幅いっぱいで縦横比も正しく表示できました。



In-App Purchase のテストをするときは、設定のAppStore でアカウントのサインアウトをしてから、テスト対象のアプリを起動し、In-App Purchase が発生する場所を動作させるとログインダイアログが出てきて課金テストが出来る。

でも、シミュレータの場合だと設定にAppStoreの項目がないのでサインアウトできない。
サインアウトできないと、アカウントが変更できないので、別のアカウントでテストができない。

調べたところ、以下の方法でログアウトが可能でした。

- シミュレータを終了させる。

- ホームディレクトリ以下の
Library/Application Support/iPhone Simulator/6.1/Library/com.apple.itunesstored
にあるファイルを削除する

- シミュレータを起動して、テスト対象のアプリを起動する

以上で無事ログアウトされていました。

公式にはシミュレータのリセットをしたほうがよいのかもしれません。
その場合は、アカウント情報以外のものもリセットされてしまうと思います。


このアーカイブについて

このページには、2013年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年4月です。

次のアーカイブは2013年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.13-ja