(コード有り)30分で作る 初めてのAndroidWearアプリ開発

2014/4/25 12696hit

AndroidWearの発売が迫っていることを記念してAndroidWearアプリを開発してみます。
第一回はNotificationをWearable preview supportを使って作ります。
開発にはAndroidStudioを使ってみます。

注意:このAndroidWear開発方法はPreviewです。正式版では異なる実装となる可能性があります。

AndroidStudioの開発環境構築

Android Studioが構築されていない人は、ゼロから作るAndroid Studio環境を参考にAndroid Studioの環境を構築して下さい。

AndroidWearの開発に必要なもの

端末
Android 4.4以上が動作する必要があります。実機がない場合Genymotionでも可能です。

サインアップ
サインアップサイトからサインアップをして下さい。
サインアップを行う時はテストで動かす端末のGoogleアカウントでサインアップして下さい。

それぞれ入力項目は以下のとおりです
What is your Gmail or Google account email address? *
テスト用端末で使用しているGoogleアカウントを設定します。このアカウントのユーザーだけがGooglePlayからテスト用のAndroid Wear Preview betaアプリをインストールできるようになります。

What is your name? (Optional)
名前を入力します。任意入力です。

What is your company name? (Optional)
会社名を入力します。任意入力です。

If you've published any apps to the Google Play Store, please provide package name(s). (Optional)
e.g. com.google.test
アプリを公開している人はそのパッケージネーム(com.google.testのように入力)を入力します。任意入力です。

I have read and agree to the Terms and Conditions. *
利用規約を読み承認できる場合はYes, I agreeにチェックを入れます。

AndroidWearPreview.zip
しばらくするとメールが送られてきます。
メール内にあるDownload the Preview Support library and samples.からAndroidWearPreview.zipがダウンロードできます。

Android Wear Preview betaアプリ

同じくメールに記載されたOpt-in to become a testerからGooglePlay経由でダウンロード可能になります。このアプリはサインアップしたアカウントのみで有効です。
インストール後起動して、通知を受け取る許可を設定して下さい。


開発環境の確認

Android SDK Managerを起動して、Tools内のAndroid SDK Toolsが22.6以上であることAndroid4.4.2内のAndroid Wear ARM EABI v7a System Imageがインストールされていることを確認して下さい。


エミュレータの作成


AVD Nameには任意の名前、DeviceはAndroid Wear Round(丸型)またはAndroid Wear Square(四角)を選んで下さい。
TargetはAndroid 4.4.2 - API Level 19以上
SKIN はAndroidWearRoundまたはAndroidWearSquare
SnapShotにチェックを入れてOKを押して下さい。

エミュレータの実行

早速エミュレータを実行してみましょう。
現在のところAndroidWearのエミュレータARM版しか用意されておらず、その関係で起動時間は若干時間がかかります。
起動を完了するとデバイスが接続されていないことを示すアイコンが表示された状態となります。


エミュレータの接続

それではスマートフォンとAndroidWearエミュレータを接続してみましょう。
Android Wear Preview betaアプリがインストールされたAndroid端末をUSBで開発PCと接続します。
ターミナル(Windowsの場合はコマンドライン)を起動し、SDKManagerのあるフォルダまでパスを移動させたら以下のコマンドを実行して下さい。

adb -d forward tcp:5601 tcp:5601

エミュレータのアイコンが変わってgが表示されたら接続完了です。
この状態でスマートフォンに通知が来るとAndroidWearエミュレータ側にも通知が行くことが確認できると思います。


プロジェクトの作成

それでは実際にAndroidWearに通知を送るアプリを作ってみましょう。
AndroidStudioを起動し、New Projectを選び新しいプロジェクトを作成します。
Application name、Module name、 Package name、Project locationはお好みでどうぞ。
AndroidWearアプリ自体は古いVersionでのAndroidでも動作しますが、今回Minimum required SDKにはAndroid 4.0を選択します。
Target SDKとComplie withには最新のAndroid(現時点ではAPI 19 Android 4.4(KitKat))を選択します。
Create activityのみにチェックが入っていることを確認してNextを選択します。


Activityの作成

BlankActivityにチェックを入れて次へ

Activity NameとLayout NameはデフォルトのままFinish

wearable-preview-support.jarの配置

wearable-preview-support.zipを解凍しwearable-preview-support.jarを取り出す。
Projectの直下にlibsフォルダを作りwearable-preview-support.jarをセットする。。


build.gradleの設定

モジュール内のbuild.gradleを開き、dependenciesにwearable-preview-support.jarとAndroid support-v4の依存ルールを追加する。


dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:support-v4:19.0.+"
compile files('../libs/wearable-preview-support.jar')
}


Sync Gradleの実行

build.gradleを反映させるためにメニューよりTools-Android-Sync Project with Gradle Filesを選びGradleと同期する。


レイアウトの作成

src/main/res/layout/activity_main.xmlを開き、画面の中央にボタンを追加する。


