2015年8月21日金曜日

[コラム]どうなった?Android Auto -アプリ公開編-

2015年8月7日金曜日


■はじめに

Android Wear5.0からWatch Faceの作成が可能になり、
なんと5.1.1からは、アンビエントモードが通常のアプリでも実装できるようになりました!!
この機能を使用するとアプリを終了することなく、情報を表示し続けることができます。
Apple WatchにはないAndroid Wear独特の機能。
これを利用すれば、面白いアプリが作れるかもしれません!
早速仕組みをご紹介します。

Android Wear アンビエントモードを実装する


■はじめに

Android Wear5.0からWatch Faceの作成が可能になり、
なんと5.1.1からは、アンビエントモードが通常のアプリでも実装できるようになりました!!
この機能を使用するとアプリを終了することなく、情報を表示し続けることができます。
Apple WatchにはないAndroid Wear独特の機能。
これを利用すれば、面白いアプリが作れるかもしれません!
早速仕組みをご紹介します。

2015年8月3日月曜日



MediaCodecクラスの登場などにより、AudioTrackクラスを使う機会が増えてきました。そこでAudioTrackクラスの使い方について、メディア用語の解説も交えて解説していきます。

[コラム]AndroidのAudioTrackを基礎から理解する



MediaCodecクラスの登場などにより、AudioTrackクラスを使う機会が増えてきました。そこでAudioTrackクラスの使い方について、メディア用語の解説も交えて解説していきます。

2015年7月17日金曜日


はじめに

今回は手頃な価格で人気上昇中の中華IoTモジュールについて
その開発方法や注意事項について紹介いたします。

技適OKな中華IoTモジュールを使いこなす


はじめに

今回は手頃な価格で人気上昇中の中華IoTモジュールについて
その開発方法や注意事項について紹介いたします。

2015年7月16日木曜日

※Android Auto公式サイトより引用 https://www.android.com/intl/ja_jp/auto/

このブログでも何回か触れているAndroid Autoですが、その後どうなっているのでしょうか。
現在のAndroid Autoについてまとめました。

2015/3/20にAndroid Auto公式アプリがリリースされ、
Android Auto対応カーナビも続々発売されています。
しかし、現在利用可能な国はアメリカ、イギリス、オーストラリアだけです。
日本では、以下の日本語公式サイトが存在するものの、まだ利用できません。
https://www.android.com/intl/ja_jp/auto/

Android Autoに対応したアプリも配信されており、Google Playでもまとめられているようですが、
こちらも日本からはアクセスできません。
http://g.co/androidauto

日本でまだ利用できないのは残念ですが、
正式なサービスが始まっているため、いくつかの新情報もあります。
今回は、以下のURLで解説されているAndroid Autoの使用方法についてまとめました。
https://support.google.com/androidauto


■環境

・Android Autoの動作環境

  • Android Autoに対応したAndroid端末(Lollipop)
    車載カーナビとはUSBケーブルで接続します。
    また、カーナビとAndroid端末間ではBluetooth通信も使用します。
  • Android Auto公式アプリ(上記Android端末にインストール必須)
  • Android Autoに対応した車

・Android Autoで未対応の動作

おそらく安全面の理由から、以下の動作は未対応とされています。
  • Android Auto対応アプリ以外の端末操作(車載カーナビとUSBケーブル接続中)
  • テレビ、youtubeなどの動画再生
  • 文字入力キーボードの使用

・その他

  • Android Autoで使用するデータ通信は、Android端末上で発生する量と同等。
    外部と通信するのはあくまでAndroid端末のみ、ということになります。
  • Android Auto使用中、Android端末はUSBケーブルを通じて給電される。
    極端にバッテリーを消耗するAndroid Autoアプリがない限り、バッテリーの心配はなさそうです。
  • GPSが内蔵されている車であれば、Android端末は車側のGPS信号を使用できる。
    仕組みは不明ですが、Android端末側のGPS精度は気にしなくて良いようです。

■画面構成

・ホーム画面

Android Auto開始後、カーナビのディスプレイにはAndroid Autoのホーム画面が表示されます。ホーム画面の構成は以下のようになっています。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション通知
  2. リマインダー
  3. 音声コマンド
    マイクアイコンをタッチすることで、音声入力が可能になり、以下の操作が行えます。
    ・音楽再生(曲名)
    ・地図のルート検索
    ・電話発信
    ・スケジュールの取得

・アプリ選択

ホーム画面の下部にはアプリカテゴリのアイコンがあり、選択するとAndroid端末内にインストールされているAndroid Auto対応アプリのリストが表示されます。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション
  2. 電話
  3. ホーム画面
  4. 音楽再生
  5. 車アプリ

■Android Autoの使い方

Android Autoでは音声入力による操作が前提です。
音声入力やその他の操作で以下の機能を使用できます。

・電話

  • 発信(音声入力)
    「Call Cody White」「Call XXX-XXX-XXX」のように、「Call」の後に名前(電話帳に登録されている)や電話番号を言うだけで発信が可能です。

  • 発信(番号入力)
    ホーム画面下部の電話アイコンを押し、表示されるダイヤル画面から発信可能です。

  • 着信応答
    着信を受けると、ホーム画面上にNotificationが表示されます。それをタッチすることで、着信応答できます。

  • 不在着信応答
    不在着信情報は、ホーム画面上のNotificationとして表示されます。それをタッチすることで、不在着信に応答できます。

  • 留守電や通話履歴の参照
    ホーム画面下部の電話アイコンを押し、メニューから選択します。

・テキストメッセージの送信

  • テキスト送信
    「Text Cody White」「Text XXX-XXX-XXX」のように、「Text」の後に名前(電話帳に登録されている)や電話番号を言うだけでテキスト送信機能が起動します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

  • テキスト受信
    受信すると、ホーム画面上にNotificationが表示されます。それをタッチすることで、受信したテキストが音声で読み上げられます。
  • テキスト返信
    「reply」と話すことで、最後に受信したテキストに対する返信を開始します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

・リマインダーの設定

  • 時間ベースのリマインダー
    「Remind me to call John at 7pm.」
    「Remind me to pick up the cake this afternoon.」
    上記のように、正確またはおおよその時刻と合わせて音声入力することで、リマインダーが登録され、その時間になるとHome画面にNotificationが表示されます。
  • 場所ベースのリマインダー
    「Remind me to buy coffee beans when I get to Starbucks.」
    「Remind me to bring in the groceries when I get to my destination.」
    「Remind me to call mom when I get home.」
    上記のように、正確またはおおよその場所と合わせて音声入力することでリマインダーが登録され、その場所に到着するとHome画面にNotificationが表示されます。

・目的地ナビゲーションの取得

  • 音声によるナビ検索
    「Navigate to Union Square, San Francisco」
    「Directions to Philz Coffee.」
    「Directions to 1600 Amphitheatre Parkway, Mountain View.」
    上記のように目的地を音声入力するだけで、ナビが開始されます。

  • 手操作によるナビ検索
    ホーム画面下部のナビゲーションアイコンを押し、操作します。

  • 交通情報の取得
    交通情報に合わせた表示更新はリアルタイムに行われます。メニューの設定から交通情報表示をオフにすることも可能です。

・Google Mapからの目的地候補取得

  • 目的地候補の取得
    ホーム画面下部のナビゲーションアイコンから、人気のスポットや過去に行ったことのある目的地候補を取得できます。

  • カテゴリ検索
    ホーム画面下部のナビゲーションアイコンから、目的地のカテゴリ検索が可能です。

・音楽再生

「play music.」と言うだけで、"I'm feeling lucky"プレイリストがデフォルトで再生されます。
特定の曲やアーティストを指定する場合は、「play」の後に続けて音声入力します。



----------

以上が、Android Autoの使用方法になります。
音声入力によるカーナビ操作は、運転中でもかなり便利そうです。
ただし、それだけ音声入力が肝になるため、
日本語対応には時間がかかっているのかもしれません。
近い将来、日本でもAndroid Autoを使用できるのが待ち遠しいですね。

[コラム]どうなった?Android Auto -使用方法編-

※Android Auto公式サイトより引用 https://www.android.com/intl/ja_jp/auto/

このブログでも何回か触れているAndroid Autoですが、その後どうなっているのでしょうか。
現在のAndroid Autoについてまとめました。

2015/3/20にAndroid Auto公式アプリがリリースされ、
Android Auto対応カーナビも続々発売されています。
しかし、現在利用可能な国はアメリカ、イギリス、オーストラリアだけです。
日本では、以下の日本語公式サイトが存在するものの、まだ利用できません。
https://www.android.com/intl/ja_jp/auto/

Android Autoに対応したアプリも配信されており、Google Playでもまとめられているようですが、
こちらも日本からはアクセスできません。
http://g.co/androidauto

日本でまだ利用できないのは残念ですが、
正式なサービスが始まっているため、いくつかの新情報もあります。
今回は、以下のURLで解説されているAndroid Autoの使用方法についてまとめました。
https://support.google.com/androidauto


■環境

・Android Autoの動作環境

  • Android Autoに対応したAndroid端末(Lollipop)
    車載カーナビとはUSBケーブルで接続します。
    また、カーナビとAndroid端末間ではBluetooth通信も使用します。
  • Android Auto公式アプリ(上記Android端末にインストール必須)
  • Android Autoに対応した車

・Android Autoで未対応の動作

おそらく安全面の理由から、以下の動作は未対応とされています。
  • Android Auto対応アプリ以外の端末操作(車載カーナビとUSBケーブル接続中)
  • テレビ、youtubeなどの動画再生
  • 文字入力キーボードの使用

・その他

  • Android Autoで使用するデータ通信は、Android端末上で発生する量と同等。
    外部と通信するのはあくまでAndroid端末のみ、ということになります。
  • Android Auto使用中、Android端末はUSBケーブルを通じて給電される。
    極端にバッテリーを消耗するAndroid Autoアプリがない限り、バッテリーの心配はなさそうです。
  • GPSが内蔵されている車であれば、Android端末は車側のGPS信号を使用できる。
    仕組みは不明ですが、Android端末側のGPS精度は気にしなくて良いようです。

■画面構成

・ホーム画面

Android Auto開始後、カーナビのディスプレイにはAndroid Autoのホーム画面が表示されます。ホーム画面の構成は以下のようになっています。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション通知
  2. リマインダー
  3. 音声コマンド
    マイクアイコンをタッチすることで、音声入力が可能になり、以下の操作が行えます。
    ・音楽再生(曲名)
    ・地図のルート検索
    ・電話発信
    ・スケジュールの取得

・アプリ選択

ホーム画面の下部にはアプリカテゴリのアイコンがあり、選択するとAndroid端末内にインストールされているAndroid Auto対応アプリのリストが表示されます。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション
  2. 電話
  3. ホーム画面
  4. 音楽再生
  5. 車アプリ

■Android Autoの使い方

Android Autoでは音声入力による操作が前提です。
音声入力やその他の操作で以下の機能を使用できます。

