Outdated Kotlin Runtime

Outdated Kotlin Runtimeワーニングが出ました。Intellij ideaの画面ですが、おそらくAndroid Studioも同じでしょう。

 Your version of Kotlin runtime in 'Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2' library is 1.1.3-2, while plugin version is 1.1.4-release-IJ2017.2-3.
 Runtime library should be updated to avoid compatibility problems.

ここで、Update Runtimeボタンをクリックしてしてみましたが、次のメッセージが表示されるだけです。

Automatic library version update for Gradle projects is currently unsupported. Please update your build.gradle manually

この場合はbuild.gradleファイルを開き、手動でバージョンを上げます。

 ext.kotlin_version = '1.1.3-2'

となっている所を

ext.kotlin_version = '1.1.4-3'

とします。

最新のバージョンはリポジトリページで見つけることができます。

これでOutdated Kotlin Runtimeワーニングが消えるはずです。

参考:
https://stackoverflow.com/questions/43928118/outdated-kotlin-runtime-warning-kotlin-plugin-1-1-2-release-studio2-3-3

Lenovo Phab 2 Pro で Project Tango 入門3

本日はPointCloudのJavaサンプルを見てみましょう。
Android StudioのでInport projectを選択し、java_point_cloud_exampleを選択してOKボタンをクリックします。

ファイル構成は以下のようになっています。

PointCloudActivity.java Javaによる点群表示サンプル。メインアクティビティです。
PointCloudRajawaliRenderer.java 点群データのレンダラーです。
 TouchViewHandler.java  標準的なパン操作とズームタッチ操作の処理を含む、VR設定のトップダウンビューと3人称ビューを追加するヘルパークラスです。
 rajawali/FrustumAxes.java public class FrustumAxes extends Line3D
FrustumとAxesの組み合わせを表すプリミティブ(基本的なもの)。錐台(すいだい、英: Frustum)は、錐体から、頂点を共有し相似に縮小した錐体を取り除いた立体図形の事。
Axesとは軸の事。
 rajawali/Grid.java public class Grid extends Line3D
現在のシーンの「床」を表すRajawaliオブジェクト。
これはシーンに配置された静的グリッドで、さまざまなビューにパースペクティブを提供します。
 rajawali/PointCloud.java public class PointCloud extends Points
色を使用して深度センサまでの距離を示すポイントクラウドをレンダリングします。
着色は光のスペクトルに基づいています。最も近い点は赤色で、最も遠くは紫色です。
rajawali/Points.java public class Points extends Object3D
Rajawaliの点のプリミティブ(基本型)です。

それでは詳しくみていきましょう。

PointCloudActivity

