Android Wearの通知にページを追加する

さて、今日は通知にページを追加する方法です。
昨日までの記事は以下になります。

それではこちらを翻訳しながら理解を深めていきましょう。
Adding Pages to a Notification

通知にページを追加する


携帯デバイス上でアプリケーションを開くことなく、より多くの情報を提供したい場合には、Android Wearの通知に1つ以上のページを追加することが出来ます。
追加ページはメインの通知カードの右側に表示されます。複数ページをデザインするための情報は Design Principles of Android Wearを参照して下さい。
複数ページを持つ通知を作成する場合、携帯デバイスまたはタブレット上に表示するメインとなる(最初のページとなる)通知を作成することから始めます。次に、addPage()メソッドで1つのページ追加するか、addPage()メソッドでコレクション内の複数ページを追加します。
例として、通知に2つ目のページを追加するコードを示します。
[java]
// メインとなる通知のBuilderを作成します。
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.new_message)
.setContentTitle(“Page 1”)
.setContentText(“Short message”)
.setContentIntent(viewPendingIntent);
// BigTextStyleの2つ目のページを作成します。
BigTextStyle secondPageStyle = new NotificationCompat.BigTextStyle();
secondPageStyle.setBigContentTitle(“Page 2”)
.bigText(“A lot of text…”);
// 2つ目のページの通知を作成します。
Notification secondPageNotification =
new NotificationCompat.Builder(this)
.setStyle(secondPageStyle)
.build();
// メインとなる通知を作成し2つ目のページを追加します。
Notification twoPageNotification =
new WearableNotifications.Builder(notificationBuilder)
.addPage(secondPageNotification)
.build();
[/java]
では実際に実行してみましょう。
昨日作成したアプリケーションに追加してみましょう。ボタンをおした時の処理を以下のように修正します。
[java]
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(getApplicationContext(), ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, replyIntent, 0);
// メインとなる通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setContentTitle(“embossさんからメッセージ”)
.setContentText(“I love KitKat!”)
.setContentIntent(replyPendingIntent);
// BigTextStyleの2つ目のページを作成します。
NotificationCompat.BigTextStyle secondPageStyle = new NotificationCompat.BigTextStyle();
secondPageStyle.setBigContentTitle(“Page 2”)
.bigText(“A lot of text…”);
// 2つ目のページの通知を作成します。
Notification secondPageNotification =
new NotificationCompat.Builder(getApplicationContext())
.setStyle(secondPageStyle)
.build();
// 定義済みテキストよる返答を追加
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.setChoices(replyChoices)
.build();
// ウェアラブル通知の作成とリモート入力の追加
// メインとなる通知を作成し2つ目のページを追加します。
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.addPage(secondPageNotification)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(getApplicationContext());
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, replyNotification);
}
});
[/java]
それでは実行してみましょう。左にスワイプすると、ページが増えていることが確認できると思います。
notificationsampleapp

Android WearでRemoteInputを使って通知から音声入力を受け取るとろこまで試してみる

本日は、先日の記事を見ながら、実際にプロジェクトを作成して実行してみましょう。
先日はEclipseを使用しましたが、今日はAndroid Studioを使ってみましょう。
http://developer.android.com/sdk/installing/studio.html
より、Android Studioをダウンロードします。
android-studio-page
 
Macの場合、android-studio-bundle-133.1028713-mac.dmgがダウンロードされました。
ダウンロードしたdmgを開き、Android Studioをアプリケーションフォルダにドラッグ&ドロップします。
install-android-studio
 
起動します。設定ファイルのインポート画面になるのでそのままOKをクリック。
Complete Installation
 
起動中。
android-studio-starting
 
新しいバージョンがあることが示されています。More Infoを押すと更新内容をブラウザで表示します。
 
update-android-stuido
 
下部の「Check for updates now.」をクリックします。
 
checkforupdate
Update and restartをクリックしてアップデートします。完了するとAndroidStudioが再起動します。
update-info
新しいプロジェクトを作成します。
適当な名称をつけてNext。
new-project01
デフォルトのままNext。
new-project02
デフォルトのままFinishするとプロジェクトが作成されます。
new-project03
Tools > Android > SDK ManagerでSDKマネージャを開きます。
Android SDK Tools のバージョンがが22.6以上であることを確認します。
android-sdk-manager
「Android Wear ARM EABI v7a System Image」を選択します。
android-sdk-managar02
Android Support LibraryとAndroid Support Repositoryがインストールされているか確認します。インストールされていましたが最新版があるのでアップデートします。
android-sdk-managar03
インストールします。
android-sdk-managar04
ライセンスを承認してInstallをクリックするとインストールが開始されます。
android-sdk-managar05
Android Wearエミュレータを準備します。Tools > Android > AVD ManagerよりAVDマネージャを起動します。
Newをクリックして次のように設定します。
createAVD
OKをクリック。作成結果が表示されますのでOKで閉じます。
createAVDResult
作成したAVDを選択して、Startをクリックします。
startAVD
Launch from snapshotのチェックを外し、Save to snapshotにチェックを付けてLaunchをクリックしてAVDを起動します。
LaunchOptions
起動中。起動にはそこそこ時間がかかります。
startingAVD
startingWear
起動しました。起動したら一旦閉じることで、スナップショットを取ります。
startedWear
もう一度起動します。今度はSave to snapshotのチェックを外し、Launch from snapshotだけにチェックを入れてLaunchで起動します。以後はこの方法で起動すれば起動時間をいくらか短縮できます。
restartAVD
携帯端末をMacにUSB接続します。
次のコマンドを入力します。
[shell]
* cd /Applications/Android\ Studio.app/sdk/platform-tools
* ./adb -d forward tcp:5601 tcp:5601
[/shell]
携帯デバイスでAndroid Wear Preview起動します。青い部分をタップ。
AndroidWearPreviewNotice
通知へのアクセスが開くのでAndroid Wear Previewをタップ。
Android Wear Previewを有効にしますか?で「OK」をタップ。
これで準備は整いました。次はライブラリです。
libsディレクトリにwearable-preview-support.jar を追加します。ドラッグ&ドロップで追加できます。macの場合optionキーを押しながらドラッグ&ドロップでコピーになります。
copylibs
追加されました。
addlibs
build.gradleを開き次の依存ルールを追加します。
[text]
dependencies {
compile “com.android.support:support-v4:18.0.+”
compile files(‘../libs/wearable-preview-support.jar’)
}
[/text]
追加したら、ツールバーのボタンを押して反映します。
sync-gradle
さてここからはコーディングです。
Android Wearで応答した時に開くActivityを新規作成します。パッケージを右クリックして New > Activity > Blank Activity を選択します。
newActivity
Activityの新規作成画面になりますのでActivity Nameに「ReplyActivity」と入力してFinishをクリックして追加します。
newActivityCreate
まずは通知ボタンを追加します。activity_main.xmlを開きボタンを追加します。
add-button
MainActivity.javaにボタンを押したら通知を送信するようにコーディングします。
[java]
package com.example.androidweartestapplication.weartest;
import android.app.Activity;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.preview.support.wearable.notifications.*;
import android.preview.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
String replyLabel = “返信”;
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(getApplicationContext(), ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, replyIntent, 0);
// 通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setContentTitle(“embossさんからメッセージ”)
.setContentText(“I love KitKat!”)
.setContentIntent(replyPendingIntent);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.build();
// ウェアラブル通知の作成とリモート入力の追加
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(getApplicationContext());
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, replyNotification);
}
});
}
@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);
}
}
[/java]
実行してみましょう。携帯デバイスを選択してOKをクリックします。
choose-device
アプリケーション上で「通知」ボタンを押してみましょう。
AndroidWearTestApp2
するとAndroid Wearに通知が届きます。
notification01
左にスワイプします。通常「Open」アクションが表示されていたいましたが「Reply」アクションが表示されています。「Reply」をタップします。
notification02
音声入力の画面になります。
notification03
エミュレータでは音声認識は使用できませんので、かわりにキーボードで入力します。
notification04
入力後しばらくく待つと再入力または保存の画面になります。
notification06
Saveボタンのインジゲータが一周りし、Doneと表示されれば完了です。
notification07
端末ではReplyActivityが起動していることが確認できます。
ReplyActivity
では次に、定義済みテキストによる応答を試してみましょう。まずはXMLにreply_choicesを追加します。
strings.xml
[xml]
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Android Wear Test Application</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="title_activity_reply">ReplyActivity</string>
    <string name="reply_label">返信</string>
    <string-array name="reply_choices">
        <item>Yes</item>
        <item>No</item>
        <item>Maybe</item>
    </string-array>