・電話

  • 発信(音声入力)
    「Call Cody White」「Call XXX-XXX-XXX」のように、「Call」の後に名前(電話帳に登録されている)や電話番号を言うだけで発信が可能です。

  • 発信(番号入力)
    ホーム画面下部の電話アイコンを押し、表示されるダイヤル画面から発信可能です。

  • 着信応答
    着信を受けると、ホーム画面上にNotificationが表示されます。それをタッチすることで、着信応答できます。

  • 不在着信応答
    不在着信情報は、ホーム画面上のNotificationとして表示されます。それをタッチすることで、不在着信に応答できます。

  • 留守電や通話履歴の参照
    ホーム画面下部の電話アイコンを押し、メニューから選択します。

・テキストメッセージの送信

  • テキスト送信
    「Text Cody White」「Text XXX-XXX-XXX」のように、「Text」の後に名前(電話帳に登録されている)や電話番号を言うだけでテキスト送信機能が起動します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

  • テキスト受信
    受信すると、ホーム画面上にNotificationが表示されます。それをタッチすることで、受信したテキストが音声で読み上げられます。
  • テキスト返信
    「reply」と話すことで、最後に受信したテキストに対する返信を開始します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

・リマインダーの設定

  • 時間ベースのリマインダー
    「Remind me to call John at 7pm.」
    「Remind me to pick up the cake this afternoon.」
    上記のように、正確またはおおよその時刻と合わせて音声入力することで、リマインダーが登録され、その時間になるとHome画面にNotificationが表示されます。
  • 場所ベースのリマインダー
    「Remind me to buy coffee beans when I get to Starbucks.」
    「Remind me to bring in the groceries when I get to my destination.」
    「Remind me to call mom when I get home.」
    上記のように、正確またはおおよその場所と合わせて音声入力することでリマインダーが登録され、その場所に到着するとHome画面にNotificationが表示されます。

・目的地ナビゲーションの取得

  • 音声によるナビ検索
    「Navigate to Union Square, San Francisco」
    「Directions to Philz Coffee.」
    「Directions to 1600 Amphitheatre Parkway, Mountain View.」
    上記のように目的地を音声入力するだけで、ナビが開始されます。

  • 手操作によるナビ検索
    ホーム画面下部のナビゲーションアイコンを押し、操作します。

  • 交通情報の取得
    交通情報に合わせた表示更新はリアルタイムに行われます。メニューの設定から交通情報表示をオフにすることも可能です。

・Google Mapからの目的地候補取得

  • 目的地候補の取得
    ホーム画面下部のナビゲーションアイコンから、人気のスポットや過去に行ったことのある目的地候補を取得できます。

  • カテゴリ検索
    ホーム画面下部のナビゲーションアイコンから、目的地のカテゴリ検索が可能です。

・音楽再生

「play music.」と言うだけで、"I'm feeling lucky"プレイリストがデフォルトで再生されます。
特定の曲やアーティストを指定する場合は、「play」の後に続けて音声入力します。



----------

以上が、Android Autoの使用方法になります。
音声入力によるカーナビ操作は、運転中でもかなり便利そうです。
ただし、それだけ音声入力が肝になるため、
日本語対応には時間がかかっているのかもしれません。
近い将来、日本でもAndroid Autoを使用できるのが待ち遠しいですね。

2015年7月10日金曜日

最近17歳の少年が逮捕されて※1、日本でもその脅威が認知されつつある「ランサムウェア」について調べてみたいと思います。

[コラム]ランサムウェアについて調べてみる

最近17歳の少年が逮捕されて※1、日本でもその脅威が認知されつつある「ランサムウェア」について調べてみたいと思います。

2015年7月9日木曜日


はじめに

mbed nRF51822 に新機能が追加されました。今回は 2015年5月に追加された新機能についてAPI仕様や使用方法について紹介いたします。



BluetoothSMARTデバイスをmbed で開発する(8)


はじめに

mbed nRF51822 に新機能が追加されました。今回は 2015年5月に追加された新機能についてAPI仕様や使用方法について紹介いたします。



2015年6月29日月曜日

腕、手首、指の動きで様々なデバイスをコントロールできるMyo。本記事ではこのMyoの特徴と、利用シーンを考えたいと思います。

▲[外部] Myo The Lab より抜粋


myoとは

myoは、 Thalmic Labs 社によって開発された、腕、手首、指の動きで様々なデバイスをコントロールできるアームバンドで、 手首や指の動きのトラッキングに筋電センサーが使われてるのが特徴です。

筋電センサーとは、筋肉を動かす時に発生する微小電圧を計測するセンサーのことで、この電圧で手首や指の動きを感知することができます。
またmyoは、加速度センサ、ジャイロスコープ、磁気センサも搭載しており、腕の向きや動きをトラッキングするのに使われます。
アウトプットとしては、充電や接続を知らせるLEDと、ジェスチャーが認識されたことを知らせるバイブレータを搭載。
端末との接続はBLEが使われています。

このmyoをパソコンやスマートフォンに接続しジェスチャーを行うことで、端末自体を動かしたり、さらに端末とつながっているデバイスなどをコントロールすることができるのです。

手のジェスチャーには下図のようなDoubleTap、FingerSpread、WaveOut、WaveIn、Fistといった5つのジェスチャーがプリセットで用意されています。

▲[外部] Myo Supportより抜粋

腕の動き(YAW)と、腕の回転(ROLL)、手首をそらす動き(PITCH)も取得できます。

▲[外部] Myo The Lab より抜粋

また開発者は、myoの生のEMGセンサデータを取得することができ、それを元にカスタムジェスチャーを創りだすこともできます。


myo SDKから取得できる情報

myo SDKが受け取れるイベントや、取れる値は下記の通り。

  • Myoが新しく加わった
  • Myoが切り離された
  • Myoと繋がった
  • Myoと切断された
  • Myoが腕につけられた
    • 使用者と腕の相対x軸
  • Myoが腕から外された
  • Myoがアンロックになった
  • Myoがロックされた
  • Myoがポーズを検出した
    • 通常のポーズ
    • こぶしのポーズ
    • 手首を内側に曲げたポーズ
    • 手首を外側に曲げたポーズ
    • 指を広げたポーズ
    • タブルタップ
    • 不明なポーズ
  • Myoが方向(回転)の変化を得た
    • 回転ベクトルのx成分
    • 回転ベクトルのy成分
    • 回転ベクトルのz成分
    • 回転のスカラー成分
  • Myoが加速度の変化を得た
    • ベクトルのx成分
    • ベクトルのy成分
    • ベクトルのz成分
    • ベクトルの長さ
  • Myoがジャイロスコープの変化を得た
    • ベクトルのx成分
    • ベクトルのy成分
    • ベクトルのz成分
    • ベクトルの長さ
  • MyoのRSSIを取得した

他のジェスチャーデバイスと比較して見えるMyoの特徴

Kinect、Leap Motionとの違い

▲[外部] Leap Motion より抜粋

KinectやLeap Motionといったデプスセンサーは、手の動きなどをセンシングすることができますが、センサーを机などに設置する必要があります。また、太陽の赤外線はセンシングにノイズを生むため、屋外での利用は厳しくなります。
Myoは腕に巻き付けるため、身につけたまま行動することができ、屋外でも利用ができるのが特徴です。

Ringとの違い

▲[外部] Ring ZERO Shiny White より抜粋

Ringは指先の動きを細かくトラッキングすることができますが、Ringをつけている指しかトラッキングできません。
Myoは着けている腕の方の指だけでなく手全体の動きをトラッキングすることができます。

Moffとの違い

▲[外部] Moff(モフ) より抜粋

Moffは腕をどの方向にどれくらいの早さで動かしたかをトラッキングすることができます。
Myoも同じことができますが、さらに手首の動きや、指のタップなどをトラッキングすることができます。
また、Moffは独自のアプリケーションを作ることができませんが、MyoはSDKが提供されており自由にアプリケーションを開発することができます。


Myoにしかできない使い方

他のジェスチャーデバイスと比べた場合、Myoの特徴は、動き回りながら利用できることと、手全体や手首を使ったジェスチャーができるところに長けていると言えます。
例えば野球、バスケットボールなど手首を使うスポーツのゲームコントローラーといった感じです。
投げるときの腕の振り、スナップの大きさ、指の本数、曲げ具合を認識し、本当に野球をするのと同じように変化球を投げることができます。


まとめ

Myoを実際に利用した感じでは、細かいアクションには向いていません。Moffのように元気に動きまわって使うシーンに向いている感じがしました。
Myoはすでに自由にアプリを作成できるSDKや、アプリを公開できるストアも用意されています。
みんながはしゃいで遊べて、新しい体験を与えるようなアプリを作ってみてはどうでしょうか。

[コラム] 筋電センサーアームバンド「myo」は、動き回りながらでも手の動きがトラッキングできるガジェット

腕、手首、指の動きで様々なデバイスをコントロールできるMyo。本記事ではこのMyoの特徴と、利用シーンを考えたいと思います。

▲[外部] Myo The Lab より抜粋


myoとは

myoは、 Thalmic Labs 社によって開発された、腕、手首、指の動きで様々なデバイスをコントロールできるアームバンドで、 手首や指の動きのトラッキングに筋電センサーが使われてるのが特徴です。

筋電センサーとは、筋肉を動かす時に発生する微小電圧を計測するセンサーのことで、この電圧で手首や指の動きを感知することができます。
またmyoは、加速度センサ、ジャイロスコープ、磁気センサも搭載しており、腕の向きや動きをトラッキングするのに使われます。
アウトプットとしては、充電や接続を知らせるLEDと、ジェスチャーが認識されたことを知らせるバイブレータを搭載。
端末との接続はBLEが使われています。

このmyoをパソコンやスマートフォンに接続しジェスチャーを行うことで、端末自体を動かしたり、さらに端末とつながっているデバイスなどをコントロールすることができるのです。

手のジェスチャーには下図のようなDoubleTap、FingerSpread、WaveOut、WaveIn、Fistといった5つのジェスチャーがプリセットで用意されています。

▲[外部] Myo Supportより抜粋

腕の動き(YAW)と、腕の回転(ROLL)、手首をそらす動き(PITCH)も取得できます。

▲[外部] Myo The Lab より抜粋

また開発者は、myoの生のEMGセンサデータを取得することができ、それを元にカスタムジェスチャーを創りだすこともできます。


myo SDKから取得できる情報

myo SDKが受け取れるイベントや、取れる値は下記の通り。

  • Myoが新しく加わった
  • Myoが切り離された
  • Myoと繋がった
  • Myoと切断された
  • Myoが腕につけられた
    • 使用者と腕の相対x軸
  • Myoが腕から外された
  • Myoがアンロックになった
  • Myoがロックされた
  • Myoがポーズを検出した
    • 通常のポーズ
    • こぶしのポーズ
    • 手首を内側に曲げたポーズ
    • 手首を外側に曲げたポーズ
    • 指を広げたポーズ
    • タブルタップ
    • 不明なポーズ
  • Myoが方向(回転)の変化を得た
    • 回転ベクトルのx成分
    • 回転ベクトルのy成分
    • 回転ベクトルのz成分
    • 回転のスカラー成分
  • Myoが加速度の変化を得た
    • ベクトルのx成分
    • ベクトルのy成分
    • ベクトルのz成分
    • ベクトルの長さ
  • Myoがジャイロスコープの変化を得た
    • ベクトルのx成分
    • ベクトルのy成分
    • ベクトルのz成分
    • ベクトルの長さ
  • MyoのRSSIを取得した