onCreateでは、TangoPointCloudManagerを生成しています。また、PointCloudRajawaliRendererクラス(点群データのレンダラー)のインスタンス生成を行なっています。また、DisplayManagerを取得し、画面の回転方向をmDisplayRotationメンバ変数へ保持しています。
onStartでは、bindTangoServiceメソッド内で、Tangoサービスを通常のAndroidサービスとして初期化します。
onStopでは、OpenGLスレッドまたはUIスレッドで使用されているサービスが切断するまで同期します。Tangoコールバックスレッドでこの同じオブジェクトに対してロックしないでください。すべてのTangoコールバックコールが終了するまで、Tango.disconnectはここでブロックされます。Tangoのコールバックスレッドでこのオブジェクトをロックすると、デッドロックが発生します。
bindTangoServiceではTangoサービスを通常のAndroidサービスとして初期化します。 onPauseでmTango.disconnect()を呼び出すので、これはTango Serviceのバインドを解除するので、onResumeが呼び出されるたびに新しいTangoオブジェクトを作成する必要があります。サービスがOpenGLスレッドまたはUIスレッドで使用されているときに切断に対して同期させます。
setupTangoConfigはbindTangoService内で呼ばれるメソッドで、Tango設定オブジェクトを設定します。 この呼び出しを行う前に、mTangoオブジェクトが初期化されていることを確認してください。これはデフォルトの設定を使用して、さらに深度センサーを追加します。
startupTangoもbindTangoServiceメソッド内で呼ばれるメソッドで、Tangoサービスのコールバックリスナーを設定し、Tango接続後に必要なその他のパラメータを取得します。ポイントクラウドとTangoのイベントとポーズの更新をリッスンします。
setupRendererはonCreate時に呼ばれるメソッドで、Rajawaliサーフェイスビューとそのレンダラーを設定します。 これは、理想的にはonCreateで1回だけ呼び出されます。
setupTangoUxAndLayoutもonCreate時に呼ばれるメソッドでTangoUXの設定とそのリスナーの設定を行います。イベントは、例外条件が観測されたときに「DETECTED」とみなされ、根本原因が解決されたときに「RESOLVED」とみなされます。
画面のFirstボタンを押すとカメラが現在位置に設定されます。いわゆる一人称視点になります。
Thirdボタンを押すとカメラを現在位置に設定し、Z軸に45度回転し、更にカメラをY軸に45度回した位置に固定します。いわゆる第三者視点です。
Topボタンを押すとカメラを現在位置の上部に固定し上からの俯瞰表示にします。これらボタンの処理はTouchViewHandler内で行われます。
画面上には、getAveragedDepthメソッドで計算した平均深度とポイントクラウドの数が表示されています。

PointCloudRajawaliRenderer

ポイントクラウドのデータはXYZC形式で提供されるため、ポイントあたり4つのfloatを示します。
レンダリングされたポイントクラウドを更新します。 このためには、クラウドデータを取得した時点でポイントクラウドデータとデバイスポーズが必要です。
注:これは、OpenGLレンダリングスレッドから呼び出す必要があります。
Rajawaliは左手系を使用するため、共役四元数が必要です。(共役四元数はこちらのサイトの説明がわかりやすい)
現在のデバイスポーズに関する情報を更新します。
注:これは、OpenGLレンダリングスレッドから呼び出す必要があります。
Rajawaliは四元数に対して左手系を使用するため、共役四元数が必要です。

TouchViewHandler

標準的なパン操作とズームタッチ操作の処理を含む、VR設定のトップダウンビューと3人称ビューを追加するヘルパークラスです。
 

実行する

では実行してみましょう。実行すると次の画像のような点群表示が得られます。リアルタイムでかなり高速に点群表示できている事が確認できます。ただ、点群の更新はちょっと遅れるようですね。そんなに応答性が良い感じではありませんが、スマホで使うには申し分ない速度でしょう。

 

 

 

カスタムレイアウトの作成

一覧に戻る
スクリーンサイズと一見性を考慮したデザインという点を除けば、ウェアラブル端末用のレイアウト作成は携帯デバイスと同じです。良いユーザー体験は除きますが、携帯アプリの機能やUIを持ち込むべきではありません。必要な場合のみカスタムレイアウトを作成すべきです。良いウェアラブルアプリのデザイン方法についてはデザインガイドラインを読んでください。

カスタムNotificationを作成する

