最近Android TVアプリの開発で困ったこと
雑にメモ
Android TVを正確に判定するのが難しい
Android DevelopersのAndroid TV実装ガイドにはTV端末をチェックするという項目があり、
UI_MODE_TYPE_TELEVISION
で判定すればいいよと書いてある。
しかし実際にはUI_MODE_TYPE_TELEVISION
なのにAndroid TVではない端末いくつかあり、自称AndroidTV端末としてチェックをすり抜けてしまう。
特にOSが4.x系でUI_MODE_TYPE_TELEVISION
な端末が曲者で、Android TVだけを想定してコードを書いていると4.x系では存在しないAPIにアクセスしてクラッシュすることがあって非常に辛い。
手元にないので試せていないが、おそらくHDMIスティック系の端末にも自称TV端末があるのではなかろうか。
TV判定のロジックにAPIレベルのチェックを追加するか、TV向けの部分であってもminSdkVersion
で動くようにしておいたほうが良さそう。
結局、Android TVってUI_MODE_TYPE_TELEVISION
ができたAPI level 13からサポート対象なのか、leanbackライブラリのv17からサポート対象なのか、Android TVそのものができたLollipopからサポート対象なのかよくわからない。
音声検索のマイク権限は外せる
AndroidTVで検索画面を実装する場合、通常はleanbackライブラリのSearchFragment/SearchSupportFragmentを利用する。
このクラスは普通に実装するとRECORD_AUDIO
権限が必要だが、SpeechRecognitionCallback
を設定して音声検索をACTION_RECOGNIZE_SPEECH
に任せれば権限不要となる。
Android Developers Blogにも書いてあったので多分間違いない。
TVでRuntime permissionsに対応するのはしんどいので、どんどん権限を外していきたい。
Leanbackライブラリの更新で死ぬ
leanback-v17ライブラリを23系にあげたときに、HorizontalGridView
のlayout_height
をwrap_content
にしているとjava.lang.IllegalStateException: Must specify rowHeight or view height
みたいなエラーを吐いてクラッシュする。
おそらくVerticalGridView
のlayout_width
でも似たようなエラーが発生してクラッシュしそう。
メッセージの通り高さ/幅を指定すればクラッシュしなくなる。
最近気になっているGoogle Play Servicesの機能
Google Play Services7.5、7.8で素敵な新機能がいっぱい追加されたけど全然追いつけていないのでメモだけ…。
Nearby
Nearbyは近くにあるAndroid/iOS端末同士でやりとりすることができる機能です。 メールやSMS、QRコードなどを介することなく接続できるので、アカウントを知る必要も別にアプリを入れる必要もなくやりとりすることができます。
Trelloというタスク管理アプリではNearbyを使って簡単にボード(タスクリストのようなもの)が共有できるようになってました。
以下はTrelloでNearby接続を開始した時に表示される確認ダイアログです。 耳に聞こえないペア設定コードと表現されていますが、端末によってはわりと大きめの音でジジジジ…と鳴り不快でした…。
Smart Lock for Passwords on Android
Smart Lock for PasswordsはChromeでWebサイトにログインしたときにIDやパスワードを保存し、再ログイン時に入力補完してくれる機能です。 Google Play Services 7.5からAndroidアプリでも同じ機能が使えるようになりました。
Smart Lock(略)を使ってアプリでのログイン時に認証情報をGoogleサーバーに保存しておくことで、次回のログイン時に自動ログインや入力補完させることができます。 また、Chrome側の認証情報管理と同じ仕組みで動いているため、アプリとWebサービスの紐付けをしておけばどちらか一方で保存した認証情報を他方で利用することもできるようになります。
NetflixのAndroidアプリが完全対応していて、前もってWebで認証情報を保存しておくとアプリをインストールして起動した直後に自動的にログインという最高のユーザー体験!という感じでした。
サンプルアプリで認証情報を保存するときの確認ダイアログ
認証情報を取得したときの表示(下部の青い帯。右端のgマークは消せない…)
App Invites(Beta)
App Invitesはメールアプリなどを経由せずに直接アプリの中で送信先を選んで招待メッセージを送信することができる機能です。 招待メッセージを開くとアプリの説明とInstallボタンがあり、このボタンを押下すると対象アプリを未インストールの場合はPlayストア( iTunes App Store)に遷移、インストール済みの場合は対象アプリが起動します。 招待メッセージにディープリンクを埋め込むことができるので、「指定したページでアプリを起動」という挙動もできます。
Yummlyという海外のレシピアプリが導入していたので、動作確認しました。
レシピ詳細で共有先から「Share via Yummly」を選ぶとメッセージの送信先選択画面が表示されます。 タイトル部分は編集可能、複数の宛先が選択可能なようでした。
そのまま送信すると、相手にはこんな感じでアプリの紹介メッセージが届きます。 「Install」を押すとPlayストアへ遷移、またはアプリが起動して共有されたレシピを表示します。
DroidKaigiの発表者を募集中です!
4月25日(土)にDroidKaigiというAndroidエンジニア向けのイベントが開催されます。
私も縁あってこのイベント運営に関わっているのですが、つい最近実行委員会内で「もっと気軽に応募してほしい!」という意見がありました。 DroidKaigiでは発表者となるAndroidエンジニアを募集しており、CFP形式で応募を受け付けています。
CFPと聞くとかなり敷居が高く感じるかもしれませんが、最新技術や高度な技術だけに限らず初心者・入門者に向けた初歩的な内容や日頃行っている開発での工夫などのちょっとしたことまで幅広く受け付けていますので、ぜひあなたの知見を共有して欲しいです!
正直、私自身高度な話はできないかも…と遠慮してましたが、入門者向けにdpiや画面レイアウトに関する内容で応募をしてみようと思っています。
CFPの応募はこちらから!2月25日(水)まで受け付けています。
Genymotionの有料アカウントについて
Genymotionについて
Genymotionは高速なAndroidのエミュレータです。 基本的な機能についてはググればいっぱい出てくるので割愛します…。
有料アカウント
GenymotionのHPに無料アカウントと有料アカウントで使える機能の違いは書いてあるのですが、具体的にどのような機能なのか詳細な説明がありません。 調べてもわからなかったので有料アカウントに契約しました。
課金
通常の課金携帯はBusinessアカウント(€24.99 per month, per user)となっていますが、個人で契約する場合はIndieアカウント(€8.25 per month, per user)が使えます。 月€8.25ならいいかな、と思ってたら年契約しかないので€99取られます。気をつけましょう。 支払いはクレジットカードの他、Paypalが利用できました。
有料機能
Multi-touch
マウスとキーボードを使ってマルチタッチをエミュレートすることができます。 操作方法はキーボードショートカットの下の方にあります。 Macbookのトラックパッドでマルチタッチした結果がエミュレータに伝わるかと思っていたのですが、そんなことはありませんでした。このマルチタッチ操作はトラックパッドでは非常にやりづらいです…。
Accelerometer
加速度センサーが使えるという意味だと思うのですが、単体で設定できる画面が見当たりません。 いまのところ後述のRemote Control以外で利用する方法が不明です。
Java API
Androidアプリ内からエミュレータのセンサー値などを変更できるライブラリが利用できます。 テストコードなどを実行するときに便利そうですね。 ただし、ライブラリは1.0.0からアップデートされておらずjavadocを見てもあまり多機能とはいえない感じ。
Screencast
スクリーンショットが撮れる。動画も撮れます。それだけ。 動画のフォーマットはwebp。画質の調整とかはできなさそうです。 ちなみに無料アカウントでもDDMS経由でスクリーンショットは撮影できます。多分動画も撮れます。 DDMS経由で録画ができるようになったのは4.4からですが、この機能は2.3でも利用することができます。
Virtual device migration
この機能は一体なんだ?全然説明がないぞ? と思っていたらユーザーガイド(PDF)に書いてありました。 デバイスイメージが更新されたときにデータそのままアップデートできるらしいです。 データそのままでOSのバージョンが変えられる機能ではありません
IMEI and Android ID update
エミュレータの各種IDが変更できます。 すでにアプリでの利用が非推奨になっているので、あまり使い道がなさそう。
Pixel Perfect
通常、GenymotionはPCの画面サイズに応じてエミュレータを縮小表示していますが、この機能を使うと本来のピクセルに拡大して表示することができます。
通常表示
Pixel Perfect
Clone and Reset
デバイスイメージのクローンとリセットができます。 どちらも起動中はできないのが残念。
Network quality and performance emulation
エミュレータの通信速度と品質を設定できます。 Profileには3Gや4Gなどがありますが、どれを選んでもエミュレータ上ではWifi接続扱いなので注意。
Priority support (reply guaranteed within 1 working day)
問い合わせすると1営業日で返事くれるらしいです。 いまのところ利用してないので詳細不明。
Remote Control
なぜかPriceページに載っていない重要機能です。 実機のタッチパネルやセンサーの状態をエミュレータに反映することができます。 実機があるのにGenymotion使う意味あるのか?と思うかもしれませんが、OSバージョンや画面サイズの異なるエミュレータでも操作できるのはすばらしい!…かもしれない。
設定画面
操作中の実機
これはNexus5(実機)でNexus6のエミュレータを操作したものです。 実機のナビゲーションバーが表示されるため、同一機種のエミュレータであっても画面いっぱいには表示されません。
これはNexus5(実機)でXperia Tablet Zのエミュレータを操作したものです。 スマートフォン端末でもタブレットをRemote Controlすることができます。
Remote Controlで接続された状態ではタッチのほかマルチタッチも可能。 加速度センサーの値も実機のものになります。 GPSやカメラは残念ながら実機から共有できませんでした。
Remote Controlの操作は結構重いらしく、GalaxyNexus(実機)でRemote Controlしようとすると画面表示がカクカクになります。 またPreviewが真っ白になってしまう場合があり、こうなると一度切断して再接続しない限り表示されませんでした。
ちなみに、Remote Controlを初めて実行する際エミュレータの再起動が必要でした。
感想
年€99はちょっと割高かも…
端末情報を調べるときに見るページ
au
auの開発者向けページは他キャリアの同様のページとくらべて非常にわかりやすい。 他がひどいのでわかりやすいというだけで高評価だ。
Android(TM) 技術情報 | 開発者向け技術情報 | au
端末スペックは細かく乗っていて一覧性が高い。 更新スピードも早くこの間発表された2015春モデルもすでに記載されている。 特にAndroidで重要な端末のdp設定(xhdpi,xxhdpi...)なども載っていて有用。
ディスプレイ | Android(TM) 技術情報 | au
docomo
docomoの開発者向けページは端末そのものの情報よりサービス推しが目立つ。
作ろうスマートフォンコンテンツ | サービス・機能 | NTTドコモ
端末情報は入り口が見つけにくい上に一度入ったら戻るためのリンクがない。 また、一覧表がない上に情報が機能別にページわけされていて階層が深いすぎる。 ピクセル密度という項目で実dpiは記載されているが、端末が使うdp設定は記載されていないのでdpの設定から推察する必要がある。
softbank
softbankの開発者ページにはコラムも連載されている。 ただしコンテンツ量はあまり多くなくページが細かく区切られていて読みづらい…。
Android[TM] 技術仕様情報 | SoftBank スマートフォン サービス開発支援サイト | ソフトバンク
端末情報は検索して一覧表にする形式だが、そもそもの情報量が少ない。更新も遅い。 wifiなどの機能は○/☓形式なのにグレーアウトされている機種もあったりして色々ひどい。 ディスプレイに至ってはdp設定どころか実dpiすら表示されないので自分で計算しなくてはいけない。
Android Develoeprsの歩き方
はじめに
この記事はAndroid Developersを便利に使うための方法が書いてあります。 前提としてAndroid Developersのページ構成などをある程度理解している必要があるので、まずは下記記事を参考にAndroid Developersの構造を把握してください。
拡張機能の導入
Chromeを利用している場合、Android SDK Searchを導入することでAndroid Developersの使い勝手がかなり上がります。
主な機能
- URL入力欄に
ad *keyword*
と入れることでAndroid Developersを検索してくれる - Android Developersのクラスリファレンスページにソースコードへのリンクを表示してくれる
特に後者はとても強力な機能です。 UserManager#isUserAGoat()ってどうやってヤギかどうかチェックしてるんだっけ?と思った時にすぐ実装を見ることができます。
Blogを読む
Android Developers Blogを購読しましょう。 このブログは単なる技術系ブログではなく、Android Developersからも検索対象になっているコンテンツのひとつです。 一部の記事はGoogle Developer Japan Blogで翻訳されていますが、このブログはAndroidに限定されたものではなくAndroid Developersの検索にも引っかからないため、なるべく本家の更新をチェックするようにしましょう。
特定のタイミングで更新されるページ
Dashboardsは毎月OSバージョンや画面サイズごとのシェアが報告されるページです。 このページは毎月一度はチェックしたほうが良いでしょう。 OSのバージョンアップが行われた場合、主に以下のページが変更されます。
- Android, the world's most popular mobile platform
- Patterns、特にNew in Android
- Samples > What's New(更新までに間があく場合があります)
API levelごとの差分を見る
API Differencesで確認することができます。 URLの数字を変更することで過去の差分もみていくことができます。 引数などが変わらず、挙動のみが変わってしまうメソッドはこの方法ではわからないため、検索を活用することで探します。 あまり効率はよくありませんが、As of LOLLIPOPで検索し、左側メニューでReferencesを選択することでjavadoc内のLOLLIPOPでの動作について言及している箇所を探すことができます。 As of KITKATなども同様に探せます。
Supportライブラリにバックポートされた機能を探す
Supportライブラリの主な機能はSupport Library Featuresにまとめられています。過去にこのページをみており、新規差分だけ把握したい場合はRevisionsを参照すると早いです。 ただし、これらのページには主な機能しか記述されていないので、他のバックポートされた機能探すために検索機能を活用します。Compatで検索し、左側メニューからReferenceを検索することでjavadoc内の文字列検索になります。Support Library Featuresには記載されていないLinearLayoutCompatなどもこの方法で検索できますが、ノイズが多いため効率はあまりよくありません。
このような機能は以下のパッケージに含まれていることが多いため、パッケージ単位のReferenceでクラス一覧を眺めてみるのも良いでしょう。
- android.support.v4.app
- android.support.v4.util
- android.support.v4.view
- android.support.v4.widget
- android.support.v7.widget
早見表
アイコンサイズや代替リソースの設定の一覧が書かれているページは覚えておくと便利です。
Android Developersでよく読むページ
Android Developersを読むときの注意点
どのページにも言えることですが、一見目次のように見えてもページ階層と関係ないリンク集だったりすることがあります。 たとえばBest Practicesというページの「BLOG ARTICLES」は一見このカテゴリの子ページリンクに見えますが、実際はこのカテゴリと関係があるブログ記事の一覧になっており子ページは「Supporting Multiple Screens」「Supporting Tablets and Handsets」「Verifying App Behavior on ART」の3つになります。 Android Developersのページ構成は左側ペインを参考にしましょう。
About
このページはトップページの「Learn More」か左上の「Developers」ロゴ右の矢印から展開するメニューからしか飛べないので気が付きにくいページです。 Androidのバージョンごとに追加された新機能などや変更点などが記載されています。 Android Wear、TV、Autoなどの概要ページも同じ階層にあります。 特にDashboardsはOSのバージョンや端末サイズごとのシェアが書かれており、毎月更新されるので定期的に確認しましょう。
http://developer.android.com/about/index.html
Design
Androidアプリのデザイン面で注意すべきことが書いてあるカテゴリです。
http://developer.android.com/design/index.html
Material Design
AndroidにおけるMaterial Designの概要について書いてあります。 デザイン面での詳細に関してはMaterial Designガイドラインを参照してください。
http://developer.android.com/design/material/index.html
Patterns
AndroidにおけるUIデザインパターンについて書かれています。 見た目だけでなくNavigation Drawer利用時の画面遷移の在り方や確認ダイアログを使うべきタイミングについても書かれているので、Androidアプリを実装する上で是非読んでおくべきです。
http://developer.android.com/design/patterns/index.html
Building Blocks
Androidで利用できる標準UI部品について書かれています。 執筆時点ではスクリーンショットなどがMaterialテーマに対応していませんが、どのような部品があるかは把握しておきましょう。 ActionBarタブなどすでに非推奨のものも載っているので、他のページ(特に最新のAPIにおける変更点)と合わせて読む必要があります。
http://developer.android.com/design/building-blocks/index.html
Downloads
ActionBarメニューで利用できるアイコンやフォントなどがダウンロードできます。 他のページからダウンロードできるものもこのページにまとめられているので便利です。
http://developer.android.com/design/downloads/index.html
Develop
Androidアプリ開発に直接関係するカテゴリです。 APIリファレンスやサンプルコードが含まれるのもここです。
http://developer.android.com/develop/index.html
Training
Trainingは名前の通りAndroidアプリ開発のための練習資料です。 中級者以上は用がないと思いがちですが、タブレット対応する際に考えるべきことやAndroid TVハードウェアの制限など引っかかりやすい部分も載っているので触ったことがない機能を実装するのであれば一読しておくべきです。
http://developer.android.com/training/index.html
API Guides
Android APIにどのような機能があってどう使うべきかがカテゴリごとにまとめられています。 DesignやTrainningからリンクされているページもあるので、これらのページとあわせて読むとより理解が深まります。
http://developer.android.com/guide/index.html
App Components
Androidの基本的なコンポーネントについて書いてあります。 特にIntents and Intent Filtersは全てのコンポーネントをつなぐIntent機能について説明されているので必ず読みましょう。
http://developer.android.com/guide/components/index.html
App Resources
Androidのリソース管理について書いてあります。 代替リソースの定義方法は複雑ですが、それぞれ関係するページにリンクが貼ってあるので利用する際はリンク先まで読みましょう。
http://developer.android.com/guide/topics/resources/index.html
User Interface
AndroidのUIについて網羅的に書かれています。 このページでは主に実装面について書かれているので、Designカテゴリとあわせて読むことで実際にどのような場面でどのようなUIを選択すべきかが理解できます。 Action Barの実装などは古い記述が残っているので最新のAPIと照らしながら読みましょう。
http://developer.android.com/guide/topics/ui/index.html
Best Practices
Androidアプリをより良くするための情報が書かれています。 特にSupporting Multiple Screensはアプリの表示崩れを防ぐ上で非常に重要な項目なので、必ず読みましょう。
http://developer.android.com/guide/practices/index.html
Reference
Android APIのリファレンスです。いわゆるJavadoc。 非常に有益な情報もあるので、普段使っているクラスでも一度は目を通しましょう。 例えば、Intentクラスのリファレンスでは「Standard Broadcast Actions」という形でよく使われれるブロードキャストアクションの一覧が載っています。
http://developer.android.com/reference/packages.html
Tools
開発ツールに関する情報が載っています。 Android StudioやADTだけでなくSupport Libraryに関する情報もここにまとめられています。
http://developer.android.com/sdk/index.html
Tools Help
Android SDKに付属しているツールについて説明されています。 Android Debug BridgeやDraw 9-patchはよく使うので目を通しましょう。
http://developer.android.com/tools/help/index.html
Support Library
Supportライブラリについて説明されています。 特に重要なのはFeaturesとRevisionsです。 前者はSupportライブラリがそれぞれどのような機能を実装しているかの概要、後者は各機能が実装されたリビジョンが記載されています。 実際にはFeaturesに記載されていない機能も多く含まれているので、Referenceを見ることも重要です。
http://developer.android.com/tools/support-library/index.html
Google Services
Google Servicesについて書かれています。 アプリで連携できるGoogleサービスの説明のほか、Google Play ServicesとそのサブページがGoogle Play Services SDKに関するリファレンスになっています。 アプリ内課金を行う場合はGoogle Play In-app Billingを参照しましょう。
http://developer.android.com/google/index.html
Samples
Androidの各APIやUIに関するサンプルプロジェクトが公開されています。 最近What's Newページが追加され、新しいサンプルがどれなのかわかるようになりました。 サンプルプロジェクトはSlidingTabsColorsなど有用なものもありますが、最新機能のサンプルなどはSDKに依存していてバックポートの方法などが全く書かれていないものが多いです。 Android Studio上で直接インポート可能なので、Android Developers上で参照することはあまりありません。
http://developer.android.com/samples/index.html
Distribute
作成したAndroidアプリをどのように配布するかの情報が書かれています。
http://developer.android.com/distribute/index.html
Google Play
Google Play上でアプリがどのように表示されるか、Developer Consoleをどのように設定すべきかが書かれています。
アプリ開発と直接関係ないと思いがちですが、アプリを成功させるための秘訣などの情報も含まれるため有益です。
http://developer.android.com/distribute/googleplay/index.html
Essentials
アプリを成功させるために必要なポイントがUIデザインやコーディング、テスト手法にわたって書かれています。 Core App QualityやTablet App Qualityは是非読んでおきましょう。 ただし、内容は古いものも含まれています。
http://developer.android.com/distribute/essentials/index.html
Stories
成功したアプリの事例が説明されています。 あまり更新されていませんが、Developer Stories: The Opportunity of Android Tabletsなどはタブレット対応が必要だと説明する際の資料として使えます。