他のジェスチャーデバイスと比較して見えるMyoの特徴

Kinect、Leap Motionとの違い

▲[外部] Leap Motion より抜粋

KinectやLeap Motionといったデプスセンサーは、手の動きなどをセンシングすることができますが、センサーを机などに設置する必要があります。また、太陽の赤外線はセンシングにノイズを生むため、屋外での利用は厳しくなります。
Myoは腕に巻き付けるため、身につけたまま行動することができ、屋外でも利用ができるのが特徴です。

Ringとの違い

▲[外部] Ring ZERO Shiny White より抜粋

Ringは指先の動きを細かくトラッキングすることができますが、Ringをつけている指しかトラッキングできません。
Myoは着けている腕の方の指だけでなく手全体の動きをトラッキングすることができます。

Moffとの違い

▲[外部] Moff(モフ) より抜粋

Moffは腕をどの方向にどれくらいの早さで動かしたかをトラッキングすることができます。
Myoも同じことができますが、さらに手首の動きや、指のタップなどをトラッキングすることができます。
また、Moffは独自のアプリケーションを作ることができませんが、MyoはSDKが提供されており自由にアプリケーションを開発することができます。


Myoにしかできない使い方

他のジェスチャーデバイスと比べた場合、Myoの特徴は、動き回りながら利用できることと、手全体や手首を使ったジェスチャーができるところに長けていると言えます。
例えば野球、バスケットボールなど手首を使うスポーツのゲームコントローラーといった感じです。
投げるときの腕の振り、スナップの大きさ、指の本数、曲げ具合を認識し、本当に野球をするのと同じように変化球を投げることができます。


まとめ

Myoを実際に利用した感じでは、細かいアクションには向いていません。Moffのように元気に動きまわって使うシーンに向いている感じがしました。
Myoはすでに自由にアプリを作成できるSDKや、アプリを公開できるストアも用意されています。
みんながはしゃいで遊べて、新しい体験を与えるようなアプリを作ってみてはどうでしょうか。

2015年6月19日金曜日


Appleの開発者のイベント、WWDC2015に弊社からも参加いたしました。今回の勉強会ではWWDC2015の報告会とAppleWatchの新機能、そしてAutoLayoutの新機能やiOS9からiPadに搭載されるMultitaskingについて発表を行いました!


[コラム]WWDC2015報告会&iOS&AppleWatch勉強会を開催しました


Appleの開発者のイベント、WWDC2015に弊社からも参加いたしました。今回の勉強会ではWWDC2015の報告会とAppleWatchの新機能、そしてAutoLayoutの新機能やiOS9からiPadに搭載されるMultitaskingについて発表を行いました!


2015年6月9日火曜日


Appleが毎年開発しているWWDCが現地時間の6月9日から始まりました。
キーノートでは「Mac OS X」「iOS」「watchOS」のそれぞれのアップデート内容が発表されました。