一般的には、携帯デバイスで通知を作成しそれを自動的にウェアラブル端末に同期するようにします。ひとたび通知を構築すれば、それぞれ異なるフォームファクターのためにデザインを行わなくても、多くの種類のデバイス(ウェアラブル端末だけではくやがてはAutoやTV)に表示されます。
スタンダードな(NotificationCompat.BigTextStyleやNotificationCompat.InboxStyleといった)通知スタイルでは目的に合わない場合、カスタムしたレイアウトのアクティビティを表示することができます。単にカスタム通知を生成しそれをウェアラブル端末に発行します。システムはそれらの通知を携帯端末には同期しません。
注意:ウェアラブルのカスタム通知を生成する場合、サポート・ライブラリの代わりに標準の通知API(API Level20)を使用する事ができます。
カスタム通知を作成するには:
1. レイアウトを作成し表示したいアクティビティのコンテンツビューにセットします。
[java]public void onCreate(Bundle bundle){

setContentView(R.layout.notification_activity);
}[/java]
2.  ウェアラブル端末のコンテキストストリームプロセスにアクティビティの表示を許可するようにアクティビティに必要なプロパティをAndroidマニフェストに定義します。アクテビティをエクスポートを可能に、組み込みを可能に、タスク一体性を空白として定義する必要があります。またテーマをTheme.DeviceDefault.Lightに設定することをおすすめします。例えば次のようにします。
[xml]<activity android:name=”com.example.MyDisplayActivity”
android:exported=”true”
android:allowEmbedded=”true”
android:taskAffinity=””
android:theme=”@android:style/Theme.DeviceDefault.Light” />[/xml]
3. 表示したいアクテビティ用にペンディングインテントを作成します。例えば次のようにします。
[java]Intent notificationIntent = new Intent(this, NotificationActivity.class);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(this, 0, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);[/java]
4. 通知を作成しPendingIntentのsetDisplayIntent()を呼び出します。システムは、このペンディングインテントをユーザが通知を見る時にアクテビティを起動するために使用します。
5. notify()メソッドで通知を発行します。
注意:通知がホームスクリーン上に覗いている時、システムは通知のセマンティックデータから生成し、通常のテンプレートを使用して通知を表示します。このテンプレートは全ウォッチフェイスに適しています。ユーザが通知を上にスワイプした時に通知のカスタムアクティビティが表示されます。

ウェアラブルUIライブラリでレイアウトを作る

Android Studioプロジェクトウィザードでウェアラブルアプリを作った時に自動的にインクルードされる非公式なUIライブラリです。build.gradeファイルに次のように依存関係を宣言してライブラリを追加することもできます。
[text]dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile ‘com.google.android.support:wearable:+’
compile ‘com.google.android.gms:play-services-wearable:+’
}[/text]
これらのライブラリはウェアラブルのために設計されたUIを構築することができます。これらは主要なクラスの一部です。

  • BoxInsetLayout – スクリーン形状を認識して丸型ディスプレイの中央に四角形の子レイアウトとしてボックス化するFrameLayout
  • CardFragment – 拡張範囲内のコンテンツを提示する垂直にスクロール可能なカードのフラグメント
  • CircledImageView – 丸で囲まれた画像
  • ConfirmationActivity – ユーザーがアクションした後に確認のアニメーションを表示するActivity
  • DismissOverlayView -長押しで非表示になるビュー
  • GridViewPager – 水平と垂直にページデータを移動するためのレイアウトマネージャ。ビューが示すページを生成するためにGridPagerAdapterを提供する必要がある
  • GridPagerAdapter – GridViewPagerにページを提供するアダプター
  • FragmentGridPagerAdapter – 各ページをフラグメントにしたGridPagerAdapterの実装。
  • WatchViewStub – デバイスの画面形状に応じて特定のレイアウトをインフレート出来るクラス
  • WearableListView – 小さなウェアラブルデバイスで使いやすいように最適化されたListViewの別バージョン。垂直スクロールのリストを表示し、スクロールを停止した時に自動的に一番近い項目で止まる

上記クラスの完全なAPIリファレンスドキュメントをダウンロードして下さい。このドキュメントはそれぞれのUIウィジェットの使用方法が記載されています。
次:音声機能を追加する>
 

Android Wearエミュレータと実機をUSBデバッグ接続する

ちょっとわかりずらかったのでメモ。
まず、Wearのエミュレータを起動後、Android端末をUSB接続。
adbコマンドを実行
adb -d forward tcp:5601 tcp:5601
Google Playからダウンロード・インストールしたAndroid Wearを起動する。
すでに実機(Gear Live)と接続済みの場合、以下の様な画面になる。
Screenshot_2014-07-16-22-02-20
 
エミュレータと接続するため、「新しいウェアラブルとペア設定」をタップ。
Screenshot_2014-07-16-22-02-27
 