</resources>
[/xml]
ボタンを押した時の処理を次のように修正します。
[java]
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(getApplicationContext(), ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(getApplicationContext(), 0, replyIntent, 0);
// 通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(android.R.drawable.ic_dialog_email)
.setContentTitle(“embossさんからメッセージ”)
.setContentText(“I love KitKat!”)
.setContentIntent(replyPendingIntent);
// 定義済みテキストよる返答を追加
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.setChoices(replyChoices)
.build();
// ウェアラブル通知の作成とリモート入力の追加
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(getApplicationContext());
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, replyNotification);
}
});
[/java]
実行してみましょう。左にスワイプしてReplyをタップします。すると選択肢が表示されています。タップして返信することが出来ます。
notification08
もちろんここで音声入力を開始すれば認識されます。
notification09
では最後に、Android Wearで返信した文字列を端末側で受け取るようにします。レイアウトに文字列を表示するためのTextViewを配置します。
activity_reply.xml
[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="com.example.androidweartestapplication.weartest.ReplyActivity">
    <TextView
        android:text="@string/title_activity_reply"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/reply_text" />
</RelativeLayout>
[/xml]
Android Wearから受け取った文字列をTextViewに表示します。ReplyActivityのonCreateに処理を追加します。
ReplyActivity.java
[java]
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reply);
String EXTRA_VOICE_REPLY = “extra_voice_reply”;
Intent i = getIntent();
String reply = i.getStringExtra(EXTRA_VOICE_REPLY);
TextView text = (TextView)findViewById(R.id.reply_text);
text.setText(reply);
}
[/java]
実行してみましょう。
音声入力を開始し、「I love key lime pie!」と入力します。
notification10
完了すると、端末側に「I love key lime pie!」と表示されます。あとは端末側でこのメッセージを投稿するなりすればアプリケーションとしては完成ですね。
llovekeylimepie

VagrantでParallelsの仮想マシンを一瞬で作成しよう

Vagrantって?


Vagrantはすばらしい開発環境構築ツールです。完全で過般的な開発環境の構築・管理のためのフレームワークです。
 

Parallelsとは?


Macで定番の仮想PC構築ツールだ。VirtualBoxやらVMWareとか色々使ってみたけどMacではParallelsが一番いい。

Vagrantのインストール

まずはVagrantをダウンロード&インストールします。
Vagrant-download
 
Downloadボタンを押し、Mac OS X用をダウンロード。
Vagrant-mac
 
vagrant_1.5.1.dmgを保存します。dmgを開いてマウントします。
Vagrant.apkをクリックしてインストール。
install1
install2
install3
インストール確認。
[shell]
* vagrant –version
Vagrant 1.5.1
[/shell]
次に、Vagrant用のParallelsプロバイダVagrant Parallels Providerを導入します。
Vagrant Parallels Providerは
Parallels Desktop 8 と 9 に対応しています。Vagrant v1.5以上に対応します。
基本的なVagrantの機能に対応していますが、Forwarded ports 設定は使えないようです。
Vagrant Parallels Providerのインストールです。まずParalells DesktopとVagrantをインストールします。最新版をインストールする事をお勧めします。次にプロバイダのインストールですがこれは簡単で、次のコマンドを実行するだけです。
[shell]
* vagrant plugin install vagrant-parallels
Installing the ‘vagrant-parallels’ plugin. This can take a few minutes…
Installed the plugin ‘vagrant-parallels (1.0.6)’!
[/shell]
Vagrant Parallels Providerの使い方はこちらにドキュメントがあります。
デフォルトプロバイダをparallelsにします。
[shell]export VAGRANT_DEFAULT_PROVIDER=parallels[/shell]
上記を~/.bashrcに追記しておきましょう。

Vagrant Parallels Providerの使い方