引用(http://www.apple.com/live/2015-june-event/)

Mac OS X

次バージョンの名前はEl Capitanです。
余談ですが、El Capitanはヨセミテの中にあるようです。

メール

iOSのような操作でメールの削除などができるようになりました。
また、別窓(例えばウェブ画面)から作成中のメールに画像を添付することができるようになりました。

Safari

タブを左側に溜められるようになりました。
また、音声再生中ならば検索窓に音声を静音することができます。

検索

あいまい検索やスポーツ結果・天気なども検索できるようになりました。

2分割機能

文字通りウィンドウを2分割する機能です。
今まではサードパーティアプリを導入しなければならなかったので
個人的にはこの機能の追加は喜ばしいです。

メタル

昨年iOSに追加された機能がMacでも導入されます。

リリース時期

開発者版は本日から、一般向けベータ版は7月から、正式リリースは秋予定となっています。

引用(http://www.apple.com/live/2015-june-event/)

iOS

siri

あいまいな検索ワードでも結果が返ってくるようになりました。
デモでは去年撮った写真をsiriにお願いして表示していました。

プロアクティブアシスタント

登録していない番号からの着信でも着信相手を予測して表示するデモがありました。
こちらはAPIが用意されるようです。

ApplePay

導入店のカードの追加を発表し、来月からイギリスでも利用できるようです。
 

Wallet

Passbookアプリが廃止されて、Walletになります。

ノート

タイトルや本文、チャックボックスと写真、マップが追加できるようになりました。

マップ

公共機関が表示されるようになるようですがアップデート都市に日本の都市は見当たりませんでした。
 

ニュースアプリ

レイアウトなどが変更されましたがアメリカ、イギリス、オーストラリアから提供が開始されます。
 

iPad

キーボード

カット、ペースト、コピーがのショートカットが追加されました。

マルチタスク機能

1画面に2アプリが起動ができるようになりました。
また最大50:50のサイズで表示できます。
こちらはAPIが提供されて自動レイアウトで調整が必要なようです。
この発表を聞いてみんなオーという声を出していました。
世界中の人がマルチタスクで苦労しているということが分かった。


Swift2

機能強化が図られて今年中にオープンソースとして提供されます。
これを聞いて今日一番の盛り上がりでした。
 

リリース時期

開発者版は本日から、一般向けベータ版は7月から、正式リリースは秋予定となっています。


引用(http://www.apple.com/live/2015-june-event/)

watchOS

文字盤

写真やアルバムタイムラプスが表示できるようになりました。
   

タイムトラベル

デジタルクラウンを回して時計の時間を動かして予定を確認できます。

友達

グループ化が追加されました。
   

メール

返信ができるようになりました。
ただ返信方法は音声入力となっています。

通話

FaceTimeオーディオに対応されました。

API

WatchKit強化されました。
デジタルクラウン開放されました。
 

リリース時期

開発者版は本日から、正式リリースは秋予定となっています。  


One more thing...

内容はリーク通りの音楽配信サービスでした。
リークでみんな知っていたからか周りの反応は、はいはいという感じで早速片付けをして帰る人もいたぐらいでした。

まとめ

駆け足となりましたが、本日キーノートで発表された内容をお伝えさせていただきました。
例年のように新しいデバイスの発表はありませんでしたが、watchOS2は次のApple Watchへの期待が高まるアップデートだと思います。

現地速報 SwiftのOSS化を発表 in Apple WWDC 2015


Appleが毎年開発しているWWDCが現地時間の6月9日から始まりました。
キーノートでは「Mac OS X」「iOS」「watchOS」のそれぞれのアップデート内容が発表されました。


引用(http://www.apple.com/live/2015-june-event/)

Mac OS X

次バージョンの名前はEl Capitanです。
余談ですが、El Capitanはヨセミテの中にあるようです。

メール

iOSのような操作でメールの削除などができるようになりました。
また、別窓(例えばウェブ画面)から作成中のメールに画像を添付することができるようになりました。

Safari

タブを左側に溜められるようになりました。
また、音声再生中ならば検索窓に音声を静音することができます。

検索

あいまい検索やスポーツ結果・天気なども検索できるようになりました。

2分割機能

文字通りウィンドウを2分割する機能です。
今まではサードパーティアプリを導入しなければならなかったので
個人的にはこの機能の追加は喜ばしいです。

メタル

昨年iOSに追加された機能がMacでも導入されます。

リリース時期

開発者版は本日から、一般向けベータ版は7月から、正式リリースは秋予定となっています。

引用(http://www.apple.com/live/2015-june-event/)

iOS

siri

あいまいな検索ワードでも結果が返ってくるようになりました。
デモでは去年撮った写真をsiriにお願いして表示していました。

プロアクティブアシスタント

登録していない番号からの着信でも着信相手を予測して表示するデモがありました。
こちらはAPIが用意されるようです。

ApplePay

導入店のカードの追加を発表し、来月からイギリスでも利用できるようです。
 

Wallet

Passbookアプリが廃止されて、Walletになります。

ノート

タイトルや本文、チャックボックスと写真、マップが追加できるようになりました。

マップ

公共機関が表示されるようになるようですがアップデート都市に日本の都市は見当たりませんでした。
 

ニュースアプリ

レイアウトなどが変更されましたがアメリカ、イギリス、オーストラリアから提供が開始されます。
 

iPad

キーボード

カット、ペースト、コピーがのショートカットが追加されました。

マルチタスク機能

1画面に2アプリが起動ができるようになりました。
また最大50:50のサイズで表示できます。
こちらはAPIが提供されて自動レイアウトで調整が必要なようです。
この発表を聞いてみんなオーという声を出していました。
世界中の人がマルチタスクで苦労しているということが分かった。


Swift2

機能強化が図られて今年中にオープンソースとして提供されます。
これを聞いて今日一番の盛り上がりでした。
 

リリース時期

開発者版は本日から、一般向けベータ版は7月から、正式リリースは秋予定となっています。


引用(http://www.apple.com/live/2015-june-event/)

watchOS

文字盤

写真やアルバムタイムラプスが表示できるようになりました。
   

タイムトラベル

デジタルクラウンを回して時計の時間を動かして予定を確認できます。

友達

グループ化が追加されました。
   

メール

返信ができるようになりました。
ただ返信方法は音声入力となっています。

通話

FaceTimeオーディオに対応されました。

API

WatchKit強化されました。
デジタルクラウン開放されました。
 

リリース時期

開発者版は本日から、正式リリースは秋予定となっています。  


One more thing...

内容はリーク通りの音楽配信サービスでした。
リークでみんな知っていたからか周りの反応は、はいはいという感じで早速片付けをして帰る人もいたぐらいでした。

まとめ

駆け足となりましたが、本日キーノートで発表された内容をお伝えさせていただきました。
例年のように新しいデバイスの発表はありませんでしたが、watchOS2は次のApple Watchへの期待が高まるアップデートだと思います。

2015年6月5日金曜日

はじめに

BLEは省電力であることが最大の特徴ではありますが、使い方によっては電池の減りが早かったり
以外なな落とし穴に陥る場合があります。
今回は消費電力を下げるためのアプローチについて掲載いたします。

BluetoothSMARTデバイスをmbed で開発する(7)

はじめに

BLEは省電力であることが最大の特徴ではありますが、使い方によっては電池の減りが早かったり
以外なな落とし穴に陥る場合があります。
今回は消費電力を下げるためのアプローチについて掲載いたします。

2015年5月20日水曜日


はじめに

前回はmbedを使用したBLEデバイスとAndroid 4.4および5.0でBLE接続に必要な実装について掲載いたしましたが、今回は4種類のGATTアクセスに着目して、それぞれの動作と実装方法について紹介いたします。

BluetoothSMARTデバイスをmbed で開発する(6)


はじめに

前回はmbedを使用したBLEデバイスとAndroid 4.4および5.0でBLE接続に必要な実装について掲載いたしましたが、今回は4種類のGATTアクセスに着目して、それぞれの動作と実装方法について紹介いたします。

2015年5月11日月曜日

はじめに

お待たせしました、昨年夏に連載していました「BluetoothSMARTデバイスをmbed で開発する(1)-(4)」の続編になります。

2014年の後半は mbed のnRF51822 周りの実装が安定せず掲載を中断しておりましたが、ライブラリを更新してもビルドが失敗するようなこともなくなってきましたので、掲載を再開とさせて頂きたいと思います。
今回からは Android アプリ開発に焦点を当てて、Andorid 5.0 以降で変更となるBLE関連のAPIについても掲載していきます。

BluetoothSMARTデバイスをmbed で開発する(5)

はじめに

お待たせしました、昨年夏に連載していました「BluetoothSMARTデバイスをmbed で開発する(1)-(4)」の続編になります。

2014年の後半は mbed のnRF51822 周りの実装が安定せず掲載を中断しておりましたが、ライブラリを更新してもビルドが失敗するようなこともなくなってきましたので、掲載を再開とさせて頂きたいと思います。
今回からは Android アプリ開発に焦点を当てて、Andorid 5.0 以降で変更となるBLE関連のAPIについても掲載していきます。

2015年5月9日土曜日


AppleWatchの発売日である4/24とその翌日の4/25にそれぞれ大阪と東京でApple Watchの勉強会を開催いたしました。
AppleWatch発売!Apple Watch WatchKit勉強会 大阪
AppleWatch発売!Apple Watch WatchKit勉強会 東京
私はNotificationについて説明させて頂きましたのでその時のスライドをベースに、その後試した内容を加筆してblogとして公開いたします。

実際にApple Watchを一週間使ってみて、アプリ機能やグランス機能なども一通り試してみました。私がApple Watchで一番頻度の高い機能であると考えるのはNotificationです。ちらりと見るだけで情報を把握、気になる内容だったらiPhoneを取り出してチェック、そんな風に使えるのでとても便利です。アプリケーションの品質を高めるためには、使いやすく、一見するだけで情報を把握できるように配慮されたNotificationを実装するべきでしょう。

Apple WatchでNotificationを出す方法


AppleWatchの発売日である4/24とその翌日の4/25にそれぞれ大阪と東京でApple Watchの勉強会を開催いたしました。
AppleWatch発売!Apple Watch WatchKit勉強会 大阪
AppleWatch発売!Apple Watch WatchKit勉強会 東京
私はNotificationについて説明させて頂きましたのでその時のスライドをベースに、その後試した内容を加筆してblogとして公開いたします。

実際にApple Watchを一週間使ってみて、アプリ機能やグランス機能なども一通り試してみました。私がApple Watchで一番頻度の高い機能であると考えるのはNotificationです。ちらりと見るだけで情報を把握、気になる内容だったらiPhoneを取り出してチェック、そんな風に使えるのでとても便利です。アプリケーションの品質を高めるためには、使いやすく、一見するだけで情報を把握できるように配慮されたNotificationを実装するべきでしょう。

2015年3月17日火曜日




はじめに


本記事は、Googleから発表されているAndroid Autoの特徴や機能に関してまとめた記事です。
Android Autoの現在使用可能な機能、将来的に使用出来る機能およびそのアプリケーションの構成に関して、大きく分けて以下のようにまとめています。(2015/03/13時点)

  • Android Autoとは
  • Android Autoの動作環境
  • Android Appについて
  • 今後の展望について

※本記事を記載するにあたって、以下のURLを参考にしております。

Android Autoとは?


1概要


1.1 Android Auto


Android Autoとは、Android端末とカーナビ等の車載器(テレマティクス)と連動するシステムです。

ユーザーは車載機の操作のみでAndroid端末と連携でき、サービス、メールの確認、

音楽の再生、目的地までのナビゲーションなどのサービスを受けることが出来ます。


図 1.1.1.1

1.2 特徴

Android Autoに関する公式な発表では、まだ一部しか公開されていませんが、
Googleから発表されている動画や実際にハンズオンしている動画を見ると、
以下のような特徴が見て取れます。

  • Android端末とAndroid Auto搭載の車載機をUSBケーブルでつなぐことで連携を開始します。
  • Android Autoはタッチパネルによる操作のみでなく、音声入力によるハンズフリー操作、そして対話型の操作が可能です。
Android端末との連携では、以下のような機能が想定されています。
 ※現在開発方法が公開されているのは、音楽再生、通知機能のみです。
  • 音声認識
    • メールや通知に対する返信の作成
    • 別アプリの起動および操作
  • 音声再生
    • メール・リマインダーやスケジュール通知の読み上げ
  • 音楽再生
    • スマートフォン内の音楽データの再生
  • 電話機能
    • スマートフォン内の電話帳から電話
    • ダイヤル入力による電話
  • 通知機能
    • 通知を選択すると、内容の音声読み上げ
    • 通知に対しての返信
  • Google Mapによるナビゲーション

Android Autoの動作環境

1 Android Auto動作環境の構成


現在公開されているAndroid Autoアプリの開発環境は以下のようになっています。



図 2.1.1

以下の表にAndroid Auto動作環境の構成に関しての用語をまとめておきます。
Android Auto
API Simulators
車載機側プラットフォームのシュミレータアプリ。
このアプリ上で、Android Autoアプリの動作が確認できる。
現在はオーディオ系とNotification系の2種類が存在する。
Android  Auto App
Android Auto向けに拡張したAndroidアプリ。

Android Auto APPについて

1 Android Autoでできること


Android Autoアプリの開発方法については、以下の2機能が公開されています。(2015/03/13時点)

1.1 AndroidAuto音楽再生


  1. 車載機上からのスマートフォン内の音楽データの再生
   再生、停止、送り、戻るなどの車載機上からの操作をコントロールできます。
   シミュレーターアプリと連携する前に聞いていた音楽を、
   シミュレーターアプリ上でも再生することが出来ます。

  1. スマートフォン内の音楽アプリと同等のプレイリストを取得、閲覧
   バックグラウンドに選択されたアプリと同様のプレイリストを取得し、
   シミュレーターアプリでも再生する音楽リストを閲覧、選択することが出来ます。

1.2 AndroidAutoNotification




  1. 車載機器へのNotification送信
   車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。

   Notificationを車載機器側(現在はシミュレーターアプリ上)に通知できます。


  1. 車載機器からの既読通知を受信
   車載機器側でNotificationが選択される(=音声読み上げ)と、

   既読になったことをIntent通知で受け取ることができます。


  1. 車載機器からの返信を受信
   車載機器側でNotificationに対する返信操作が行われると、
   その内容をIntent通知で受け取ることができます。

※動作確認の方法やシミュレーター、アプリの作成方法に関してはこちらの記事を参考にしてください。

今後の展望について


1アプリケーションについて


1.1 Googleが想定しているアプリケーションの構成

Googleが発表している動画で、音楽再生アプリを例に以下のアプリ構成図にて解説を行なっています。
Android Auto アプリケーションの構成に関しての説明をしているもので、2章で記載していたものとは構成が異なります。
このような構成にすることによって、既存のアプリケーションを1から作り直すことなく、Android Autoに対応させることが出来るため、将来的にはほとんどのアプリがこのような構成になるものではないかと予想されます。


図 4.1.1.1


以下の表にAndroid Auto Appを構成に関しての用語をまとめておきます。

My Audio App
スマートフォン上で動く MusicPlayer アプリケーション
Android Auto App
“Auto enable car”上で車載器用に設計されたUIを表示し、操作を“My Audio App”へ中継するアプリケーション
Auto enable car
Android Auto 機能対応車載機。”Android Auto App” を表示する。

上記のように、My Android App(既存の一般的なアプリケーション)をAndroid Auto Appという中継アプリとの連携させることで、Auto enabled car(車載機)上からMy Android Appを操作することが可能になるという構成になっています。

つまり、Android Auto App自体はただのコントローラーであり、実際に処理が行われているのはスマートフォン上にあるMy Audio Appであるという仕組みです。


1.2 想定されるアプリケーションの使用例


上記のような構成から将来的には、
以下のような使用方法が出来るのではないかと予想されます。
※例として、既存の
アプリケーション(スケジュール管理や音声で別アプリを起動出来る物)がAndroid Auto Appに拡張されたとします。

 乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく
 車載器とスマートフォンを接続
 乗車後 1:車載器から、スケジュールの通知がされる。
 乗車後 2:続けて車載マイクからに向けて、入力を行う。
  例) メールの作成、別アプリ起動、SNS投稿

イメージは以下の通りです。

図 4.1.2.1 
乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく

図 4.1.2.2 車載器とスマートフォンを接続

図 4.1.2.3 乗車後 1:車載器から、スケジュールの通知がされる

図 4.1.2.4 乗車後 2:続けて車載マイクから、入力を行う 1
                                            
 
図 4.1.2.5 乗車後 2:続けて車載マイクから、入力を行う 2

2 懸念点


Android Autoに関して、以下のような懸念点があります。(2015/03/13時点)

  • Android Auto(車載器側)が非公開であること
Android Auto搭載ナビがまだ発売されておらず(※1)
APIおよびプラットフォームに関する情報が非公開になっています。
ナビOS上にAndroid AutoのVMまたはアプリケーションが起動されるのか、
どのようにアプリケーションが起動され、制御されるか不明な状態です。

  • Android Autoのすべての機能が公開されていないこと
現在、公式PV等などではGoogle Mapや音声認識等がデモで行われていますが、
音楽再生機能とメッセージ通知機能のみが一般的に公開されています。
Googleの狙いとしては、既存のアプリケーションやサービスを多少の変更のみでAndroid Auto Appとして拡張出来ることをコンセプトとしているようですが、その実現方法などは未だに非公開です。

  • アプリ審査・公開の問題
UIなどの観点からすべてのアプリが公開されるのは難しいと予想されます。
Android Auto Appは安全審査を行うとありますが、
運転中に使用しても問題ないUIの設計を遵守されているか、
運転を阻害する機能が備わっていないか等の、
アプリケーション機能のすべてを網羅出来るか。
又、Googleの審査を通ったとしても、
日本の基準に公開されたアプリケーションが適しているか等の問題点もあります。(※2)
命に関わる問題なので、とても容易ではない事が予想出来ます。


※1: パイオニア株式会社の連結子会社であるPioneer Electronics (USA) Inc.から3月に北米、西欧で発売予定(日本国内での販売は今のところ無し)
※2:Android Auto公式ページでも、「運転中に便利な機能」には「音楽(日本国内対応未定)」と記載されています。

免責事項

本資料に掲載された情報は、より多くの方々にAndroid Autoを知っていただき、技術に触れ、役立てて頂くことを目的としたものです。
本資料に掲載された情報の利用にあたっては各自の判断に基づき行うものとし、それによって生じた一切の損害について弊社および情報提供者は一切の責任を負いません。



[コラム] Android Autoの機能と今後について




はじめに


本記事は、Googleから発表されているAndroid Autoの特徴や機能に関してまとめた記事です。
Android Autoの現在使用可能な機能、将来的に使用出来る機能およびそのアプリケーションの構成に関して、大きく分けて以下のようにまとめています。(2015/03/13時点)

  • Android Autoとは
  • Android Autoの動作環境
  • Android Appについて
  • 今後の展望について

※本記事を記載するにあたって、以下のURLを参考にしております。

Android Autoとは?


1概要


1.1 Android Auto


Android Autoとは、Android端末とカーナビ等の車載器(テレマティクス)と連動するシステムです。

ユーザーは車載機の操作のみでAndroid端末と連携でき、サービス、メールの確認、

音楽の再生、目的地までのナビゲーションなどのサービスを受けることが出来ます。


図 1.1.1.1

1.2 特徴

Android Autoに関する公式な発表では、まだ一部しか公開されていませんが、
Googleから発表されている動画や実際にハンズオンしている動画を見ると、
以下のような特徴が見て取れます。

  • Android端末とAndroid Auto搭載の車載機をUSBケーブルでつなぐことで連携を開始します。
  • Android Autoはタッチパネルによる操作のみでなく、音声入力によるハンズフリー操作、そして対話型の操作が可能です。
Android端末との連携では、以下のような機能が想定されています。
 ※現在開発方法が公開されているのは、音楽再生、通知機能のみです。
  • 音声認識
    • メールや通知に対する返信の作成
    • 別アプリの起動および操作
  • 音声再生
    • メール・リマインダーやスケジュール通知の読み上げ
  • 音楽再生
    • スマートフォン内の音楽データの再生
  • 電話機能
    • スマートフォン内の電話帳から電話
    • ダイヤル入力による電話
  • 通知機能
    • 通知を選択すると、内容の音声読み上げ
    • 通知に対しての返信
  • Google Mapによるナビゲーション

Android Autoの動作環境

1 Android Auto動作環境の構成


現在公開されているAndroid Autoアプリの開発環境は以下のようになっています。



図 2.1.1

以下の表にAndroid Auto動作環境の構成に関しての用語をまとめておきます。
Android Auto
API Simulators
車載機側プラットフォームのシュミレータアプリ。
このアプリ上で、Android Autoアプリの動作が確認できる。
現在はオーディオ系とNotification系の2種類が存在する。
Android  Auto App
Android Auto向けに拡張したAndroidアプリ。

Android Auto APPについて

1 Android Autoでできること


Android Autoアプリの開発方法については、以下の2機能が公開されています。(2015/03/13時点)

1.1 AndroidAuto音楽再生


  1. 車載機上からのスマートフォン内の音楽データの再生
   再生、停止、送り、戻るなどの車載機上からの操作をコントロールできます。
   シミュレーターアプリと連携する前に聞いていた音楽を、
   シミュレーターアプリ上でも再生することが出来ます。

  1. スマートフォン内の音楽アプリと同等のプレイリストを取得、閲覧
   バックグラウンドに選択されたアプリと同様のプレイリストを取得し、
   シミュレーターアプリでも再生する音楽リストを閲覧、選択することが出来ます。

1.2 AndroidAutoNotification




  1. 車載機器へのNotification送信
   車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。

   Notificationを車載機器側(現在はシミュレーターアプリ上)に通知できます。


  1. 車載機器からの既読通知を受信
   車載機器側でNotificationが選択される(=音声読み上げ)と、

   既読になったことをIntent通知で受け取ることができます。


  1. 車載機器からの返信を受信
   車載機器側でNotificationに対する返信操作が行われると、
   その内容をIntent通知で受け取ることができます。

※動作確認の方法やシミュレーター、アプリの作成方法に関してはこちらの記事を参考にしてください。

今後の展望について


1アプリケーションについて


1.1 Googleが想定しているアプリケーションの構成

Googleが発表している動画で、音楽再生アプリを例に以下のアプリ構成図にて解説を行なっています。
Android Auto アプリケーションの構成に関しての説明をしているもので、2章で記載していたものとは構成が異なります。
このような構成にすることによって、既存のアプリケーションを1から作り直すことなく、Android Autoに対応させることが出来るため、将来的にはほとんどのアプリがこのような構成になるものではないかと予想されます。


図 4.1.1.1


以下の表にAndroid Auto Appを構成に関しての用語をまとめておきます。

My Audio App
スマートフォン上で動く MusicPlayer アプリケーション
Android Auto App
“Auto enable car”上で車載器用に設計されたUIを表示し、操作を“My Audio App”へ中継するアプリケーション
Auto enable car
Android Auto 機能対応車載機。”Android Auto App” を表示する。

上記のように、My Android App(既存の一般的なアプリケーション)をAndroid Auto Appという中継アプリとの連携させることで、Auto enabled car(車載機)上からMy Android Appを操作することが可能になるという構成になっています。

つまり、Android Auto App自体はただのコントローラーであり、実際に処理が行われているのはスマートフォン上にあるMy Audio Appであるという仕組みです。


1.2 想定されるアプリケーションの使用例


上記のような構成から将来的には、
以下のような使用方法が出来るのではないかと予想されます。
※例として、既存の
アプリケーション(スケジュール管理や音声で別アプリを起動出来る物)がAndroid Auto Appに拡張されたとします。

 乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく
 車載器とスマートフォンを接続
 乗車後 1:車載器から、スケジュールの通知がされる。
 乗車後 2:続けて車載マイクからに向けて、入力を行う。
  例) メールの作成、別アプリ起動、SNS投稿

イメージは以下の通りです。

図 4.1.2.1 
乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく

図 4.1.2.2 車載器とスマートフォンを接続

図 4.1.2.3 乗車後 1:車載器から、スケジュールの通知がされる

図 4.1.2.4 乗車後 2:続けて車載マイクから、入力を行う 1
                                            
 
図 4.1.2.5 乗車後 2:続けて車載マイクから、入力を行う 2

2 懸念点


Android Autoに関して、以下のような懸念点があります。(2015/03/13時点)

  • Android Auto(車載器側)が非公開であること
Android Auto搭載ナビがまだ発売されておらず(※1)
APIおよびプラットフォームに関する情報が非公開になっています。
ナビOS上にAndroid AutoのVMまたはアプリケーションが起動されるのか、
どのようにアプリケーションが起動され、制御されるか不明な状態です。

  • Android Autoのすべての機能が公開されていないこと
現在、公式PV等などではGoogle Mapや音声認識等がデモで行われていますが、
音楽再生機能とメッセージ通知機能のみが一般的に公開されています。
Googleの狙いとしては、既存のアプリケーションやサービスを多少の変更のみでAndroid Auto Appとして拡張出来ることをコンセプトとしているようですが、その実現方法などは未だに非公開です。

  • アプリ審査・公開の問題
UIなどの観点からすべてのアプリが公開されるのは難しいと予想されます。
Android Auto Appは安全審査を行うとありますが、
運転中に使用しても問題ないUIの設計を遵守されているか、
運転を阻害する機能が備わっていないか等の、
アプリケーション機能のすべてを網羅出来るか。
又、Googleの審査を通ったとしても、
日本の基準に公開されたアプリケーションが適しているか等の問題点もあります。(※2)
命に関わる問題なので、とても容易ではない事が予想出来ます。


※1: パイオニア株式会社の連結子会社であるPioneer Electronics (USA) Inc.から3月に北米、西欧で発売予定(日本国内での販売は今のところ無し)
※2:Android Auto公式ページでも、「運転中に便利な機能」には「音楽(日本国内対応未定)」と記載されています。

免責事項

本資料に掲載された情報は、より多くの方々にAndroid Autoを知っていただき、技術に触れ、役立てて頂くことを目的としたものです。
本資料に掲載された情報の利用にあたっては各自の判断に基づき行うものとし、それによって生じた一切の損害について弊社および情報提供者は一切の責任を負いません。



2015年2月18日水曜日

nestとはサーモスタットのように人々に愛されていない器械に焦点を当て、これをリデザインし合理的なデザインかつ利便性の向上を果たした次世代のサーモスタットです。現在Nest Developer Programとしてnestを操作するためのAPIが公開されており、本文書ではnestについての説明を日米の冷暖房文化の違いを交えて説明した上で開発環境の構築方法について解説します。

PDFがこちらからダウンロード出来ます。
http://www.brilliantservice.co.jp/bril-tech-blogspot/nest_develop_environment.pdf

IoTを実現するGoogle Nest APIでスマートホーム開発環境を整える

nestとはサーモスタットのように人々に愛されていない器械に焦点を当て、これをリデザインし合理的なデザインかつ利便性の向上を果たした次世代のサーモスタットです。現在Nest Developer Programとしてnestを操作するためのAPIが公開されており、本文書ではnestについての説明を日米の冷暖房文化の違いを交えて説明した上で開発環境の構築方法について解説します。

PDFがこちらからダウンロード出来ます。
http://www.brilliantservice.co.jp/bril-tech-blogspot/nest_develop_environment.pdf

2015年2月16日月曜日



15/02/06に「sharp wearable ideathon」が開催されました。

今回のテーマは、ウェアラブル。
弊社もウェアラブルデバイス「mirama」を作っていることもあり、大阪開発課から3人(大田、田中、佐々木)が法人の部へ参加してきました。

[コラム] シャープ株式会社のウェアラブルアイデアソンに参加してきました



15/02/06に「sharp wearable ideathon」が開催されました。

今回のテーマは、ウェアラブル。
弊社もウェアラブルデバイス「mirama」を作っていることもあり、大阪開発課から3人(大田、田中、佐々木)が法人の部へ参加してきました。

2014年12月4日木曜日


Android Auto用の音楽再生アプリを作ってみました。まずは再生、曲送りと曲戻しのみ行う簡単なものから挑戦しました。再生操作にはMediaSessionクラスを使用します。

■通常の音楽再生アプリと違う点

Android Auto用の音楽再生アプリは車載デバイスのためのオーディオサービスを提供します。このサービスによって、車載デバイスはメディアデータの一覧を参照し、カーステレオなどから音楽を再生することができます。

■専用リソースファイルのメタデータ定義

AndoridManifestファイルにはapplicationタグ内に以下のように定義し、
<meta-data
    android:name="com.google.android.gms.car.application"
    android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイル\res\xml\automotive_app_desc.xmlを用意します。

■専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルautomotive_app_desc.xmlには以下のように記載します。音楽を再生するためのクラスを使用する場合は"media"を定義します。メッセージアプリを使用する場合は"notification"と定義します。
<automotiveapp/>
    <uses name="media"/>
</automotiveapp/>

■サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実装します。onGetRoot()とonLoadChildren()の実装が必須です。

■MediaSessionクラスについて

音楽再生操作を行うため、MediaSessionクラスを使用しています。MediaSessionクラスは、一連のメディア再生処理を「セッション」とし、他のクラス(MediaControllerクラス、MediaController.TransportControlsクラスなど)と紐づいて再生操作を一括して管理することができます。 関連クラスを含め、具体的に下記のことができます。

  • 再生、一時停止や曲送りなどの再生操作
  • 再生情報の表示
  • 音量変更
  • 再生状態の変更やメディアボタンのイベントをコールバックで取得
なお、再生処理そのものはMediaPlayerクラスなどで行います。

■クラス変数とonCreate()の実装

MediaBrowserService継承サービス、AndroidAutoMediaServiceクラスを定義しました。再生操作にMediaSessionクラス、再生処理にMediaPlayerクラスを使用しています。他に再生データをリスト管理するmPlayingQueue、現在の再生インデックスを保持するmCurrentQueueIndexを定義しています。onCreate()ではMediaSessionクラスの生成およびコールバックの設定などを行っています。
public class AndroidAutoMediaService extends MediaBrowserService implements 
       OnPreparedListener, OnCompletionListener, OnErrorListener{
    private MediaSession mMediaSession;                 // MediaSessionクラス
    private MediaPlayer  mMediaPlayer;                  // MediaPlayerクラス
    private List<MediaSession.QueueItem> mPlayingQueue; // 再生キューリスト
    private int mCurrentQueueIndex;                     // 再生キューのインデックス
    private static final String MEDIA_ID_ROOT = "__ROOT__";

    @Override
    public void onCreate() {
        super.onCreate();

        // 再生リストのオブジェクトを作る
        mPlayingQueue = new ArrayList<MediaSession.QueueItem>();

        // MediaSessionを生成
        mMediaSession = new MediaSession(this, "MyMediaSession");
        setSessionToken(mMediaSession.getSessionToken());
        
        // コールバックを設定
        mMediaSession.setCallback(new MyMediaSessionCallback());

        // 再生キューの位置を初期化
        mCurrentQueueIndex = 0;
    }

■onGetRoot()とonLoadChildren()の実装

onGetRoot()とonLoadChildren()の実装をします。onGetRoot()について今回はROOTを固定で返していますが、引数のclientPackageNameおよびclientUidでクライアントを判断してnullを返すことで、特定のクライアント以外からの参照を許可しないようにすることもできます。onLoadChildren()はメディア項目に関する情報を返すメソッドで、引数のresultにデータを設定します。

MediaItemの種類としてFLAG_PLAYABLEとFLAG_BROWSABLEがあります。リスト選択によって再生を開始したい場合はFLAG_PLAYABLEを、リストの表示のみを行いたい場合はFLAG_BROWSABLEを設定してください。FLAG_PLAYABLE設定時にリスト選択をすると後述のMediaSessionクラスのコールバックメソッドonPlayFromMediaId()がコールされますので、そのタイミングで再生処理を行います。
    @Override
    public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
        Bundle rootHints) {
        return new BrowserRoot(MEDIA_ID_ROOT, null);
    }

    @Override
    public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
        List<MediaBrowser.MediaItem> mediaItems = new ArrayList<MediaBrowser.MediaItem>();

        // 再生データ情報の設定
        MediaDescription.Builder mdb1 = new MediaDescription.Builder();
        
        // 再生データ1
        final Bundle mediaBundle1 = new Bundle();
        mediaBundle1.putString("Path", "mnt/sdcard/M01.mp3"); // データパス
        mediaBundle1.putInt("Index", 0);                      // 曲のインデックス
        mdb1.setMediaId("MediaID01");                         // メディアID
        mdb1.setTitle("Title01");                             // タイトル
        mdb1.setSubtitle("SubTitle01");                       // サブタイトル
        mdb1.setExtras(mediaBundle1);

        // 再生データ2
        MediaDescription.Builder mdb2 = new MediaDescription.Builder();
        final Bundle mediaBundle2 = new Bundle();
        mediaBundle2.putString("Path", "mnt/sdcard/M02.mp3"); // データパス
        mediaBundle2.putInt("Index", 1);                      // 曲のインデックス
        mdb2.setMediaId("MediaID02");                         // メディアID
        mdb2.setTitle("Title02");                             // タイトル
        mdb2.setSubtitle("SubTitle02");                       // サブタイトル
        mdb2.setExtras(mediaBundle2);
        
        mediaItems.add(new MediaBrowser.MediaItem(mdb1.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));        
        mediaItems.add(new MediaBrowser.MediaItem(mdb2.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));

        // sendResult()をコールする前にdetach()のコールが必要
        result.detach();
        result.sendResult(mediaItems);

        // 再生キューをセッションに設定
        mPlayingQueue.add(new MediaSession.QueueItem(mdb1.build(), 0));
        mPlayingQueue.add(new MediaSession.QueueItem(mdb2.build(), 1));
        mMediaSession.setQueue(mPlayingQueue);
    }

■再生処理を実装

MediaPlayerクラスによる再生処理を行うメソッドを実装します。基本的なMediaPlayerの実装手順で問題ありません。再生データのパスはMediaSession.QueueItemで管理させています。
    private void playMusic() {
        // プレイヤー生成と準備(生成済みの場合はリセット)
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnErrorListener(this);
        } else {
            mMediaPlayer.reset();
        }

        // 現在のキュー位置を元に再生データのパスを取得する
        MediaSession.QueueItem queueItem = mPlayingQueue.get(mCurrentQueueIndex);
        String path = queueItem.getDescription().getExtras().getString("Path");

        // MediaPlayerのデータ設定と準備(非同期)
        try {
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        // 再生準備完了通知を受け、再生を行う
        if(mMediaPlayer != null) {
            mMediaPlayer.start();
        }
    }

■MediaSessionクラスのコールバック

MediaSessionのコールバックを下記のように実装します。リストを選択するとonPlayFromMediaId()、曲送りを選択するとonSkipToNext()、曲戻しを選択するとonSkipToPrevious()がコールされます。



    private final class MyMediaSessionCallback extends MediaSession.Callback {
        @Override
        public void onPlay() {
            playMusic();
        }

        // リスト選択時にコールされる
        @Override
        public void onPlayFromMediaId(String mediaId, Bundle extras) {
            // MediaIDを元に曲のインデックス番号を検索し、設定する。
            for(int i = 0; i < mPlayingQueue.size(); i++) {
                MediaSession.QueueItem queueItem = mPlayingQueue.get(i);
                MediaDescription md = queueItem.getDescription();
                if(mediaId.equals(md.getMediaId())) {
                    mCurrentQueueIndex = md.getExtras().getInt("Index");
                }
            }
            playMusic();
        }

        @Override
        public void onSkipToNext() {
            // 再生キューの位置を次へ
            mCurrentQueueIndex++;
            if (mCurrentQueueIndex >= mPlayingQueue.size()) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

        @Override
        public void onSkipToPrevious() {
            // 再生キューの位置を前へ
            mCurrentQueueIndex--;
            if (mCurrentQueueIndex < 0) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

■onDestroy()の実装

終了処理を実装します。
    @Override
    public void onDestroy() {
        super.onDestroy();
        // MediaSessionの終了処理
        mMediaSession.setCallback(null);
        mMediaSession.release();
        
        // MediaPlayerの終了処理
        if(mMediaPlayer != null) {
            mMediaPlayer.setOnPreparedListener(null);
            mMediaPlayer.setOnCompletionListener(null);
            mMediaPlayer.setOnErrorListener(null);
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
今回は割愛しましたが、MediaSessionクラスを正確に動作させるためには、setPlaybackState()にて再生状態や停止状態などを操作に合わせて設定する必要があります。

MediaSessioinおよびその関連クラスについては下記を参照してください。
http://developer.android.com/reference/android/media/session/package-summary.html

Android Auto用音楽再生アプリの作り方


Android Auto用の音楽再生アプリを作ってみました。まずは再生、曲送りと曲戻しのみ行う簡単なものから挑戦しました。再生操作にはMediaSessionクラスを使用します。

■通常の音楽再生アプリと違う点

Android Auto用の音楽再生アプリは車載デバイスのためのオーディオサービスを提供します。このサービスによって、車載デバイスはメディアデータの一覧を参照し、カーステレオなどから音楽を再生することができます。

■専用リソースファイルのメタデータ定義

AndoridManifestファイルにはapplicationタグ内に以下のように定義し、
<meta-data
    android:name="com.google.android.gms.car.application"
    android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイル\res\xml\automotive_app_desc.xmlを用意します。

■専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルautomotive_app_desc.xmlには以下のように記載します。音楽を再生するためのクラスを使用する場合は"media"を定義します。メッセージアプリを使用する場合は"notification"と定義します。
<automotiveapp/>
    <uses name="media"/>
</automotiveapp/>

■サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実装します。onGetRoot()とonLoadChildren()の実装が必須です。

■MediaSessionクラスについて

音楽再生操作を行うため、MediaSessionクラスを使用しています。MediaSessionクラスは、一連のメディア再生処理を「セッション」とし、他のクラス(MediaControllerクラス、MediaController.TransportControlsクラスなど)と紐づいて再生操作を一括して管理することができます。 関連クラスを含め、具体的に下記のことができます。

  • 再生、一時停止や曲送りなどの再生操作
  • 再生情報の表示
  • 音量変更
  • 再生状態の変更やメディアボタンのイベントをコールバックで取得
なお、再生処理そのものはMediaPlayerクラスなどで行います。

■クラス変数とonCreate()の実装

MediaBrowserService継承サービス、AndroidAutoMediaServiceクラスを定義しました。再生操作にMediaSessionクラス、再生処理にMediaPlayerクラスを使用しています。他に再生データをリスト管理するmPlayingQueue、現在の再生インデックスを保持するmCurrentQueueIndexを定義しています。onCreate()ではMediaSessionクラスの生成およびコールバックの設定などを行っています。
public class AndroidAutoMediaService extends MediaBrowserService implements 
       OnPreparedListener, OnCompletionListener, OnErrorListener{
    private MediaSession mMediaSession;                 // MediaSessionクラス
    private MediaPlayer  mMediaPlayer;                  // MediaPlayerクラス
    private List<MediaSession.QueueItem> mPlayingQueue; // 再生キューリスト
    private int mCurrentQueueIndex;                     // 再生キューのインデックス
    private static final String MEDIA_ID_ROOT = "__ROOT__";

    @Override
    public void onCreate() {
        super.onCreate();

        // 再生リストのオブジェクトを作る
        mPlayingQueue = new ArrayList<MediaSession.QueueItem>();

        // MediaSessionを生成
        mMediaSession = new MediaSession(this, "MyMediaSession");
        setSessionToken(mMediaSession.getSessionToken());
        
        // コールバックを設定
        mMediaSession.setCallback(new MyMediaSessionCallback());

        // 再生キューの位置を初期化
        mCurrentQueueIndex = 0;
    }

■onGetRoot()とonLoadChildren()の実装

onGetRoot()とonLoadChildren()の実装をします。onGetRoot()について今回はROOTを固定で返していますが、引数のclientPackageNameおよびclientUidでクライアントを判断してnullを返すことで、特定のクライアント以外からの参照を許可しないようにすることもできます。onLoadChildren()はメディア項目に関する情報を返すメソッドで、引数のresultにデータを設定します。

MediaItemの種類としてFLAG_PLAYABLEとFLAG_BROWSABLEがあります。リスト選択によって再生を開始したい場合はFLAG_PLAYABLEを、リストの表示のみを行いたい場合はFLAG_BROWSABLEを設定してください。FLAG_PLAYABLE設定時にリスト選択をすると後述のMediaSessionクラスのコールバックメソッドonPlayFromMediaId()がコールされますので、そのタイミングで再生処理を行います。
    @Override
    public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
        Bundle rootHints) {
        return new BrowserRoot(MEDIA_ID_ROOT, null);
    }

    @Override
    public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
        List<MediaBrowser.MediaItem> mediaItems = new ArrayList<MediaBrowser.MediaItem>();

        // 再生データ情報の設定
        MediaDescription.Builder mdb1 = new MediaDescription.Builder();
        
        // 再生データ1
        final Bundle mediaBundle1 = new Bundle();
        mediaBundle1.putString("Path", "mnt/sdcard/M01.mp3"); // データパス
        mediaBundle1.putInt("Index", 0);                      // 曲のインデックス
        mdb1.setMediaId("MediaID01");                         // メディアID
        mdb1.setTitle("Title01");                             // タイトル
        mdb1.setSubtitle("SubTitle01");                       // サブタイトル
        mdb1.setExtras(mediaBundle1);

        // 再生データ2
        MediaDescription.Builder mdb2 = new MediaDescription.Builder();
        final Bundle mediaBundle2 = new Bundle();
        mediaBundle2.putString("Path", "mnt/sdcard/M02.mp3"); // データパス
        mediaBundle2.putInt("Index", 1);                      // 曲のインデックス
        mdb2.setMediaId("MediaID02");                         // メディアID
        mdb2.setTitle("Title02");                             // タイトル
        mdb2.setSubtitle("SubTitle02");                       // サブタイトル
        mdb2.setExtras(mediaBundle2);
        
        mediaItems.add(new MediaBrowser.MediaItem(mdb1.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));        
        mediaItems.add(new MediaBrowser.MediaItem(mdb2.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));

        // sendResult()をコールする前にdetach()のコールが必要
        result.detach();
        result.sendResult(mediaItems);

        // 再生キューをセッションに設定
        mPlayingQueue.add(new MediaSession.QueueItem(mdb1.build(), 0));
        mPlayingQueue.add(new MediaSession.QueueItem(mdb2.build(), 1));
        mMediaSession.setQueue(mPlayingQueue);
    }

■再生処理を実装

MediaPlayerクラスによる再生処理を行うメソッドを実装します。基本的なMediaPlayerの実装手順で問題ありません。再生データのパスはMediaSession.QueueItemで管理させています。
    private void playMusic() {
        // プレイヤー生成と準備(生成済みの場合はリセット)
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnErrorListener(this);
        } else {
            mMediaPlayer.reset();
        }

        // 現在のキュー位置を元に再生データのパスを取得する
        MediaSession.QueueItem queueItem = mPlayingQueue.get(mCurrentQueueIndex);
        String path = queueItem.getDescription().getExtras().getString("Path");

        // MediaPlayerのデータ設定と準備(非同期)
        try {
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        // 再生準備完了通知を受け、再生を行う
        if(mMediaPlayer != null) {
            mMediaPlayer.start();
        }
    }

■MediaSessionクラスのコールバック

MediaSessionのコールバックを下記のように実装します。リストを選択するとonPlayFromMediaId()、曲送りを選択するとonSkipToNext()、曲戻しを選択するとonSkipToPrevious()がコールされます。



    private final class MyMediaSessionCallback extends MediaSession.Callback {
        @Override
        public void onPlay() {
            playMusic();
        }

        // リスト選択時にコールされる
        @Override
        public void onPlayFromMediaId(String mediaId, Bundle extras) {
            // MediaIDを元に曲のインデックス番号を検索し、設定する。
            for(int i = 0; i < mPlayingQueue.size(); i++) {
                MediaSession.QueueItem queueItem = mPlayingQueue.get(i);
                MediaDescription md = queueItem.getDescription();
                if(mediaId.equals(md.getMediaId())) {
                    mCurrentQueueIndex = md.getExtras().getInt("Index");
                }
            }
            playMusic();
        }

        @Override
        public void onSkipToNext() {
            // 再生キューの位置を次へ
            mCurrentQueueIndex++;
            if (mCurrentQueueIndex >= mPlayingQueue.size()) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

        @Override
        public void onSkipToPrevious() {
            // 再生キューの位置を前へ
            mCurrentQueueIndex--;
            if (mCurrentQueueIndex < 0) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

■onDestroy()の実装

終了処理を実装します。
    @Override
    public void onDestroy() {
        super.onDestroy();
        // MediaSessionの終了処理
        mMediaSession.setCallback(null);
        mMediaSession.release();
        
        // MediaPlayerの終了処理
        if(mMediaPlayer != null) {
            mMediaPlayer.setOnPreparedListener(null);
            mMediaPlayer.setOnCompletionListener(null);
            mMediaPlayer.setOnErrorListener(null);
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
今回は割愛しましたが、MediaSessionクラスを正確に動作させるためには、setPlaybackState()にて再生状態や停止状態などを操作に合わせて設定する必要があります。

MediaSessioinおよびその関連クラスについては下記を参照してください。
http://developer.android.com/reference/android/media/session/package-summary.html

2014年11月27日木曜日


公式サイトではAndroid Autoに対応したサンプルアプリが公開されていますが、若干凝った作りの為、分かりづらい部分があります。そこでサンプルアプリを元に、簡単なメッセージアプリを作ってみました。

※公式サイトのサンプルアプリは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MessagingService

Android Auto用メッセージアプリでは、以下のことができます。
  • 車載機器へのNotification送信
    Android Auto用のAPIを使用して、Notificationを車載機器側(現在はシミュレーションアプリ上)に通知できます。車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。
  • 車載機器からの既読通知を受信
    車載機器側でNotificationが選択される(=音声読み上げ)と、既読になったことをIntent通知で受け取ることができます。
  • 車載機器からの返信を受信
    車載機器側でNotificationに対する返信操作が行われると、その内容をIntent通知で受け取ることができます。

それでは実際のアプリの作り方を見ていきましょう。

■AndroidManifestファイルの記載

・BroadcastReceiverの登録

既読通知と返信通知のIntent通知を受けるために、BroadcastReceiverを登録します。
    <receiver android:name=".MyMessageReadReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_READ" />
        </intent-filter>
    </receiver>
    <receiver android:name=".MyMessageReplyReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY" />
        </intent-filter>
    </receiver>

・専用リソースファイルのメタデータ定義

AndoridManifestファイルには以下のように定義し、
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイルを用意します。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

・専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。
    <automotiveapp>
        <uses name="notification"/>
    </automotiveapp>

■既読通知用のIntent設定

車載機器からNotificationの既読通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
    ※今回は固定値TEST_IDを使用しています。
    int TEST_ID = 1;
    String REPLY_ID = "conversation_id";
    String READ_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_READ";

    Intent readIntent = new Intent()
                        .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                        .setAction(READ_ACTION)
                        .putExtra(REPLY_ID, TEST_ID);

    PendingIntent readPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            readIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■返信通知用のIntent設定

車載機器からNotificationの返信通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
  • 返信内容のStringを受け取るためのキー(EXTRA_VOICE_REPLY)を登録する。
    String REPLY_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY";
    String EXTRA_VOICE_REPLY = "extra_voice_reply";

    Intent replyIntent = new Intent()
                    .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                    .setAction(REPLY_ACTION)
                    .putExtra(REPLY_ID, TEST_ID);

    RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
                                    .setLabel(getApplicationContext().getString(R.string.app_name))
                                    .build();

    PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            replyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■メッセージオブジェクトの生成

UnreadConversation.Builderオブジェクトを生成します。
  • Notification送信者の設定(TEST_NAME)
  • 既読通知用/返信通知用Intentの登録
  • Notification本文の登録(TEST_MESSAGE)
    String TEST_NAME = "BRIL TARO";
    String TEST_MESSAGE = "Hello Android Auto!";

    UnreadConversation.Builder unreadConvBuilder =
            new UnreadConversation.Builder(TEST_NAME)
                .setReadPendingIntent(readPendingIntent)
                .setReplyAction(replyPendingIntent, remoteInput);

    unreadConvBuilder.addMessage(TEST_MESSAGE);

■Notificationオブジェクトの生成と送信

NotificationCompat.Builderクラスを使用して、Notificationオブジェクトを生成、送信します。
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(getApplicationContext())
                .setSmallIcon(R.drawable.ic_launcher)
                .extend(new CarExtender()
                            .setUnreadConversation(unreadConvBuilder.build()));

    NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(getApplicationContext());
    mNotificationManager.notify(TEST_ID, notificationBuilder.build());

■既読通知用のBroadcastReceiver

既読通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDを取得できます。
public class MyMessageReadReceiver  extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);
    }
}

■返信通知用のBroadcastReceiver

返信通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDと、車載機器側が設定した返信内容を取得できます。
public class MyMessageReplyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);

        CharSequence reply;
        Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
        if (remoteInput != null) {
            reply = remoteInput.getCharSequence(MainActivity.EXTRA_VOICE_REPLY);
        }
    }
}

■Notificationの確認方法

上記処理を全て実装したアプリを作成して、以下の手順を行ってください。
  1. メッセージアプリ用のシミュレーションアプリ(messaging-simulator.apk )をインストール。
    ※詳細は前回記事「Android AutoのAPIが公開されました」をご参照ください。
  2. テストアプリを起動し、Notificationを送信
    ※その後、ステータスバーに表示されるNotificationは開かないでください。
  3. シミュレーションアプリを起動
成功すると、以下の画面が表示されます。
メッセージ部分をタップすると、
「New message from BRIL TARO,Hello Android Auto」
と音声で読み上げてくれます。




読み終わった後に既読通知のIntentがBroadcast送信され、以下の画面に遷移します。
ここで返信ボタンを押すと、返信通知用のIntentがBroadcast送信されます。
現在のシミュレーションアプリ上では返信内容を作成できず、アプリ側には"This is a reply"の固定文言のみが返ってきますが、将来的には音声入力などにも対応すると思われます。



実際に作ってみると、意外と簡単にNotificationを表示することができました。
現状ではまだ未完成の部分もありますが、これからどうUpdateされていくのか楽しみですね。

Android Auto用メッセージアプリの作り方


公式サイトではAndroid Autoに対応したサンプルアプリが公開されていますが、若干凝った作りの為、分かりづらい部分があります。そこでサンプルアプリを元に、簡単なメッセージアプリを作ってみました。

※公式サイトのサンプルアプリは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MessagingService

Android Auto用メッセージアプリでは、以下のことができます。
  • 車載機器へのNotification送信
    Android Auto用のAPIを使用して、Notificationを車載機器側(現在はシミュレーションアプリ上)に通知できます。車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。
  • 車載機器からの既読通知を受信
    車載機器側でNotificationが選択される(=音声読み上げ)と、既読になったことをIntent通知で受け取ることができます。
  • 車載機器からの返信を受信
    車載機器側でNotificationに対する返信操作が行われると、その内容をIntent通知で受け取ることができます。

それでは実際のアプリの作り方を見ていきましょう。

■AndroidManifestファイルの記載

・BroadcastReceiverの登録

既読通知と返信通知のIntent通知を受けるために、BroadcastReceiverを登録します。
    <receiver android:name=".MyMessageReadReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_READ" />
        </intent-filter>
    </receiver>
    <receiver android:name=".MyMessageReplyReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY" />
        </intent-filter>
    </receiver>

・専用リソースファイルのメタデータ定義

AndoridManifestファイルには以下のように定義し、
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイルを用意します。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

・専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。
    <automotiveapp>
        <uses name="notification"/>
    </automotiveapp>

■既読通知用のIntent設定

車載機器からNotificationの既読通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
    ※今回は固定値TEST_IDを使用しています。
    int TEST_ID = 1;
    String REPLY_ID = "conversation_id";
    String READ_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_READ";

    Intent readIntent = new Intent()
                        .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                        .setAction(READ_ACTION)
                        .putExtra(REPLY_ID, TEST_ID);

    PendingIntent readPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            readIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■返信通知用のIntent設定

車載機器からNotificationの返信通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
  • 返信内容のStringを受け取るためのキー(EXTRA_VOICE_REPLY)を登録する。
    String REPLY_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY";
    String EXTRA_VOICE_REPLY = "extra_voice_reply";

    Intent replyIntent = new Intent()
                    .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                    .setAction(REPLY_ACTION)
                    .putExtra(REPLY_ID, TEST_ID);

    RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
                                    .setLabel(getApplicationContext().getString(R.string.app_name))
                                    .build();

    PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            replyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■メッセージオブジェクトの生成

UnreadConversation.Builderオブジェクトを生成します。
  • Notification送信者の設定(TEST_NAME)
  • 既読通知用/返信通知用Intentの登録
  • Notification本文の登録(TEST_MESSAGE)
    String TEST_NAME = "BRIL TARO";
    String TEST_MESSAGE = "Hello Android Auto!";

    UnreadConversation.Builder unreadConvBuilder =
            new UnreadConversation.Builder(TEST_NAME)
                .setReadPendingIntent(readPendingIntent)
                .setReplyAction(replyPendingIntent, remoteInput);

    unreadConvBuilder.addMessage(TEST_MESSAGE);

■Notificationオブジェクトの生成と送信

NotificationCompat.Builderクラスを使用して、Notificationオブジェクトを生成、送信します。
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(getApplicationContext())
                .setSmallIcon(R.drawable.ic_launcher)
                .extend(new CarExtender()
                            .setUnreadConversation(unreadConvBuilder.build()));

    NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(getApplicationContext());
    mNotificationManager.notify(TEST_ID, notificationBuilder.build());

■既読通知用のBroadcastReceiver

既読通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDを取得できます。
public class MyMessageReadReceiver  extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);
    }
}

■返信通知用のBroadcastReceiver

返信通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDと、車載機器側が設定した返信内容を取得できます。
public class MyMessageReplyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);

        CharSequence reply;
        Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
        if (remoteInput != null) {
            reply = remoteInput.getCharSequence(MainActivity.EXTRA_VOICE_REPLY);
        }
    }
}