歯車をタップして「エミュレータをペア設定」
Screenshot_2014-07-16-22-02-35
 
以上で、エミュレータと接続完了します。接続すると以下の様な画面になります。
Screenshot_2014-07-16-22-03-09
 
 
 

ウェアラブルアプリケーションの作成と実行

一覧に戻る

Samsun Galaxy Gear Live届きました!

IMG_0428
 
一週間使ってみました。小さなデバイスですし、表示される内容も多くはありません。正直あまり期待してはいなかったのですが、以外にも便利だということがわかりました。まず、重要なメールが着信した時だけ、バイブと共に通知が表示されます。ちらっと腕を見れば誰から来たメールの内容もすぐにわかって、意外に便利です。あと、以外にも歩数計がお気に入りです。初期設定では1万歩が目標に設定されています。歩数がいつでも手元に表示されるので、エスカレータと階段があれば、ついつい階段で歩数を稼ぎたくなっちゃいます。1万歩を達成すると、「目標の歩数に到達しました」とちょっとお祝いしてくれます。心拍数計も今のところ楽しく使っています。正確性はイマイチですが、健康管理としては十分だと思います。普段は60〜70ぐらいで、まあ男性の平均値ぐらいですが、今日わかったのは、人前でスピーチする前は心拍数が100回ぐらいまで上がって、緊張しまくっている自分を再認識。なるほど、緊張すると心拍数はこれくらいまであがるのね、と認識しました。充電は1日しか持たないのが唯一の欠点ですが、スマートフォンを充電台に置くときに同時に充電するようにしているので、そんなに苦には感じません。音声認識は便利ですが、駅のホームや電車の中では当然恥ずかしくて使えないので残念です。雑踏を歩きながら思いついたフレーズや買い物リストをちょっとメモするのにはかなり便利だったりします。入力した内容はGoogle Keepに登録するように設定していますので、あとからスマホやPCで確認できるのもいいですね。
Android Wear、かなり気に入っちゃっています。はやくオリジナルアプリを作りたい!というわけで、今日も翻訳しながら理解を進めていきたいと思います。
 

ウェアラブルアプリケーションの作成と実行

ウェアラブルアプリはウェアラブルデバイス上で直接実行され、ウェアラブル特有であるセンサ、アクティビティ、サービスその他の低レベルハードウェアへアクセスすることができます。
Google Play ストアに公開するなら、ウェアラブルアプリを含んだセットとなる携帯用アプリも必要です。ウェアラブルはGoogle Play ストアに対応していないので、ユーザーがセットとなる携帯アプリをダウンロードすると、自動的にウェアラブルにウェアララブル用アプリが送信されます。携帯向けアプリは重い処理、ネットワーク処理、その他の作業を行ってウェアラブルに結果を送信するのに便利です。
このレッスンでは、デバイスまたはエミュレータを設定し、ウェアラブルと、携帯アプリを含むプロジェクトを作成する方法を身につけます。

Android Wear エミュレータまたはデバイスを設定する

より良いユーザ体験を判断するためには実際のハードウエアで開発することをおすすめします。しかしエミュレータも異なるタイプのスクリーン形状をテストするのに役立ちます。
Android Studio バージョン0.8以降と、Gradle バージョン0.12以降が必要です。
java6以上が必要です。ここからjava7JDKをインストールして(java8は敬遠)、Android Studioをダウンロード、インストールします。

Android Wear仮想デバイスを設定する