新しいプロジェクト用ディレクトリを作成してVagrantプロジェクトを作成します。
[shell]
* mkdir Vagrant
* cd Vagrant/
* mkdir centos6.5_project
* cd centos6.5_project/
* vagrant init parallels/centos-6.5
[/shell]
[text]
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
[/text]
[shell]
* vagrant up –provider=parallels
[/shell]
[text]
Bringing machine ‘default’ up with ‘parallels’ provider…
==> default: Box ‘parallels/centos-6.5’ could not be found. Attempting to find and install…
default: Box Provider: parallels
default: Box Version: >= 0
==> default: Loading metadata for box ‘parallels/centos-6.5’
default: URL: https://vagrantcloud.com/parallels/centos-6.5
==> default: Adding box ‘parallels/centos-6.5’ (v0.1.0) for provider: parallels
default: Downloading: https://vagrantcloud.com/parallels/centos-6.5/version/1/provider/parallels.box
==> default: Successfully added box ‘parallels/centos-6.5’ (v0.1.0) for ‘parallels’!
==> default: Importing base box ‘parallels/centos-6.5’…
==> default: Checking if box ‘parallels/centos-6.5’ is up to date…
==> default: Setting the name of the VM: centos65_project_default_1395845391717_93498
==> default: Preparing network interfaces based on configuration…
default: Adapter 0: shared
==> default: Clearing any previously set network interfaces…
==> default: Booting VM…
==> default: Waiting for machine to boot. This may take a few minutes…
default: SSH address: 10.211.55.6:22
default: SSH username: vagrant
default: SSH auth method: private key
default: Error: Connection refused. Retrying…
default: Error: Connection refused. Retrying…
==> default: Machine booted and ready!
==> default: Checking for Parallels Tools installed on the VM…
==> default: The Parallels Tools on this VM do not match the installed version of
==> default: Parallels Desktop! In most cases this is fine, but in rare cases it can
==> default: cause things such as shared folders to not work properly. If you see
==> default: shared folder errors, please update the Parallels Tools within the
==> default: virtual machine and reload your VM.
==> default:
==> default: Parallels Tools Version: 9.0.24215.978862
==> default: Parallels Desktop Version: 9.0.24172.951362
==> default: Mounting shared folders…
default: /vagrant => /Users/hiroaki/Vagrant/centos6.5_project
[/text]
Vagrantは自動的にboxと新しい仮想マシンをダウンロードしてインポートします。仮想マシンが設定&開始されます。
createvirtualmachine
ここで警告が出ています。訳すと次のようになります。

このVMにParallels Toolsは、Parallels Desktopのインストールされているバージョンと一致していません!ほとんどの場合、これは問題ありませんが、まれに、それは、共有フォルダなどのものは正常に動作しない場合があります。共有フォルダのエラーが表示された場合は、仮想マシン内のParallels Toolsをアップデートして、仮想マシンを再ロードしてください。

「ほとんどの場合問題ない」とあるので、とりあえず放置します。問題が発生したら対応を考える事としましょう。
Parallelsの仮想マシンリストを見ると、仮想マシンが増えている事が確認できます。
virtualmachinelist
仮想マシンが起動したら、SSHでログインします。
[shell]
* vagrant ssh
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$
[/shell]
以上でVagrantとVagrant Parallels Providerの導入は完了です。
さて、先ほどの警告に対処しましょう。作成されたVMにParalells Toolsをアップデートして、さらに再利用できるようにboxファイルを作成しておきます。
まず、Toolsを手動インストールします。
http://kb.parallels.com/jp/112609
次に、今起動しているVMから新しいBoxを作成します。
vagrant package
すると、pakage.boxができているので、
[shell]
vagrant box add parallels-centos-6.5-Build9.0.24217/ Users/USER_NAME/Vagrant/centos6.5_project/package.box
[/shell]
という感じにbox add コマンドでboxを追加します。
次回からは
vagrant init parallels-centos-6.5-Build9.0.24217
とすればOKです。

Android Wearで通知から音声入力を受け取る

Get Started(導入)とCreating Notifications for Android Wear(Wear用の通知を作成する)は次の記事を参照して下さい。
GoogleがスマートウォッチOS “Android Wear” を発表したのでテスターになってみた
Android Wearで通知から音声入力を受け取る
 
先日に引き続き、Android Wearを動かして見たいと思います。

通知から音声入力を受け取る

前回同様、今日は次のページを翻訳しながら読み進めていきたいと思います。
Receiving Voice Input from a Notification


もし、あなたの通知に、電子メールに返信するなどといったテキストで応答するアクションがあれば、通常は携帯端末でアクティビティを起動する必要があります。しなしながら、通知がAndroidウェアラブルに表示されているとき、あなたは音声入力で直接返信することが出来ます。また、ユーザがー選択できるテキストメッセージ事前に用意して提供することも出来ます。
ユーザーが音声または表示されたメッセージを選択するかして返信するとき、システムは接続されている携帯デバイスのアプリケーションにメッセージを送信します。メッセージには、あなたが通知アクションに使用する指定したインテントの追加情報が、追加されています。
注意:エミュレータで開発する場合、AVDの設定でHardware keyboard presentを有効にして、音声入力フィールドでテキストを入力し応答する必要があります。

RemoteInputを定義する

音声入力をサポートするアクションを作成するには、まずRemoteInput.Builder APIを使用してRemoteInputのインスタンスを作成します。RemoteInput.Builder コンストラクタはシステムがハンドヘルド上のアプリへの返信メッセージを運ぶためのインテントのExtraのキーとして使用する文字列を受け取ります。
例えば、音声入力のカスタムラベルを提供する新しいRemoteInputオブジェクトを作るには次のようにします。
[java]
// Key for the string that’s delivered in the action’s intent
private static final String EXTRA_VOICE_REPLY = “extra_voice_reply”;
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.build();
[/java]

定義済みテキストによる返答を追加


音声入力を可能にすることに加え、ユーザーが素早く返信出来るように5つのテキストを提供することが出来ます。setChoices()を呼び出し、文字列配列を渡します。
例えば、リソース配列にいくつかの応答を追加することができます。
 
 
res/values/strings.xml
[xml]
<?xml version=”1.0″ encoding=”utf-8″?>
<resources>
<string-array name=”reply_choices”>
<item>Yes</item>
<item>No</item>
<item>Maybe</item>
</string-array>
</resources>
[/xml]
その後、インフレートして文字列配列を作成しRemoteInputに追加します。

[java]
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.setChoices(replyChoices)
.build();
[/java]

プライマリアクションとして音声入力を受け取る

もし、「返信が」アプリケーションのプライマリアクション(setContentIntent()で定義された)ならば,addRemoteInputForContentIntent()を使ってメインアクションにRemoteInputをアタッチしなければなりません。例えば
[java]
// 返信アクションのインテントを作成
Intent replyIntent = new Intent(this, ReplyActivity.class);
PendingIntent replyPendingIntent =
PendingIntent.getActivity(this, 0, replyIntent, 0);
// 通知の作成
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_new_message)
.setContentTitle("Message from Travis")
.setContentText("I love key lime pie!")
.setContentIntent(replyPendingIntent);
// リモート入力の作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.build();
// ウェアラブル通知の作成とリモート入力の追加
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addRemoteInputForContentIntent(remoteInput)
.build();
[/java]
addRemoteInputForContentIntent()を使ってRemoteInputオブジェクトを通知のプライマリアクションとして追加したことで、Android Wearでそれを選択した時、ボタンは通常Openと表示されていたアクションがReplyアクションと音声入力を開始するUIになります。

セカンダリアクションとして音声入力を受け取る