通知アイコンの作成

resを右クリックし、Image Assetを選択する。
Asset TypeにNotification Iconsを選択し、好きなアイコンを作成する。
Resource nameはic_stat_nameとする。


MainActivityの修正

src\main\java\\MainActivityを開く。

Importの追加

importに以下の3つを追記する。
通常、AndroidStudioではCommandキー+Enterキーで自動インポートが行うことができるが、NotificationはSupportLibraryのAPIを確実に使うことように明示しておく。

import android.preview.support.wearable.notifications.*;
import android.preview.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat;


OnClickLister Interfaceの実装

implementsにView.OnCLickListenerを追記しMainActivityがOnClickListenerとなるように設定する。
※OnClickListenerの実装方法については匿名クラスを使う方法もあります。お好みでどうぞ。

public class MainActivity extends Activity implements View.OnClickListener {


Buttonの取得

Class直下にButtonを格納するためのインスタンス変数を定義する

private Button mButton; // 画面上のボタン

onCreate内にボタンインスタンスの取得とOnClickListenerの登録を追加する。

mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(this);


onClickの実装

onClickメソッドを実装していく。
まず、onClick(View v)メソッドを作る。
ボタンが押された時のみで動作するようにvがmButtonの時のみ処理を実行する。

if(v.equals(mButton)) {
}


if文内の処理を書いていく。
通知を特定するためのnotificationIdを設定する。それぞれの値を設定すると複数のnotificationをまとめたりするときに使用できるが今回はとりあえず1を設定する。

int notificationId = 1;

Notificationに表示するタイトルと文字を設定する。

String eventTitle = "Hello Wear";
String eventText = "This is a first application.";

AndroidWear上のOpenを押された時に実行する処理をPendingIntentとして作成する。
IntentにはExtra情報が付与される。

new Intent()及びgetActivity()にはActivityのInstanceを引数として渡す。
OnClickListenerを匿名クラスとして実装している場合はMainActivity.thisとする。

String extraName = "extraName";
String extraString = "Tap AndroidWear";
Intent viewIntent = new Intent(this, MainActivity.class);
viewIntent.putExtra(extraName, extraString);
PendingIntent viewPendingIntent = PendingIntent.getActivity(this, 0, viewIntent, 0);

NotificationCompat.Builderを使ってNotificationを作る
new NotificationCompat.Builder()及びNotificationManagerCompat.from()にはActivityのInstanceを引数として渡す。
OnClickListenerを匿名クラスとして実装している場合はMainActivity.thisとする。

NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_event)
.setContentTitle(eventTitle)
.setContentText(eventText)
.setContentIntent(viewPendingIntent);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, notificationBuilder.build());


アプリを実行する

完成したアプリを実行する。
ボタンを押すと通知が発生し、同時にWearにも表示される事を確認する。






スマートフォン側のアプリを終了し、WearのNotificationを上方向にスワイプするとフリック可能であるインジゲージが表示されます。

左方向にフリックするとOpenボタンが表示され

OpenをタップすることでPendingされていたIntentが発行されスマートフォン側のアプリが起動します。

ソース一覧

build.gradle


apply plugin: 'android'

android {
compileSdkVersion 19
buildToolsVersion "19.0.3"

defaultConfig {
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:support-v4:19.0.+"
compile files('../libs/wearable-preview-support.jar')

}


activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="org.firespeed.driveside.samples.helloandroidwear.MainActivity">

<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button" android:layout_centerVertical="true" android:layout_centerHorizontal="true"/>

</RelativeLayout>

MainActivity


package org.firespeed.driveside.samples.helloandroidwear;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.preview.support.wearable.notifications.*;
import android.preview.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity implements View.OnClickListener{
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(this);
}

@Override
protected void onNewIntent(Intent i){
if(i!=null){
i.getStringExtra("hoge");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if(v.equals(mButton)) {
// NotificationをStackするときなどに使用するID
int notificationId = 1;
// Notificationに表示するタイトルと文字
String eventTitle = "Hello Wear";
String eventText = "This is a first application.";
// タップされた時にActivityに渡すIntentをPendingIntentとして作成
String extraName = "extraName";
String extraString = "Tap AndroidWear";
Intent viewIntent = new Intent(this, MainActivity.class);
viewIntent.putExtra(extraName, extraString);
PendingIntent viewPendingIntent = PendingIntent.getActivity(this, 0, viewIntent, 0);
// NotificationCompat.Builderを使ってNotificationを作る
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_name)
.setContentTitle(eventTitle)
.setContentText(eventText)
.setContentIntent(viewPendingIntent);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, notificationBuilder.build());
}
}
}

プロジェクト全体をgithubで見る

前:GoogleI/O 2014 で何が発表されるか大胆予想 次:Nexus5のレンズぼかし機能が凄過ぎる

関連キーワード

[Android][Java][モバイル][IT][ウェアラブル]

コメントを投稿する

名前URI
コメント