腕時計から電話をかけるAndroid Wearアプリの作り方:Androidで動く携帯Javaアプリ作成入門(57)(2/3 ページ)
ペアリングしているスマートフォン側で電話をかけるアプリを通じて、Android Wearとスマートフォン間のメッセージ送信の方法について解説します。
メッセージ受信側スマートフォンサービス
スマートフォン側は、Android Wear側からメッセージを受信したら、即電話をかける仕様とするので、画面は必要なく、サービスで実装することにしました。
Android Studioのプロジェクトは、プロジェクト=アプリではなく、プロジェクト内のモジュール=アプリという構成になっていて、一つのプロジェクトに関連するアプリを複数追加して管理できます。Android Wear用のモジュールはデフォルトの名前である「app」、スマートフォン用のモジュールは「phone」としました。
受信側のAndroidManifest.xml
まずは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
続いてビルド用スクリプトである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.
関連記事
- Android端末で見かける「Google Play開発者サービス」とは何か?
Androidスマートフォン/タブレットでしばしば目にする「Google Play開発者サービス」。起動した覚えもないのに、なぜかシステムに常駐している。その正体は? 一体何の役に立っているのか? どうすれば最新版に更新できる? - Android L、Android Wear、Android TV、Android Autoの開発者向け現状まとめ
米グーグルが「Google I/O 2014」で発表した次期Android「Android L」「Android TV」「Android Auto」の開発者プレビュー、そして「Android Wear」の正式版。これらに対応したアプリを開発するには、どこを見ればいいのか。概要とともに簡単にまとめてみた。 - グーグル、「Google Play Services 5.0」公開
Google Play Services 5.0がリリースに。ウェアラブル端末連携のためのAPIなどが盛り込まれている。 - Android WearやIoTで注目のAndroidセンサー機能8選
ついに正式版が発表されたAndroid WearやIoTでの活用で注目したい、Androidがサポートするステップカウンター/検出器、回転ベクター/接近/温度/湿度/気圧/照度センサーなどについて解説。