Friday, July 25, 2014

AndroidWearのNotificationで若干ハマりました

MediaPlayerのようなServiceで処理をする場合に表示するNotificationは、Serviceが処理が終わるまでシステムに勝手に殺されないようにするためsetOngoing(true)をNotifiationに設定し、且つContextのstartForegroundでNotificationを表示しないといけません。(注:とはいっても、システムによって殺されにくくなるというだけです)




しかし、AndroidWearへNotificationを表示するには、NotificationManagerCompatのnotifyで表示しなければならないし、onGoingを設定しているとAndroidWear側にNotificationが表示されないという仕様になっています。

これを解決するためには、簡単な方法としてはAndroidWear側用のNotificationを別途作成する方法が考えられます。あとはAndroidWear専用アプリを作るという方法もあるけど、今回はパスです。
しかしこうすると、Notificationが2つ表示されてしまうのですが、これはAndroidWear側とMobile側のNotificationをGroup化することで回避できます。
これに気づくに少し時間がかかりました。

Mobile側
Intent actionIntent = new Intent(mMediaPlayerService.getApplicationContext(), MainActivity.class);
            PendingIntent pi = PendingIntent.getActivity(mMediaPlayerService.getApplicationContext(),
                    0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT);

            // Notificationの生成
            NotificationCompat.Builder builder = new NotificationCompat.Builder(
                    mMediaPlayerService.getApplicationContext());
            //ステータスバーアイコン
            builder.setSmallIcon(R.drawable.ic_stat_playing);
            // trueで常に通知領域に表示
            builder.setOngoing(true);
            // 通知領域に初期表示時のメッセージを設定
            if (ticker != null) {
                builder.setTicker(ticker);
            }

            builder.setContentIntent(pi);

            //Group設定
            builder.setGroup(mMediaPlayerService.getString(R.string.app_name));
            builder.setGroupSummary(true);


Wear側
NotificationCompat.Builder wearBuilder = new NotificationCompat.Builder(
                        mMediaPlayerService.getApplicationContext());

                wearBuilder.setSmallIcon(R.drawable.ic_stat_playing);
                wearBuilder.setOngoing(false);

                //Group設定
                wearBuilder.setGroup(mMediaPlayerService.getString(R.string.app_name));
                wearBuilder.setGroupSummary(false);

こんな感じです、あとsetContentIntentしちゃうと、Wear側に端末で開くっていう余計なActionがついてくるので上記サンプルではあえて設定していません。

下記の画像はAndroidWearに追加されたNotificationです。
VolumeUp,VolumeDownは個人的に僕がほしい機能でした。
アイコンはまだ設定していませんが、そのうち。。。
Muteも入れたいと思っています。








No comments:

Post a Comment