Android Wear仮想デバイスの設定方法

  1. Tools > Android > AVD Managerをクリック。
  2. Create…をクリック。
  3. AVDを設定します。その他はデフォルト値のままにしておきます。
    1. AVD NAME – AVD名です
    2. Device – Android Wear の丸型か四角型かを指定します。
    3. Target – Android 4.4W – API Level20
    4. CPU/ABI – Android Wear ARM(armeabi-v7a)
    5. Keybord – Hardware keyboard presentを選択
    6. Skin – Deviceで選んた形状にあわせ、AndroidWearRoundもしくはAndroidWearSquareを選択します。
    7. Snapshot – 選択しません。
    8. Use Host GPU – ウェアラブルの通知でカスタムアクティビティをサポートするためには選択します。
  4. OKをクリック。
  5. エミュレータを起動します。
    1. 作成した仮想デバイスを選択します。
    2. Start…をクリックしてLaunchをクリックします。
    3. エミュレータが初期化されAndroid Wearのホーム画面が表示されるまで待ちます。
  6. 携帯とエミュレータをペアリングします。
    1. 携帯にて、Google Playから「Android Wear」アプリをインストールします。
    2. 携帯とパソコンをUSB接続します。
    3. AVDの接続ポートを接続された携帯デバイスへ向けます。(携帯を接続するたびに行う必要があります)
      adb -d forward tcp:5601 tcp:5601
    4. 携帯でAndroid Wearアプリを起動し、エミュレータに接続します。
    5. Android Wearアプリの右上隅のメニューから「Demo Card」をタップします。
    6. カードを選択するとエミュレータ上のホームスクリーンに通知として表示されます。

Android Wearデバイスの設定

Android Wearデバイスの設定方法

  1. Google Playから提供されるAndroid Wearアプリを携帯にインストールします。
  2. アプリケーションの説明に従い携帯とウェアラブルをペアリングします。これが出来れば、同期した携帯の通知をテストすることが出来ます。
  3. 携帯でAndroid Wearアプリを開いたままにしておききます。
  4. USB経由でパソコンにウェアラブルを接続するため、開発したアプリを直接インストールできます。ウェアラブルとAndoroid Wearaの両方にデバッグ許可の問合せメッセージが表示されます。
  5. Android Wearアプリでは、Always arrow from this computerにチェックを入れ、OKを押します。

Android StudioのAndroid toolウィンドウにウェアラブル端末のシステムログが表示されます。adb devicesコマンを実行した時にウェアラブル端末が表示されるはずです。

プロジェクトの作成

開発を始めるには、ウェアラブルと携帯のアプリケーションモジュールを含んだプロジェクトを作成します。Android Studioで、File>New Projectをクリックし、プロジェクトウィザードの指示に従いプロジェクトを作成します。ウィザードに従い、次の情報を入力します。

  1. Configure your Projectウィンドウで、アプリケーションメイトパッケージ名を入力します。
  2. Form Factorsウィンドウで
    1. Phone and Tabletを選択し、Minimum SDKをAPI8:Android2.2(Froyo)以降に設定します。
    2. Wearを選択し、Minimum SDKをAPI20:Android4.4(KitKat Wear)以降に設定します。
  3. 最初のAdd an Activityウィンドウで携帯端末用の空のActivityを追加します。
  4. 2つ目のAdd an Activityウィンドウで、Wear用の空のActivityを追加します。

ウィザードが完了するとAndroid Studioはプロジェクトに「mobile」と「wear」の2つのモジュールを作成します。これでアクティビティ、サービス、カスタムレイアウトなどを作成するための携帯用とWear用の両方を含むプロジェクトが出来ました。携帯用アプリでは、ネットワーク通信や重い処理や多くのユーザーとのやり取りが必要なタスクを行います。通常それらが完了したなら、ウェアラブル端末に対してノーティフィケーションまたはウェアラブル端末との同期及びデータ送信で通知します。
注意:Wearモジュールには、デバイスのスクリーンが丸型か四角形かによりレイアウトを生成するWatchViewStubを使ったHello Worldアクティビティも含んでいます。WatchViewStubクラスはwearable support libraryで提供されるUI widgetクラスの1つです。

ウェアラブルアプリをインストールする

