GenymotionにGooglePlayを入れるのが簡単になってた
以前もGenymotionでGooglePlayを動かせるようにする記事を書いたのですが、それよりも簡単な方法が、公式のQAで紹介されていました。
次のサイトから、zipファイルを落として起動しているGenymotionのEmulatorに入れるだけです。ファイルが一つで済むようになってました。
- Platformは
x86
を選択 - AndroidはGooglePlayを使えるようにしようとしているEmulatorのOSバージョンを選択
- Varientは
nano
を選択 - Downloadボタンを選択
ただし、Genymotionのバージョンが、 2.7.2以上 の必要があります。
時々失敗しますが、その場合はEmulatorを作り直して再度zipを入れるとうまくいきました。
参考
Shinjuku.aar第1回に参加した
Shinjuku.aarとは
Shinjuku.aarは、新宿界隈のAndroid技術者たちが 技術ネタで気軽にワイガヤできる コミュニティです。
発表ごとにディスカッションタイムを設けており、発表中の質問やツッコミも随時ウェルカム! さらに、ディスカッションが盛り上がるよう、発表者には参加者に向けた 問いかけを一つ入れるようお願いしています 。
もちろんその後は懇親会も用意しておりますので、思う存分ワイガヤしましょう!
http://shinjuku-aar.connpass.com/event/35434/
第1回で、新宿ということもあり参加してみました。
Few command line tools for help Android development
@tomorrowkeyさんの発表です。
www.slideshare.net
adbのコマンドと自作コマンドラインツールの紹介でした。 自分はapkの生成・配布以外はAndroid Studioでだいたい作業していたのですが、ビルドを途中で停止したり、アプリの設定を初期化したりなど、確かにAndroid Stuidoではなかなかやりにくいこともできるので、徐々に比率を移行していきたいなと思いました。
恥ずかしながらiTermのHotKeyを知らなかったのですが、設定すると切り替えが非常に楽で、移行に前向きになりました。
Chrome Custom Tabsを使いこなそう
自分の発表です。
会場ではChrome Custom Tabsを使っている人が思ったより少なかったです。 24.0.0からの機能の紹介で、知らなかったという声も上がっていたので一安心しました。
AutoValue for Easier Life
@Shaunkawano さんの発表です。
ボイラープレートを無くしていこう、ボイラープレートを書かないでいこう、という、決め事を掲げてチームで取り組むという姿勢が良いなと思いました。
AutoValueは知らなかったのですが、目的に即していると思いました。
DownloadProviderを改めて読む
@YusukeIwaki さん
資料は見つかりませんでした。。
Android標準のコンポーネントであるDownloadProviderの設計を、別の所でも使おうというお話。
雑感
会場の雰囲気作りとして、はじめに皆が自己紹介するという形式で、人数もそこまで多くなかったのでやりやすさはありました。 また10分の発表は初めてだったのですが、質問とかしながらしていく雰囲気もあり、時間があまるという感じにはなりませんでした。
他の発表者の方たちのスライドが皆英語のスライドで、デザイン性も高かったので次発表する機会があれば、英語でスライドを作ってみようと思いました。 英語で作ると、日本人以外でも見れるようになるし、スライドをただ読み上げることもなくなる気がします。
MashwmallowでqueryIntentActivitiesの挙動が変わってた
Chrome Custom Tabsを使っていて、公式のサンプルにあるCustomTabsHelperを流用していたのですが、Mashwmallowでうまく動かないことがありました。
CustomTabsHelper内で、PackageManager#queryIntentActivities
を使っているのですが、その挙動がMashwmallow以前と以降で異なっていたのが原因でした。
どう変わったのかと、回避方法を紹介します。
Mashwmallow以前
次のように呼ぶことで、引数のIntentに対応できるActivityを持つアプリを取得できます。
PackageManager pm = this.getPackageManager(); List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
queryIntentActivities(Intent intent, int flags)
の第二引数のflags
には、PackageManager.MATCH_DEFAULT_ONLY
を指定します。こうすることで、 android.intent.category.DEFAULT
を持つActivityのみを反応させることができます。
どんなIntentかにもよりますが、次のようにするとブラウザ系のアプリの一覧が表示されると思います。
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
Mashwmallow以降
Mashwmallow以降で同じように呼ぶと、そのIntentに対応するActivityを「常時」で規定で開く設定にしている場合、結果が変わります。
結果は、 規定で開く設定にしているActivityしか返さない ようになります。
規定で開くの設定を解除すると、Mashwmallow以前と同じになります。
Mashwmallow以前と等しい挙動で取得するためにはqueryIntentActivities(Intent intent, int flags)
の第二引数のflags
を、PackageManager.MATCH_ALL
を指定します。
PackageManager pm = this.getPackageManager(); List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(intent, PackageManager.MATCH_ALL);
PackageManager.MATCH_ALL
はAPI Level 23から追加されたflagです。
Querying flag: if set and if the platform is doing any filtering of the results, then the filtering will not happen.
とあるので、フィルタリングされたくない時に使うようです。
バージョン対応
共存させるには、バージョンでflags
を切り替えれば良いです。
例えば次のような感じです。
int flag; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { flag = PackageManager.MATCH_ALL; } else { flag = PackageManager.MATCH_DEFAULT_ONLY; } ResolveInfo info = pm.resolveActivity(intent, flag);
CustomTabsHelperの場合は、公式のサンプルにPullRequestがきてるので、それに習うといいと思います。
まとめ
Mashwmallow以降以前で挙動が変わる場合があるので、バージョンを見てflagsを切り替えましょう。
しかし、API Level 23未満で、PackageManager.MATCH_ALL
を指定したところ、クラッシュも発生せず同じように取得できていたので、最悪PackageManager.MATCH_ALL
のほうだけ使っておけば良いのかもしれません。。
参考
Chrome Custom Tabs / Google Chrome
GoogleChrome/custom-tabs-client / GitHub
custom-tabs-client/CustomTabsHelper.java / GitHub
Intent Resolving in Android M / Medium
Android:IntentFilterにDEFAULT_CATEGORYが必要な理由 / Yukiの枝折