返信アクションが通知のプライマリアクションではない場合や音声入力をセカンダリアクションとして有効にしたい場合、Actionオブジェクトとして定義した新しいアクションボタンとしてRemoteInputを追加します。
アイコンとアクションボタンへのテキストラベルのどちらかを取り、さらに、PendingIntent、ユーザがアクションを選択した時にシステムがアプリを呼び出せるようにペンディングインテントを、Action.Builder()コンストラクタでActionのインスタンスを作成してください。例えば:
[java]
// ユーザがアクションを選択した時に呼ばれるペンディングインテントを作成
Intent replyIntent = new Intent(this, ReplyActivity.class);
PendingIntent pendingReplyIntent =
PendingIntent.getActivity(this, 0, replyIntent, 0);
// RemoteInputを作成
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
.setLabel(replyLabel)
.build();
// 通知Actionを作成
Action replyAction = new Action.Builder(R.drawable.ic_message,
"Reply", pendingIntent)
.addRemoteInput(remoteInput)
.build();
[/java]
ActionにRemoteInputを追加した後で、addAction()を用いてWearableNotifications.Builderにアクションを追加します。例えば:
[java]
// 通常の通知ビルダーを作成します
NotificationCompat.Builder replyNotificationBuilder =
new NotificationCompat.Builder(this)
.setContentTitle("New message");
// 通知アクションを作成しRemoteInputを追加します
Action replyAction = new Action.Builder(R.drawable.ic_message,
"Reply", pendingIntent)
.addRemoteInput(remoteInput)
.build();
// WearableNotificationsを作成しアクションを追加します
Notification replyNotification =
new WearableNotifications.Builder(replyNotificationBuilder)
.addAction(replyAction)
.build();
[/java]
ユーザがAndroidウェアラブルで「返信」を選択した時、システムは音声入力をプロンプトに表示する(あと事前定義返信のリストを表示する。提供していれば)。ユーザーが応答を完了すると、システムはアクションに付加されたインテントにユーザのメッセージ文字列をEXTRA_VOICE_REPLY(RemotInputBuilderコンストラクタに渡した文字列)として追加して起動しする。

Android Wearあれこれまとめ

とりあえずGoogle Wearについてメモ書きなど残しておきます。
Android WearのUIキット。使いどころはよくわからないがメモ。
http://androiduiux.com/2014/03/19/android-wear-ui-design-kit-for-photoshop-0-1-free-download/
Moto 360
a5fe568514504f7c_Unknown.gif.xxxlarge
http://moto360.motorola.com/
上記URLから開発者コミュニティに参加できるようだ。
とりあえず、開発者コミュニティに参加してみた。
Thanks for your interest in becoming one of our first developer partners for Moto 360! We’re excited about working with the developer community and seeing what you can do with the unique round UI of this device.
We’ll be reaching out with more details soon.
In the meantime, be sure to check out the Android Wear Developer Preview and documentation for app developers and designers. You can get all the info on the “Android Wear developer page”
Moto 360の画像がUPされてます。カッコイイですね~
http://motoimg.dictvm.org/img/

GoogleがスマートウォッチOS "Android Wear" を発表したのでテスターになってみた

GoogleがスマートウォッチOSを発表しましたね。

Google、スマートウォッチOS、Android Wearを発表―最初の製品はLG ‘G’とMotorola Moto 360

 

http://jp.techcrunch.com/2014/03/19/20140318googles-android-wear-a-nexus-program-for-smartwatches-debuts-with-the-lg-g/

それでは早速、Google開発者ブログより、開発者プレビューに登録して、一足先にAndroid Wearableを体験しましょう。
開発者プレビューに登録すると24時間以内に返信が来るようです。さて返信は来るでしょうか?...しばらく待つと30分ほどでnoreply@google.comよりメールがきました。それでは、メールの内容を見ながら作業を進めます。
Android Wareの開発を始めるにはPreview Support libraryとスマフォ用Android Ware Previewアプリが必要なようです。
まずはPreview Support ライブラリとサンプルをサウンロードします。送られてきたメールのリンクをクリックするとAndroidWearPreview.zipがダウンロードされます。
つぎに、Google Play StoreでAndroid Wear Previewテスターとなるためにオプトインします。
メールのリンクをクリックするとAndroid Wareのテスターになるための招待画面が表示されるので「テスターになる」をクリックします。
AndroidWareTester
 
「Play ストアから「Android Wear Preview」をダウンロード」をクリックしてみると、「このアプリはお使いのどの端末にも対応していません。」と表示されてしまいます。う〜ん、どうすればいいんだろう?私の持っているAndroid端末には対応してないのか?
どうもKitKatの最新が入っている端末出ないとダメなようですね。私のAndorid携帯であるXperia Z(SO-02E)は、Android 4.2.2 Jelly Beanなのでインストール出来ません。ううむ。困った。
ではNexus7(1st gen)ではどうだ?Android4.2.2にアップデート済みです。
AndroidWearPreviewNotSupport
 
残念ながらこちらも「お使いの端末はこのバージョンに対応していません。」となってしまいました。g+のスレッドではNexus7(2013)でも同様の状況であるようです。
この辺は改善されていくでしょうが、このまま指をくわえて待っているのも嫌。かといってNexus5を購入するってのもちょっと高いしなあ。
ということで、サイドロードしてみましょう。こちらより入手します。
https://drive.google.com/file/d/0B4d9d7-eZ4P0QUFPSlZEOVlMeVdSR1RfdzkwWFNiN0NwVGkw/edit?usp=sharing
 
com.google.android.wearablepreview.app-1.0.0.1077241.apk というファイルをダウンロード、端末に転送してインストールします。
AndroidWearPreview1AndroidWearPreview2
 
よし、うまく行きました。これで進められそうです。
近々、Nexus7などの非携帯電話端末でも使えるようになるようです
 
さて次にAndroid Wearについての情報を得ます。詳細はAndroid Wear Developer Get Started ページを参照して下さいとの事。
注意事項として、「これはプレビューリリースであるため、公にアプリケーションを配布しないで下さい。」とあります。
またAPIはリリースされた際には変更されてアプリケーションを修正しないといけない場合もある点も注意が必要です。
Android Ware 開発者コミュニティに参加してあなたの得た経験を共有したり質問したりすることが出来ます。英語ですが有益な情報がやり取りしておくのでウォッチしておくと良いです。
さて、では Get Started ページを見ながら、セットアップをしていきましょう。
1.Install the Android SDK.
Android SDKにはAndroidのためのアプリケーションを構築するために必要なすべての開発ツールが含まれています(オプションのIDEもダウンロードできます)。 さくっとダウンロードしてインストールしてしまいましょう。
2.Sign up for the Android Wear Developer Preview.
ADTプラグインのバージョンはversion 22.6.1以上が必要です。既にAndroidの開発環境を持っている場合は確認が必要でしょう。
次にAndroidWare システムイメージのインストールです
1.Android SDKマネージャを起動
2.22.6以上に更新
Android SDK Toolsを22.6以上に更新します。
androidsdkupdate
 