■Notificationの確認方法

上記処理を全て実装したアプリを作成して、以下の手順を行ってください。
  1. メッセージアプリ用のシミュレーションアプリ(messaging-simulator.apk )をインストール。
    ※詳細は前回記事「Android AutoのAPIが公開されました」をご参照ください。
  2. テストアプリを起動し、Notificationを送信
    ※その後、ステータスバーに表示されるNotificationは開かないでください。
  3. シミュレーションアプリを起動
成功すると、以下の画面が表示されます。
メッセージ部分をタップすると、
「New message from BRIL TARO,Hello Android Auto」
と音声で読み上げてくれます。




読み終わった後に既読通知のIntentがBroadcast送信され、以下の画面に遷移します。
ここで返信ボタンを押すと、返信通知用のIntentがBroadcast送信されます。
現在のシミュレーションアプリ上では返信内容を作成できず、アプリ側には"This is a reply"の固定文言のみが返ってきますが、将来的には音声入力などにも対応すると思われます。



実際に作ってみると、意外と簡単にNotificationを表示することができました。
現状ではまだ未完成の部分もありますが、これからどうUpdateされていくのか楽しみですね。

2014年11月19日水曜日

※Android Auto公式サイトより引用 http://www.android.com/auto/

本日、ついにAndroid AutoのAPIが公開されました。
Android Autoとは、車のカーナビのような車載デバイスとAndroid端末を連動するシステムです。Android Autoアプリを作るための環境構築方法についてまとめました。

