広告IDが取得出来なかった理由がわかってきた。かな?
お疲れ様です。高橋です。
しばらく前からめぼしい更新を停止していた「カナかな?」ですが、地味にバージョン8.0まであげています。
理由は、ずっと取得出来ていなかった広告IDのデバッグのためです。
広告IDはgoogleのココに書いてある通りの物でして、広告ID情報というオブジェクトのインスタンスを取得して、そのインスタンスのgetID()メソッドでString型のadIDを取得する・・・という極シンプルなものなのですが。
なぜか実機でadIDが取得出来ない日々が続きました。エミュではそもそもadID系のデバッグが出来ませんので、非常に時間が掛かります。
最初は「みんなAD TrackingをOFFってるのかな。セキュリティ意識高い系だな」なんて思ってたのですが、明らかにそういう物の存在を知らない系の人が操作しても取得出来ていないのを目の当たりにしたため、本腰を入れて市場&実機デバッグに乗り出しました。
「main Threadではない、どこか別Threadから呼べよ」とgoogleのアソコに書いてありますので、普通に下記のような感じでThread生成して、その中で処理していました。
Thread adIdThread = new Thread(new Runnable() { @Override public void run() {
それでも取得出来ない。おかしいので、下記のようにアプリ側で発生したExceptionを収集して情報を集めてみます。この時点でバージョン7.0です。
try { AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(mainActivity); if (info.isLimitAdTrackingEnabled() == false) { strAdId = info.getId(); } else { strAdId = "Limit Ad Tracking is Enabled."; } } catch (IllegalStateException e) { strAdId = "IllegalStateException"; } catch (GooglePlayServicesRepairableException e) { strAdId = "GooglePlayServicesRepairableException"; } catch (IOException e) { strAdId = "IOException"; } catch (GooglePlayServicesNotAvailableException e) { strAdId = "GooglePlayServicesNotAvailableException"; }
ログを仕込んで動かされるのを待つと、本日11:16にplalaの誰かがIllegalStateExceptionを投げてくれていました。
IllegalStateExceptionは、googleのアソコにも書いてあるとおり、
// Do not call this function from the main thread. Otherwise, // an IllegalStateException will be thrown.
“main threadでコールするなよ。コールするとIllegalStateExceptionがthrowされるよ”と言っています。Threadをnewしてstartしても別スレとして認識してくれなかったみたいです。
Androidに於ける別スレッドの処理方法をググってみると、どうやらAsyncTaskというものが一般的のようです。
そこで急遽下記のようなクラスを1個こさえて・・・
package jp.curious4dev.nishinokanakana; import java.io.IOException; import com.google.android.gms.ads.identifier.AdvertisingIdClient; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; import android.os.AsyncTask; public class AdvertiseID extends AsyncTask<Void, Void, String> { private MainActivity mainActivity; public AdvertiseID(MainActivity activity) { mainActivity = activity; } @Override protected String doInBackground(Void... params) { String strAdId = ""; try { AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(mainActivity); if (info.isLimitAdTrackingEnabled() == false) { strAdId = info.getId(); } else { strAdId = "Limit Ad Tracking is Enabled."; } } catch (IllegalStateException e) { strAdId = "IllegalStateException"; } catch (GooglePlayServicesRepairableException e) { strAdId = "GooglePlayServicesRepairableException"; } catch (IOException e) { strAdId = "IOException"; } catch (GooglePlayServicesNotAvailableException e) { strAdId = "GooglePlayServicesNotAvailableException"; } return strAdId; } @Override protected void onPostExecute(String advertisingID) { if (advertisingID != null) { mainActivity.strAdId = advertisingID; } } }
MainActivityからは、こんな感じで呼び出します。
AdvertiseID adId = new AdvertiseID(this); adId.execute();
これで、AdvertiseIDクラスが処理を終えた後に、MainActivityのstrAdIdに値をしまってくれるはずです。クラスのプロパティをpublicにし、あまつさえ別クラスから値を変更するなんて、JAVA神様がいたら怒られるところですが、趣味なので良いのです。
近日中に誰かが動かしてくれると思うので、結果を楽しみに待っております。
以上、よろしくお願い致します。
関連記事
-
遅刻の言い訳アプリをリリースしてみた。
お疲れ様です。高橋です。 2/20あたりから、「合理的な遅刻の言い訳生成アプリ。 …
-
合理的な遅刻の言い訳生成アプリ。
お疲れ様です。高橋です。 寝坊と遅刻連絡について 平日の朝。iPhoneのアラー …
-
西野カナ風な歌詞自動生成「カナかな?」をリリースしてみた。
お疲れ様です。高橋です。 昨日はずっと助詞に関する実装をしていたのですが、どうし …
-
DLリンク付き言い訳提案システムとDL数の関係について
お疲れ様です。高橋です。 DLリンク付きの言い訳提案システムを1週間稼働させ、そ …
-
遅刻の言い訳提案システム 稼働四日目
お疲れ様です。高橋です。 本日も遅刻の言い訳提案システムのデータの分析と改善のた …
-
遅刻の言い訳提案システム 第一週最終日
お疲れ様です。高橋です。 今週は稼働→分析→修正→稼働、という繰り返しを何度か実 …
-
歌詞生成アプリ「カナかな?」の動詞をチューニングしてみた。
お疲れ様です。高橋です。 昨日はサーバ周りに熱中してしまってクライアント側を全く …
-
街頭インタビュー生成アプリ
お疲れ様です。高橋です。 街頭インタビューっぽいアプリ 街頭インタビューっぽい画 …
-
遅刻の言い訳アプリ ~ボタンの幅を動的に決定~
お疲れ様です。高橋です。 遅刻の言い訳アプリを着々と実装しています。 全体進捗 …
-
遅刻の言い訳提案システムとウコンの力
お疲れ様です。高橋です。 現在稼働を続けている遅刻の言い訳提案システムは、改めて …