1.Android SDK Toolsを選択

2.Install pakageをクリック

3.ライセンスを承認しinstallをクリック

4.インストールが完了したらAndroid SDK Managerを再起動します。

3.Android Wear ARM EABI v7a System Imageを選択します。
androidsdkupdate2
4.Android Support Libraryを選択します。
5.Install packagesをクリックします
6.ライセンスを承認しInstallをクリックします。
ここで問題が発生。
インストール後、Eclipseを再起動すると
This Android SDK requires Android Developer Toolkit version 22.6.1 or above.
Current version is 22.3.0.v201310242005-887826.
Please update ADT to the latest version.
というエラーが表示されてしまいました。
thisandroidsdkrequires
 
その場合は次の手順で解決できます。

メニューのHepl – Install new software…を選択します。

Work withで「Add」をクリックして次のURLを入力します。

https://dl-ssl.google.com/android/eclipse/

AddUrl

「Developer Tools」にチェックを入れ「Next>」をクリック

InstallDeveloperTools
 

「Finish」をクリックします。

InstallDeveloperFinish
 
 

Securty Warningが表示されたらOKで閉じます。

SecurityWarning
 

インストールが完了するとEclipseを再起動するか尋ねられます。「Yes」を選択してEclipseを再起動します。

restart
 
よし、これで大丈夫。
 
それでは、次にAndroid Wear Emulatorを設定します
1.Android Virtual Device Managerを起動します
2.Newをクリックします
3.AVD Nameに四角形ディスプレイなら”AndroidWearSquare”または丸型ディスプレイなら”AndroidWearRound”と入力します。
4.DeviceでAndroid Wear Square(四角形) もしくは Android Wear Round(丸型)を選択します。
5.Targetに「Android 4.4.2 – API Level 19」を選択します。
6.CPU/ABIに「Android Wear ARM (armeabi-v7a)」を選択します。
7.SkinででAndroid Wear Square(四角形) もしくは Android Wear Round(丸型)を選択します。
8.その他のオプションはデフォルトのまま、「OK」をクリックします。実際のAndroid Wareデバイスには入力方式としてキーボードがないのですが、音声入力のかわりに画面上でテキスト入力出来るように「Hardware keyboard present」にチェックしておく必要があります。
newAVD
9.AVDのリストで作成したデバイスを選択して「Start」をクリックします。Windowが開くので「Launch」をクリックします。
Android Wearエミュレータが起動します。アプリの通知テストを開始するには、Android Wear Preview アプリをインストールした開発用デバイスが必要です。
エミュレータの起動時間を改善するにはAVDの設定でEmulator Optionの下のSnapshotを有効にします。エミュレータを起動したら、Save to shapshotを選択してから起動します。エミュレータが起動すると、終了時にスナップショットが保存されます。再度AVDを起動した時、Launch from snapshotを選択状態にして、Save to snapshotの選択は解除しておきます。
注意:Android Wear amulatorにアプリをインストールしないで下さい。今までのAndroidアプリはサポートしておらず、そのようなアプリを実行した結果は予測出来ません。
3.Android Wear Previewアプリのセットアップ
アプリの通知をAndroid Wear エミュレータに配信するため、Android Wear PreviewアプリをAndroidにインストールする必要があります。
Android Wear Previewアプリをインストールするには、Google Play StoreでDeveloper Previewにサインアップする必要があります。
注意:Android Wear Previewアプリは、Android4.3以上で使用し、Androidのエミュレータでは使用できません。
Android Wear Previewアプリは先ほどインストールしましたのでOK。先へ進みます。
Android Wear PreviewアプリをインストールしたらAndroid Wearエミュレータと通信するように設定します。
1.Android Wear Previewアプリを起動します。現在アプリは通知リスナーとして有効になっていないという通知が表示されていると思います。メッセージをタップしてシステム設定を開き、Android Wear PreviewをタップしてAndroid Wear Previewを有効にします。
AndroidWearPreviewNotice
 
Android Wear Previewをタップします。
AndroidNotification1
 
「Android Wear Previewを有効にしますか?」ダイアログで「OK」をタップします。
AndroidNotification2
 
Android Wear Previewにチェックが入り、通知が有効になりました。
AndroidNotification3
2.デバイスを開発マシンにUSB接続します。他のデバイスが開発マシンに接続されていない事を確認します。
3.前のセクションで作成したAndroid Wear エミュレータが起動している事を確認します。エミュレータは時刻と、デバイスが接続していない事を示すアイコンが表示されています。
AndroidWearStarted 2
コマンドターミナルを開きAndroid SDKの “platform-tools/”ディレクトリに移動して次のコマンドを実行します。
[shell light=”true”]
adb -d forward tcp:5601 tcp:5601
[/shell]
 
私の環境(Mac)では以下のようにコマンドを実行しました。
[shell light=”true”]
cd /Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools
./adb -d forward tcp:5601 tcp:5601
[/shell]
5.Android Wear Previewアプリに戻ると、エミュレータに接続されていると思います。
これでデバイスからの通知をAndroid Wearエミュレータに表示できるようになりました。
AndroidWearPreviewConnected
例えば、端末にメールが届くと、Android Wearエミュレータに表示されます。
mailnotification
 
4.サポートライブラリをプロジェクトに追加する
Android Wear preview support libraryには、Android Wearのユーザー体験のためにアプリの通知を最適化することが出来るようにするため、いくつかのAPIが含まれています。
ライブラリを入手するには、Developer Previewに参加したときに受け取ったメールの中に、サポートライブラリといくつかのサンプルアプリが入ったZIPファイルへのダウンロードリンクがあるので、リンクをクリックしてダウンロードします。
ダウンロードしたZIPファイルを展開し、サポートライブラリをプロジェクトに追加します。
まずは適当にプロジェクトを作成しましょう。詳細は下記画像をクリックして参照してください。
NewProject1 NewProject2 NewProject3 NewProject4 NewProject5
 
1.Androidアプリのプロジェクトのルートに libs/ ディレクトリを作成します。通常は既に出来ていると思います。
NewProject6
2.v4 サポートライブラリのJARファイルを libs/ ディレクトリに配置します。これも既に追加されています。
3.同じくwearable-preview-support.jar ファイルを libs/ ディレクトリに配置します。ドラッグ&ドロップでコピーできます。
dragdrop
 
copylibrary
addlibrary
 
4.JARファイルを右クリックしBuild Path > Add to Build Path を選択してビルドパスに追加します。
addtobuildpath
これで開発の準備は整いました。「通知を最適化するためにはCreating Notifications for Android Wearを読んで下さい。」という事ですので、読み進めていきましょう。
 
 
 