Android Autoに対応したアプリをAndroid端末に入れて、車載デバイスと接続することで、車載デバイス側でアプリの画面を表示したり、操作することができます。

APIは以下の公式サイトで説明されています。
http://developer.android.com/training/auto/start/index.html

現状では、以下の2種類のアプリに対応しています。
オーディオ系アプリ・・・車の中でオーディオコンテンツを再生することができます。
メッセージ系アプリ・・・メールを受信するとメッセージを音声出力し、音声入力から返信メールを送信できます。

今回は、AndroidAuto向けのオーディオ系アプリを作成するまでの環境構築について、以下の流れで紹介します。

・AndroidManifestファイルの記載
・専用リソースファイルの記載
・サービスの実装
・シミュレーションアプリのインストール
・アプリの実行

AndroidManifestファイルの記載

ポイントは3つあります。

targetSdkVersion

AndroidAutoに対応するアプリは、targetSdkVersionが21以上でなければいけません。

MediaBrowserService継承サービス定義 

以下のように定義します。
    <service android:exported="true" android:name=".AndroidAutoMediaService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService">
            </action>
        </intent-filter>
    </service>

専用リソースファイルのメタデータ定義

以下のように定義します。
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />

上記のように、『android:resource="@xml/automotive_app_desc"』とした場合は、以下の専用リソースファイルを用意する必要があります。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

 専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。"uses name="には、オーディオ系アプリの場合は"media"、メッセージ系アプリの場合は"notification"を設定します。