開発時は携帯用アプリのようにアプリをウェアラブル端末にインストールすることができます。adb installコマンドまたはAndroid StudioのPlayボタンを使います。
アプリを公開する準備ができれば、携帯向けアプリにウェアラブル用アプリを組み込みます。ユーザがGooglePlayから携帯向けアプリをインストールすると、接続されたウェアラブル端末が自動的にウェアラブル用アプリを受信します。
注意:デバッグキーで認証したアプリではウェアラブル用アプリの自動インストールは機能しません。リリースキーのみで機能します。完全なウェアラブル用アプリのパッケージ方法の詳細についてはPackageing Wearable Appsを参照してください。
「Hello World」アプリケーションをウェアラブル端末にインストールするには、Run/Debug configuration ドロップダウンメニューからwearを選択し、Playボタンをクリックします。
アクティビティがウェアラブル端末に現れ、「Hello World!」と表示されます。

適切なライブラリのインクルード

プロジェクトウィザードの一部として、適切な依存関係がbuild.gradleファイルの適切なモジュールとしてインポートされます。それらの依存関係が必要なければ次の記述を読んでそれらが必要かどうか調べます。
通知(ノーティフィケーション)
Android v4 support library(もしくはv13。これにはv4が含まれています)には携帯上で既存の通知を拡張するためのAPIが含まれています。 ウェアラブルのみに表示される通知の場合には、ウェアラブル上の通常のフレームワークAPI(APL Level 20)だけを使い、プロジェクトのmobileモジュールからはサポートライブラリを削除できます。
ウェアラブルデータレイヤー
Wearable Data Layer APIでウェアラブル端末と携帯端末の間でデータを同期または送信する場合、最新バージョンのGoogle Play servicesが必要です。それらのAPIを使わない場合、両方のモジュールから依存関係を削除します。
ウェアラブルUIサポートライブラリ
これは非公式のライブラリで UI widgets designed for wearablesに含まれます。ベストプラクティスが示されているためアプリで使用することを推奨しますが、常に変更され続けます。しかしながらライブラリがアップデートされたとしても、アプリケーション内にコンパイルされているのであなたのアプリが動かなくなるということはありません。アップデートされたライブラリから新機能を使うためには、新しいバージョンに静的リンクし、それに応じてアプリケーションを更新する必要があります。このライブラリはウェアラブルアプリの作成にのみ適用できます。
次のレッスンでは、ウェアラブルのレイアウトデザイン作成だけでなく、プラットフォームでサポートされている様々な音声操作の方法についても学習していきます。
次へ:カスタムレイアウトの作成 >
 

ウェアラブルアプリの作成

一覧に戻る
Moto360も今月末には予約開始だと思われるが、もう待てません。とうとう、Gear Liveポチってしまいました。7/7出荷予定だそうですが、今現在まだ届いてません。
スクリーンショット 2014-07-07 4.50.09
配達状況を見ると「ベース通過」となっています。明日ぐらいには届くと嬉しいなぁ!

荷受       2014/7/4 ヤマト国際物流香港(東日2)	86530
出荷       2014/7/5 ヤマト国際物流香港(東日2)	86530
到着       2014/7/5 羽田小口通関支店	541720
輸入通関   2014/7/5 羽田小口通関支店	541720
国内発送   2014/7/6 国際宅急便サービスセンター	29970
国内発送   2014/7/6 国際宅急便サービスセンター	29970
作業店通過 2014/7/6 羽田クロノゲートベース	32990

