スマートフォン側は、Android Wear側からメッセージを受信したら、即電話をかける仕様とするので、画面は必要なく、サービスで実装することにしました。
Android Studioのプロジェクトは、プロジェクト=アプリではなく、プロジェクト内のモジュール=アプリという構成になっていて、一つのプロジェクトに関連するアプリを複数追加して管理できます。Android Wear用のモジュールはデフォルトの名前である「app」、スマートフォン用のモジュールは「phone」としました。
まずはAndroidManifest.xmlから見ていきます。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.ogata.calltaxiservice"> <!-- 【1】 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <application android:allowBackup="true" android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <service android:name=".ListenerService" > <intent-filter> <!-- 【2】 --> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service> </application> </manifest>
今回は電話をかけるために【1】のandroid.permission.CALL_PHONEパーミッションが必要です。このサンプルは本当にダイヤルするので、試す場合は注意してください。
Android Wearのイベントを取得するために【2】のアクションを持つIntentFilterをサービスに定義しなければなりません。
続いてビルド用スクリプトであるbuild.gradleです。
apply plugin: 'com.android.application' android { compileSdkVersion 18 buildToolsVersion "21.1.1" defaultConfig { applicationId "com.example.ogata.calltaxi" //【1】 minSdkVersion 18 //【2】 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.google.android.gms:play-services-wearable:6.5.87' //【3】 }
【1】のapplicationIdは、Android Wear用アプリと同じにしなければなりません。この値はAndroid Studioでモジュールを作成した際に、デフォルトでパッケージ名が入るのですが、Android Wear用とスマートフォン用でパッケージを分けた場合、異なるIDがデフォルトで付与され、メッセージが受信できない、という状態に陥ります。
【2】のminSdkVersionを18にしているのは、Android WearはAndroid 4.3以上でなければ利用できないため、Android 4.3を表すAPI Level 18を設定しています。
【3】の「play-services-wearable:6.5.87」は、メッセージ受信に必要なWearableListenerServiceなどが含まれるライブラリです。
メッセージ受信はMessageApi.MessageListenerのonMessageReceivedを実装します。AndroidManifest.xmlに記載した「com.google.android.gms.wearable.BIND_LISTENER」というアクションは、メッセージ受信だけでなく、データ同期や接続状態イベントも拾えるので、それら全てのリスナーを実装したWearableListenerServiceを継承してサービスを作成するのが慣習となっています。
以下は、本サンプルのサービスの実装です。非常に短いです。
package com.example.ogata.calltaxiservice; import android.content.Intent; import android.net.Uri; import android.util.Log; import com.google.android.gms.wearable.MessageEvent; import com.google.android.gms.wearable.WearableListenerService; public class ListenerService extends WearableListenerService { private static final String TAG = "TAXI"; @Override public void onMessageReceived(MessageEvent messageEvent) { Log.d(TAG, "onMessageReceived: " + messageEvent.getPath()); if ("/calltaxi".equals(messageEvent.getPath())) { //【1】 String number = new String(messageEvent.getData()); //【2】 Log.d(TAG, "NUMBER: " + number); Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number)); //【3】 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //【4】 startActivity(intent); //【5】 } } }
【1】で、送信側の指定したパスを検証します。今回のサンプルは判定する必要はないのですが、解説のために実装してあります。
送信側が送ったデータは【2】のようにバイト配列を取得できるので、そのまま文字列を作成しています。電話をかけるには【3】のようにアクションとしてACTION_CALL、データとして"tel:"というスキームで始まる電話番号のUrlを含むIntentを作成します。サービスからActivityを起動する場合【4】のFLAG_ACTIVITY_NEW_TASKがないとAndroidRuntimeExceptionが発生します。
【5】のstartActivityでダイヤルします。
Copyright © ITmedia, Inc. All Rights Reserved.