今回の場合は前者です。
    <automotiveapp>
        <uses name="media"/>
    </automotiveapp>

サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実際に実装します。
以下の2つのメソッドが実装必須ですが、今回は空のメソッドにしておきます。
public class AndroidAutoMediaService extends MediaBrowserService{

@Override
public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
    Bundle rootHints) {
    return null;
}

@Override
public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
}

シミュレーションアプリのインストール

AndroidAuto向けアプリの動作をAndroid端末上で確認できる、シミュレーションアプリが提供されています。
アプリはSDK Managerの「Android Auto API Simulators」からダウンロードできます。


ダウンロードが完了すると、以下のapkファイル2個が格納されます。
オーディオ系アプリ向けとメッセージ系アプリ向けに、2種類のシミュレーションアプリが用意されています。
(Android SDKフォルダ以下)\extras\google\simulators
media-browser-simulator.apk・・・オーディオ系アプリ
messaging-simulator.apk ・・・メッセージ系アプリ

今回はオーディオ系アプリを取り扱うので、media-browser-simulator.apkの方をインストールします。

それぞれのapkを起動すると、以下の画面が表示されます。

オーディオ系のシミュレーションアプリ


メッセージ系のシミュレーションアプリ



※11/25修正
なお、これらのシミュレーションアプリのサンプルコードは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MediaBrowserService
http://github.com/googlesamples/android-MessagingService