Android Wearへの通知を作成する
スマートフォンやタブレットといったAndroidデバイスがAndroid Wearに接続されている場合、デフォルトではすべての通知がデバイス間で共有されます。Android Wearではそれら通知が新しいカードとしてコンテキストストリームに表示されます。
だからなにも努力をしないでも、アプリの通知はAndroid Wearの利用者が利用できます。とはいえ、幾つかの方法でユーザー体験を向上する事が出来ます。
例えば、ユーザーがメッセージに返信するなどといった様に、テキスト入力で通知に対して対応する可能性があるなら、ユーザーがウェアラブルデバイスの音声認識で返信する機能を追加する事ができます。
Android Wearの通知に最高のユーザー体験を提供するのを助けるため、このガイドはNortificationCompartで標準テンプレートを使用して通知を構築する方法を示しています。
APIの構築と、通知のウェアラブルユーザー体験能力の拡張に着手する方法です。
リモートビューを使用した通知はカスタムレイアウトを取り去られ、システムはテキストとアイコンだけをカード内の通知の表示として使います。しかしながら、カスタムカードレイアウトはこの後の公式なAndroid Wear SKDでサポートされるでしょう。
必須クラスの一ポート
開発を始めるには先にGet Started with the Developer Previewの指示に従い完了させておく必要があります。そのドキュメントで述べたように、アプリにはv4 support libraryとDeveloper Preview サポートライブラリが必要です。さて手始めにプロジェクトに次のコードを含めて下さい。
[java light=”true”]
import android.preview.support.wearable.notifications.*;
import android.preview.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat;
[/java]
注意:今のAndroid Wear Developer Preview APIは開発及びテスト用途のみを意図しており、アプリケーション構築用ではありません。GoogleはAndroid Wear SDKの公式リリースのまえにこのDeveloper Previewを変更する事があります。Developer Previewを使ったアプリケーションを配布したり出荷しないでください。公式なSDKがリリースされた後には、もはやこのDeveloper Previewはサポートされないでしょう(Developer Previewをベースにしているとアプリが壊れる原因となります)。
Create Notifications with the Notification Builder
v4 support libraryは例えばアクションボタンや大きなアイコンなど、最新の通知機能を使った通知をAndroid1.6(API level4)以上との互換性を維持しつつ、作成する事を可能にします。
例として、新しいNortificationManagerCmpart APIと結合されたNortificationCompart APIを使って通知を作成し発行するための幾つかのコードを示します。
 
 
[java light=”true”]
int notificationId = 001;
// 通知コンテンツ用インテントを構築
Intent viewIntent = new Intent(this, ViewEventActivity.class);
viewIntent.putExtra(EXTRA_EVENT_ID, eventId);
PendingIntent viewPendingIntent =
        PendingIntent.getActivity(this, 0, viewIntent, 0);
NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent);
// NotificationManager サービスのインスタンスを得る
NotificationManagerCompat notificationManager =
        NotificationManagerCompat.from(this);
// 通知の構築と通知マネージャで通知の発行を行う
notificationManager.notify(notificationId, notificationBuilder.build());
[/java]
この通知が携帯端末上に表示されると、ユーザーは通知をタッチする事でsetContentIntent()メソッドで明示されたPendingIntentを呼び出す事が出来ます。
この通知がAndroidウェアラブル上に表示されたとき、ユーザーは通知を左にスワイプしてアクションを開き、そしてそれのインテントを携帯端末上で実行する事が出来ます。
では実際にコーディングしてみましょう。
先ほど作成したプロジェクトにコードを追加していきます。まずはボタンを配置しタップしたら通知を送出するようにします。
まずはボタンを追加。
activity_main.xml
[xml]
<FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:id=”@+id/container”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”com.example.androidwearnotificationssample.MainActivity”
tools:ignore=”MergeRootFrame” >
<LinearLayout
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical” >
<Button
android:id=”@+id/button1″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center_horizontal”
android:text=”Button” />
</LinearLayout>
</FrameLayout>
[/xml]
ボタンがタップされたら通知を出します。
[java highlight_lines =”16″ highlight=”0,17-19,34-57″]
package com.example.androidwearnotificationssample;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.os.Build;
import android.preview.support.wearable.notifications.*;
import android.preview.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
        
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
// 通知コンテンツ用インテントを構築
Intent viewIntent = new Intent(MainActivity.this, ViewEventActivity.class);
PendingIntent viewPendingIntent =
        PendingIntent.getActivity(MainActivity.this, 0, viewIntent, 0);
NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(MainActivity.this)
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle("テスト")
        .setContentText("テストイベントです")
        .setContentIntent(viewPendingIntent);
// NotificationManager サービスのインスタンスを得る
NotificationManagerCompat notificationManager =
        NotificationManagerCompat.from(MainActivity.this);
// 通知の構築と通知マネージャで通知の発行を行う
notificationManager.notify(notificationId, notificationBuilder.build());
}
});
    }
    @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);
    }
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        public PlaceholderFragment() {
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }
}
[/java]
 
Android Wearで通知をタップした時に開くためのActivityを作成します。
view_event.xml
[xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ViewEventActivity" />
</LinearLayout>
[/xml]
ViewEventActivity.java
[java]
package com.example.androidwearnotificationssample;
import android.app.Activity;
import android.os.Bundle;
public class ViewEventActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_event);
    }
}
[/java]
[xml num=”25″]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidwearnotificationssample"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.androidwearnotificationssample.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name="com.example.androidwearnotificationssample.ViewEventActivity" 
            android:label="@string/view_name">
        </activity>
    </application>
</manifest>
[/xml]
実行します。
sample1
ボタンをタップすると通知が表示されます。
sample2
Android Wearにも通知が表示されます。
sample3
 
