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の確認方法
上記処理を全て実装したアプリを作成して、以下の手順を行ってください。- メッセージアプリ用のシミュレーションアプリ(messaging-simulator.apk )をインストール。
※詳細は前回記事「Android AutoのAPIが公開されました」をご参照ください。 - テストアプリを起動し、Notificationを送信
※その後、ステータスバーに表示されるNotificationは開かないでください。 - シミュレーションアプリを起動
メッセージ部分をタップすると、
「New message from BRIL TARO,Hello Android Auto」
と音声で読み上げてくれます。
読み終わった後に既読通知のIntentがBroadcast送信され、以下の画面に遷移します。
ここで返信ボタンを押すと、返信通知用のIntentがBroadcast送信されます。
現在のシミュレーションアプリ上では返信内容を作成できず、アプリ側には"This is a reply"の固定文言のみが返ってきますが、将来的には音声入力などにも対応すると思われます。
実際に作ってみると、意外と簡単にNotificationを表示することができました。
現状ではまだ未完成の部分もありますが、これからどうUpdateされていくのか楽しみですね。
記載されている会社名、および商品名等は、各社の商標または登録商標です。



0 コメント:
コメントを投稿