アプリの実行

作成したアプリをあらかじめインストールしておき、
シミュレーションアプリの「Media Sim」を起動します。
メニューボタンを押すと、作成したアプリの名前が表示されれば成功です。



今回作成したアプリでは必要最低限の実装しか行っていないため、これ以上は動作できませんが、ちゃんと実装したアプリであれば、ここから動作が確認できるはずです。

次回からは、実際に動作するAndroid Autoアプリの開発方法について、説明していきます。

Android AutoのAPIが公開されました

※Android Auto公式サイトより引用 http://www.android.com/auto/

本日、ついにAndroid AutoのAPIが公開されました。
Android Autoとは、車のカーナビのような車載デバイスとAndroid端末を連動するシステムです。Android Autoアプリを作るための環境構築方法についてまとめました。

Android Autoに対応したアプリをAndroid端末に入れて、車載デバイスと接続することで、車載デバイス側でアプリの画面を表示したり、操作することができます。

APIは以下の公式サイトで説明されています。
http://developer.android.com/training/auto/start/index.html

現状では、以下の2種類のアプリに対応しています。
オーディオ系アプリ・・・車の中でオーディオコンテンツを再生することができます。
メッセージ系アプリ・・・メールを受信するとメッセージを音声出力し、音声入力から返信メールを送信できます。

今回は、AndroidAuto向けのオーディオ系アプリを作成するまでの環境構築について、以下の流れで紹介します。

・AndroidManifestファイルの記載
・専用リソースファイルの記載
・サービスの実装
・シミュレーションアプリのインストール
・アプリの実行

AndroidManifestファイルの記載

ポイントは3つあります。

targetSdkVersion

AndroidAutoに対応するアプリは、targetSdkVersionが21以上でなければいけません。

MediaBrowserService継承サービス定義 

以下のように定義します。
    <service android:exported="true" android:name=".AndroidAutoMediaService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService">
            </action>
        </intent-filter>
    </service>

専用リソースファイルのメタデータ定義

以下のように定義します。
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />

上記のように、『android:resource="@xml/automotive_app_desc"』とした場合は、以下の専用リソースファイルを用意する必要があります。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

 専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。"uses name="には、オーディオ系アプリの場合は"media"、メッセージ系アプリの場合は"notification"を設定します。
今回の場合は前者です。
    <automotiveapp>
        <uses name="media"/>
    </automotiveapp>

サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実際に実装します。
以下の2つのメソッドが実装必須ですが、今回は空のメソッドにしておきます。
public class AndroidAutoMediaService extends MediaBrowserService{

@Override
public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
    Bundle rootHints) {
    return null;
}

@Override
public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
}

シミュレーションアプリのインストール

AndroidAuto向けアプリの動作をAndroid端末上で確認できる、シミュレーションアプリが提供されています。
アプリはSDK Managerの「Android Auto API Simulators」からダウンロードできます。


ダウンロードが完了すると、以下のapkファイル2個が格納されます。
オーディオ系アプリ向けとメッセージ系アプリ向けに、2種類のシミュレーションアプリが用意されています。
(Android SDKフォルダ以下)\extras\google\simulators
media-browser-simulator.apk・・・オーディオ系アプリ
messaging-simulator.apk ・・・メッセージ系アプリ

今回はオーディオ系アプリを取り扱うので、media-browser-simulator.apkの方をインストールします。

それぞれのapkを起動すると、以下の画面が表示されます。

オーディオ系のシミュレーションアプリ


メッセージ系のシミュレーションアプリ



※11/25修正
なお、これらのシミュレーションアプリのサンプルコードは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MediaBrowserService
http://github.com/googlesamples/android-MessagingService

アプリの実行

作成したアプリをあらかじめインストールしておき、
シミュレーションアプリの「Media Sim」を起動します。
メニューボタンを押すと、作成したアプリの名前が表示されれば成功です。



今回作成したアプリでは必要最低限の実装しか行っていないため、これ以上は動作できませんが、ちゃんと実装したアプリであれば、ここから動作が確認できるはずです。

次回からは、実際に動作するAndroid Autoアプリの開発方法について、説明していきます。
Related Posts Plugin for WordPress, Blogger...