左にスワイプするとアクションが表示されます。
sample4
ボタンをタップすると携帯端末の画面でViewEventActivityが開きます。
sampleaction
Add Action Buttons
setContentIntent()で定義されたプライマリコンテンツアクションに加えて、PendingIntentをaddAction()メソッドで渡す事で別のアクションを追加する事が出来ます。
例えば、次のコードは上からの同じタイプの通知を示していますが、イベントの場所をマップで表示するにはアクションを追加します。
[java light=”true”]
// Build an intent for an action to view a map
Intent mapIntent = new Intent(Intent.ACTION_VIEW);
Uri geoUri = Uri.parse(“geo:0,0?q=” + Uri.encode(location));
mapIntent.setData(geoUri);
PendingIntent mapPendingIntent =
PendingIntent.getActivity(this, 0, mapIntent, 0);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_event)
.setContentTitle(eventTitle)
.setContentText(eventLocation)
.setContentIntent(viewPendingIntent)
.addAction(R.drawable.ic_map,
getString(R.string.map), mapPendingIntent);
[/java]
携帯端末では、アクションは通知に付けられた追加のボタンとして表示されます。Android Wearableではアクションはユーザが通知を左にスワイプした時に大きなボタンとして表示されます。ユーザがアクションをタップすると関連づけられたインテントが携帯端末上で起動されます。
ヒント:もし通知に「返信」アクションを含める場合には、Android Wearableから直接返信を入力出来るように振る舞いを拡張する事が出来ます。詳細についてはReceiving Voice Input from a Notificationを読んで下さい。
(アイコンの仕様を含む)アクションボタンのデザインの詳細は、Design Principles of Android Wearをご覧下さい。
では実際にコーディングしてみましょう。先ほどの通知に地図を開くアクションを追加します。携帯端末上のボタンを押した時に送信する通知の処理を以下のように修正します。
MainActivity.java
[java highlight_lines =”0,10-15,23″]
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
// 通知コンテンツ用インテントを構築
Intent viewIntent = new Intent(MainActivity.this, ViewEventActivity.class);
PendingIntent viewPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, viewIntent, 0);
// マップ表示ビューアクション用インテントを構築
Intent mapIntent = new Intent(Intent.ACTION_VIEW);
Uri geoUri = Uri.parse(“geo:0,0?q=Osaka”);
mapIntent.setData(geoUri);
PendingIntent mapPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, mapIntent, 0);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(“テスト”)
.setContentText(“テストイベントです”)
.setContentIntent(viewPendingIntent)
.addAction(drawable.ic_dialog_map, getString(R.string.map), mapPendingIntent);
// NotificationManager サービスのインスタンスを得る
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(MainActivity.this);
// 通知の構築と通知マネージャで通知の発行を行う
notificationManager.notify(notificationId, notificationBuilder.build());
}
});
[/java]
Add a Big View
“big view”スタイルのうち1つを通知に追加する事で、拡張したテキストコンテンツを通知に挿入する事が出来ます。携帯デバイスでは、通知を拡張したbig view コンテンツを見る事ができ、同時にAndroid Wearではbig viewコンテンツはデフォルトで表示されます。
通知に拡張されたコンテンツを追加するには、NotificationCmpat.Builder オブジェクトでsetStyle()を呼び出し、BigTextStyle またはinboxStyleのインスタンスを渡します。
例えば、次のコードは、完全なイベントの詳細を含めるために、イベント通知にNortificationCompat.BigTextStyleのインスタンスを追加しています(setContentText()へ提供されるスペースに収まるよりも多くのテキストを含みます)。
[java light=”true”]
// 通常のテキストではフィットしないような長いイベントの説明を
// 表示する場合は、big viewコンテンツを指定します。
BigTextStyle bigStyle = new NotificationCompat.BigTextStyle();
bigStyle.bigText(eventDescription);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_event)
.setLargeIcon(BitmapFractory.decodeResource(
getResources(), R.drawable.notif_background))
.setContentTitle(eventTitle)
.setContentText(eventLocation)
.setContentIntent(viewPendingIntent)
.addAction(R.drawable.ic_map,
getString(R.string.map), mapPendingIntent)
.setStyle(bigStyle);
[/java]
では実際にコーディングしてみましょう。先ほどの通知をbig styleにしてみます。携帯端末上のボタンを押した時に送信する通知の処理を以下のように修正します。
[java]
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 001;
// 通知コンテンツ用インテントを構築
Intent viewIntent = new Intent(MainActivity.this, ViewEventActivity.class);
PendingIntent viewPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, viewIntent, 0);
// マップ表示ビューアクション用インテントを構築
Intent mapIntent = new Intent(Intent.ACTION_VIEW);
Uri geoUri = Uri.parse(“geo:0,0?q=Osaka”);
mapIntent.setData(geoUri);
PendingIntent mapPendingIntent =
PendingIntent.getActivity(MainActivity.this, 0, mapIntent, 0);
// 通常のテキストではフィットしないような長いイベントの説明を
// 表示する場合は、big viewコンテンツを指定します。
BigTextStyle bigStyle = new NotificationCompat.BigTextStyle();
bigStyle.bigText(“通常のテキストではフィットしないような長いイベントの説明を表示する場合は、big viewコンテンツを指定します。”);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(“テスト”)
.setContentText(“テストイベントです”)
.setContentIntent(viewPendingIntent)
.addAction(drawable.ic_dialog_map, getString(R.string.map), mapPendingIntent)
.setStyle(bigStyle);
// NotificationManager サービスのインスタンスを得る
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(MainActivity.this);
// 通知の構築と通知マネージャで通知の発行を行う
notificationManager.notify(notificationId, notificationBuilder.build());
}
});
[/java]
実行してみましょう。ボタンをタップすると通知が表示されます。
sample8
最初は省略表示されていますが、タップすると、通知領域が広がります。
sample9
 
ウェアラブルのための新しい機能を追加する
Android Wear preview support library はウェアラブルデバイス上の通知のユーザー体験を拡張することができる新しいAIPを提供しています。例えば、ユーザーがビューを左にスワイプして表示できる追加のコンテンツのためのページを追加したり、ユーザーがアプリが提供したテキストに音声入力で応答するといった機能を追加できます。
これらの新しいAPIを使うにはWearableNotifications.Builder()コンストラクタにNortificationCompat.Builderのインスタンスを渡します。それからWearableNotifications.Builderメソッドに通知に新しい機能を追加します。
例えば、次のように、
[java]
// 通常の通知機能用にNotificationCompat.Builderを作成します。
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(mContext)
.setContentTitle(“New mail from ” + sender.toString())
.setContentText(subject)
.setSmallIcon(R.drawable.new_mail);
// ウェアラブル用に独自機能を追加するために WearablesNotification.Builder を作成します。
Notification notification =
new WearableNotifications.Builder(notificationBuilder)
.setHintHideIcon(true)
.build();
[/java]
setHintHideIcon()メソッドは通知カードからアイコンを削除します。このメソッドはWearableNotifications.Builderクラスから利用できる新しい通知機能の一つです。
あなたの通知を配信したい場合、必ずNotificationManagerCompat APIを使うように注意して下さい。
[java]
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(this);
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, notification);
[/java]
代わりにフレームワークの通知マネージャーを使ってしまうと、WearableNotifications.Builderの一部の機能は動作しません。
それではプロジェクトにコードを追加してみましょう。MainViewにボタンを追加し、コードを追加します。
[java]
findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int notificationId = 002;
// 通常の通知機能用にNotificationCompat.Builderを作成します。
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setContentTitle(“New mail from テスト”)
.setContentText(“これはテストメールです”)
.setSmallIcon(drawable.ic_dialog_email);
// ウェアラブル用に独自機能を追加するために WearablesNotification.Builder を作成します。
Notification notification =
new WearableNotifications.Builder(notificationBuilder)
.setHintHideIcon(true)
.build();
// NotificationManagerサービスのインスタンスを取得します
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(MainActivity.this);
// 通知マネージャーで通知を作成し発行します
notificationManager.notify(notificationId, notification);
}
});
[/java]
実行し携帯端末上でボタンをタップすると通知が発行されます。
ウェアラブル上ではアイコンが非表示になっている事が確認できます。
sample10
 