さて、Gear Liveが届くまで、Android Wearのサイトを翻訳しながらWear開発について理解を深めていきたいと思います。
ウェアラブルアプリはデバイス上で直接実行され、センサーやGPUといったハードウェアにアクセス可能にします。それらは基本的に、Anroid SDKで他のデバイス向けにビルドされたアプリケーションと同じですが、デザインとユーザビリティと提供される機能の数は大きくことなります。携帯とウェアラブルアプリの主な相違点として次のようなものがあります。

  • システムにはタイムアウト期間が適用されます。アクティビティを表示したままでユーザが何も操作しない場合には、デバイスはスリープ状態になります。スリープから復帰すると、ActivityではなくWearのホームスクリーンが表示されます。もしあなたが何かを常時表示したいのなら、コンテキストストリームに通知を作成すべきです。
  • ウェアラブルアプリは携帯アプリに比べて比較的サイズが小さく機能的に少ない。ウェアラブル向けの機能だけが含まれており、通常それらは携帯アプリ向け機能のサブセット版となっています。一般的には、携帯上で操作を実行し、ウェアラブルには結果を送信するようにすべきです。
  • ユーザーはウェアラブルに直接アプリをダウンロードしなようにします。その代わりに、携帯アプリ内にウェアラブルアプリを同梱してください。システムはユーザが携帯アプリをインストールすると、自動的にウェアラブルアプリをインストールします。しかしながら、開発目的であればウェアラブルデバイスに直接アプリをインストールすることが出来ます。
  • ウェアラブルアプリは多くのAndroid標準APIにアクセス出来ますが、次のAPIはサポートされません。
    • android.webkit
    • android.print
    • android.app.backup
    • android.appwidget
    • android.hardware.usb
      APIを使用する前にhasSystemFeature()を呼べばウェアラブルがその機能をサポートするか調べることが出来ます。

注意:プロジェクトのセットアップ、ライブラリの包含、パッケージングツールなどADTでは提供されない機能を提供するので、Android Wearの開発にはAndroid Studioの使用をおすすめします。 以降このトレーニングではAndroid Studioを使うことを想定しております。
ウェアラブルアプリケーションの作成と実行
ウェアラブル用と携帯用のアプリモジュールの両方を含むAndroid Studioプロジェクトを作成する方法と、アプリをデバイス上やエミュレータ上で実行する方法を学習します。
カスタムレイアウトの作成
通知とアクティビティのカスタムレイアウトの作成と表示方法を学習します。
音声機能の追加
音声アクションでアクティビティを起動する方法と、任意の音声入力をするためにシステムの音声認識を起動する方法を学習します。
ウェアラブルアプリをパッケージ化する
携帯用アプリの中にウェアラブルアプリをパッケージ化する方法について学習します。ユーザーがGooglePlayからインストールすると、システムが自動的にウェアラブルアプリをインストールすることが出来ます。
Bluetooth経由でのデバッグ
USBの代わりにBluetooth経由でウェアラブルをデバッグする方法を学習します。

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 を使用してウェアラブルの通知をさらに強化するには、次の開発者ガイドを参照してください。
通知から音声入力を受け取る
ユーザーからの音声入力を受けとり、変換されたメッセージをアプリケーションへ配信するアクションを追加します。
通知にページを追加する
ユーザーが左にスワイプした時に表示する追加情報ページを追加します。
通知を積み重ねる
スタック内でアプリからの同じような通知が、カードストリームに複数のカードを追加する事なく個々に見る事が出来るように配置します。
さて、本日はここまでとしてまた明日にしましょう。
 

ADT Bundleのかっこいいスプラッシュ画面が表示されなくなった

ADT Bundle かっこ良いスプラッシュ画面でイイね。と思っていたら、いろいろ追加インストールしたら、元の表示に戻ってしまった。

原因は?
eclipse.iniの設定が元に戻ってしまうため。

-showsplash
org.eclipse.platform

となっているところを

-showsplash
com.android.ide.eclipse.adt.package.product

とする。
もし、pleiadesで日本語化してスプラッシュがAndroidの{}のやつじゃなくなった場合は、

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

となっているところを

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=default.splash

とする。これでADT Bundleのスプラッシュ画面に戻ります。
それでもダメなら?
eclipse\configuration\config.iniを開き

eclipse.product=org.eclipse.platform.ide
osgi.splashPath=platform\:/base/plugins/org.eclipse.platform

となっているところを、

eclipse.product=com.android.ide.eclipse.adt.package.product
osgi.splashPath=platform\:/base/plugins/com.android.ide.eclipse.adt.package

と変更すれば大丈夫。