2014年11月27日木曜日

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されていくのか楽しみですね。
140 180 Android , Android Auto

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...