WearableNotifications.Builder およびその他の API を使用してウェアラブルの通知をさらに強化するには、次の開発者ガイドを参照してください。
通知から音声入力を受け取る
ユーザーからの音声入力を受けとり、変換されたメッセージをアプリケーションへ配信するアクションを追加します。
通知にページを追加する
ユーザーが左にスワイプした時に表示する追加情報ページを追加します。
通知を積み重ねる
スタック内でアプリからの同じような通知が、カードストリームに複数のカードを追加する事なく個々に見る事が出来るように配置します。
さて、本日はここまでとしてまた明日にしましょう。
 

DigiFi 13号 付録USB DAC付デジタルパワーアンプ用 奥澤スチールケース

IMG_0303
DigiFi 13号特別付録USB DACパワーアンプ基盤用のケースが届きました!
製造販売は秋葉原の奥澤。
前回DigiFi 10号用の時はアルミシャーシだったのが、今回はスチールになっています。適度な重量感により安定感抜群。
なにより、心配していた質感もハンマートーン塗装により高級感があって満足度100%でした。
グレーとブラックでかなり悩みました。最終的にブラックに落ち着いたのですが、正解だったと思います。オーディオ機器らしくしまった感じがたまらない。
ケースを取り付ける前のアンプ。漢らしいネイキッドな感じも素敵ですが、メインで使うにはちょっと。
IMG_0291
開封すると領収証が入っていました。ケースはプチプチで包装されています。
IMG_0288
IMG_0289
さて、取り付けですが、説明書的なものは一切ありません。見りゃ分かるだろ的な考え方でしょうか。
実際の手順を以下に記しておきます。

DigiFi 13号特別付録USB DACパワーアンプ基盤用 奥澤スチールケースの組み立て方

1.LEDを慎重に横を向かせ、ケースの穴からのぞかせるようにします。
ラジオペンチを使い、慎重に足下を曲げ、ケースの穴からLEDが覗くようにします。しなくても不都合はありませんが、ちゃんとLEDが穴から見れる方がカッコいい。
作業前
IMG_0292
作業後
IMG_0293
2.雑誌に付属していた支柱を取り外し、奥澤ケースに付属の支柱に取り替えます。
左が奥澤ケース付属の台座、右が雑誌付録でついてきた支柱。両方使用します。この2つで基盤を挟み込むようにします。
IMG_0294
取り付けるとこんな感じになります。
IMG_0295
3.ゴム足を取り付ける。
シルバーのビスとゴム足で、ボトムパネルに基盤を固定します。
IMG_0296
IMG_0297
4.ワッシャー付きビスでフロントパネルを取り付けます。
この時点では手で軽く締めるだけにしておきます。
IMG_0298
5.リアパネルを取り付けます。
IMG_0299
ここは2本の黒いねじを使います。
IMG_0300
6.トップパネルを取り付けます。
IMG_0301
7.最後にワッシャー付きビスを締めこんで完成です。
IMG_0304
IMG_0303
IMG_0302
iMacの下に置くとこんな感じになります!
IMG_0305

確定申告におすすめの本(&「やよいの青色申告」はAmazonのほうが1,500円ほど安い!)

ようやく確定申告が終わりました。本日税務署に行って確定申告と納税をすませました。
1年間、青色申告のためにやってきた事をまとめておきたいと思います。
一昨年は白色申告でしたが、簿記の勉強と節税をかね、今年は青色申告にチャレンジしました。何と言っても65万の節税効果は絶大です。
取引量は少ないため、簿記は手書きで行います。手書きは大変ですが簿記の勉強になりますよ。
簿記の本は手元に一冊あると良いです。私はこの本を見ながら勉強しました。
スッキリわかる 日商簿記3級 第5版 [テキスト&問題集] (スッキリわかるシリーズ)

私は簿記3級の本を何冊か読みましたが、この本が一番分かりやすかったです。今回も決算書を作るのに何度も読み返しました。
それから、実際の仕訳については仕訳の本がとても役に立ちました。
最新 知りたいことがパッとわかる勘定科目と仕訳が見つかる本

特に、新規に事業を始める時の仕訳や、事業用の財布から生活にかかわる支払をした時や、カード払いの仕訳などは実際の例も豊富に載っていて重宝しています。
今年はこの仕訳の本が一番活躍したのではないでしょうか。
今回、勉強がてらに帳簿を手書きするといっても、紙に書くのではなく、エクセル管理にしてました。これでも十分大変だし、とても勉強になりました。エクセル帳簿は次の本を参考にしました。
スラスラ読める個人事業の経理―ひとりで学ぶ実務のキホン

この本はCD-ROMにエクセル帳簿がついてきて便利でした。特に固定資産台帳は助かりました。預金出納帳も使いました。預金出納帳はちょっと改良。私の場合、売上をドルで受け取っていたので、レートを入力して円換算出来るようにして使っています。
あとは家事按分などをネットで調べ、なんとか始めての青色申告へこぎづけました。いやほんとに大変でした。でも簿記には(個人事業主の仕訳だけですが)詳しくなりました。これは収穫だったと思います。
もう一つ収穫だったのが、やはり決算をしてみないと、実際にどれだけ儲かっているかは把握できないものだというのを、実感として、リアルな経験として肌で感じる事が出来た事。だいたい把握しているつもりでしたが、思っていた以上に儲かっていなかったり、儲かっていたりするものです。
会社の経理部の人たちをちょっと尊敬。こんな事毎日よくやってるなぁと本心から感心する事が出来ました。
 
さてさて、今回は無事に青色申告できましたが、今年分からはギリギリになってバタバタしないように、ちゃんとソフトを使うぞ!ということで、会計ソフトを導入する事にしました。
購入したのは「やよいの青色申告」。やっぱり、こういうのは定番を知っておくべきだと思うのです。たいした価格の差がないなら、一番売れているものを経験しておくべきだろうということで弥生会計を迷わずチョイスしました。
これからやよいの使い方を覚えて入力していきたいと思います。手作業で記帳・総勘定元帳に転記、決算処理をしていたのと比べてどれだけ便利になるのか!使ってみるのがとても楽しみです。
やよいの青色申告 14 新消費税対応版

私は弥生のオフィシャルストアからダウンロード版を10,500円で購入しましたが、おおおっ!Amazonで購入すれば1,500円は得したのか!失敗したなぁ。Amazon価格をチェックしてから購入すれば良かったです。