Creating Android Wear WatchFace

요즘 애플워치 출시에 따른 웨어러블 워치에 대한 관심이 부쩍 늘었다. 애플워치가 공개되기 이전부터 안드로이드 진영에서는 안드로이드 웨어를 출시하여, 다양한 안드로이드 워치 제조사가 해당 플랫폼을 탑재하도록 노력하고 있으며, 현재 구글 플레이에는 다양한 디자인과 기능의 WatchFace가 공개되어있다. 또한 유료로 공개되어 있는 많은 WatchFace 중에 몇몇은 많은 사용자의 구매가 이어지고 있다. 필자는 새로운 WatchFace — WatchLover을 개발하면서 경험한 지식과 팁을 공유하고자 한다.

작년 여름에 구글 코드랩에 참가하여 안드로이드 웨어 및 안드로이드 TV 등을 경험해볼 기회가 있었는데, 이 시기의 안드로이드 웨어의 주 특징은 Notification에 있었다. 모바일의 Notification을 확장하여 웨어러블에서도 응답을 받고 메시지를 전달할 수 있는 기능에 초점이 맞춰있었는데, 현재는 두가지 유형을 추가로 지원하여 총 세가지의 주요 특징을 지닌다고 정리할 수 있다.

  1. Notification
  2. Wearable App
  3. WatchFace

이 중에서 이 글에서 다룰 세번째 WatchFace는 시계의 배경테마에 해당하는 부분으로 평상시에 사용자가 자주 보게될 화면을 구성하고 새로운 기능을 개발할 수 있는 API가 공개되어 있기에 주목할 만한 부분이다.

이에 대한 자세한 설명은 http://developer.android.com/training/wearables/watch-faces/index.html

에서 확인할 수 있으며, 이를 개발하기 위한 IDE는 안드로이드 스튜디오가 필수다.

  • Planning

웨어러블과 관련한 여러 기획 중에 많은 실험과 구상을 했던 아이디어는 커플들을 위한 전용 시계였다. 애인의 사진을 폰의 배경화면에 띄워놓는것처럼, 워치의 배경에 애인의 사진을 넣고 다양하고 소소한 기능을 첨가하는 것이 초기 아이디어의 기반이었다. 이제는 연인 사이에 연락이 뜸할 수록 사랑이 식는다는 지론에 기반하여, 연락을 안할 수록 워치에 있는 연인의 사진을 점점 흐려지게 만드는 것으로 발전했다. 이밖에 여러 아이디어를 모색해보는 과정에서 개발상으로 가능한 부분을 판단하기 위해 안드로이드가 제공하는 샘플을 분석하는 과정을 거쳐야했는데, 다양한 워치의 개별적인 하드웨어 지원 요소도 고려해봐야할 요소였다. 가령, G-Watch R의 경우, 심박센서가 포함되었지만, 네모난 G-Watch는 빠져있다.

작년 12월 경, WatchFace API를 공개하면서, 이에 대한 샘플을 확인할 수 있었다.

http://developer.android.com/samples/WatchFace/index.html

WatchLover(이 아이디어의 앱 이름)는 이를 기반으로 구현을 시작할 수 있었다.

개발을 위한 기획은 이렇다.

- 자신의 애인사진을 시계 테마로 지정할 수 있는 기능.

- 연락 히스토리를 기반으로, 연락한 시점 부터 사진이 점점 흐려지는 기능.

- 연락 안한 시점이 하루를 넘길 경우, Notification 발생.

  • Analyzing

안드로이드 웨어 개발 시의 특징적인 부분을 살펴보자면, 먼저 모바일과 웨어러블과의 데이터를 교환하기 위해 GMS(Google Mobile Services)를 이용하게 되는데, 먼저, Google API Client 를 connect하여, 모바일과 웨어러블 간의 데이터를 통신할 수 있는 데이터 레이어를 열고, 메시지나 이미지 같은 Asset을 통신할 수 있게된다.

사용자가 연락처를 등록하고 사진을 탑재하는 기능은 ConfigActivity로 manifest에서 따로 설정을 해줘야되는데, 이는 안드로이드 웨어 앱의 해당 WatchFace를 탭하면 보여지는 Config 에 보여지게 된다. 즉, 크게는 모바일의 ConfigActivity(메인 액티비티가 아닌-companionConfigurationAction)와 WatchFace가 보여지게될 웨어러블의 백그라운드 Service로 이루어지는 것이다. 이 자체가 앱으로 패키징 될 수 있다는 점은 기존 메인액티비티 앱개발에 익숙한 사람에게 조금 혼란스러운 부분일 수도 있다.

  • Developing

해당 액티비티에 들어서면 백그라운드 서비스가 실행이 되는데, 이 서비스에서는 주기적으로 브로드캐스트 리시버로 periodic한 task를 실행한다. 이는 주기적으로 한시간마다 폰의 연락 히스토리 정보를 가져와서 마지막 전화 시간에서 얼마나 시간이 지났는지를 측정하여 블러값, 상태값을 웨어러블로 메시지 전송하는 역할을 담당한다.

사용자가 연인의 연락처를 등록하고 사진을 변경하는 작업을 할 시에, 해당 연락처, 사진(path) 정보는 sharedPreference를 이용하여 모바일 내부에 저장. 서비스 재 시작시, 웨어러블과 정보를 동기화하게 된다.

여기서, 사진을 모바일에서 웨어러블로 전송하는 코드를 살펴보면,

Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest request = PutDataMapRequest.create(Constants.PATH_WITH_IMAGE);
DataMap map = request.getDataMap();
map.putLong(“time”, new Date().getTime());
map.putAsset(“image”, asset);
Wearable.DataApi.putDataItem(mGoogleApiClient, request.asPutDataRequest());

이와 같이, DataMap에 해당 Asset을 싸서 전송한다.

웨어러블 측에서는, onDataChanged() 함수에서 전달된 asset 파일을 받아서 처리한다.

DataMapItem dataMapItem = DataMapItem.fromDataItem(dataItem);
Asset asset = dataMapItem.getDataMap().getAsset(“testImage”);
Bitmap bitmap = loadBitmapFromAsset(asset);
mBasedBitmap = bitmap;

현재, 구글 공식 레퍼런스에 올려져 있는 코드 가이드에서는 PutDataMapRequest의 putAsset으로 바로 해당 파일을 전달하는데, 내 경우에는 작동이 잘되지 않았다.

Asset이 아닌 블러값, 상태값을 통신하는 부분은 모바일에서 Wearable.MessageApi를 통해 메시지를 전달하며, 이는 웨어러블에서 WearableListenerService 를 상속받은 클래스의 onMessageReceived(MessageEvent messageEvent) 함수에서 해당 정보를 받는다. 이 값을 가지고 비트맵을 변환하는 것이다.

웨어러블 단의 WatchFace 개발상의 특징적인 부분 중 하나는, 워치의 배터리를 절약하기 위해, onVisibilityChanged(boolean visible) 함수에서 화면 상태에 따라 디스플레이 및 정보를 동기화하거나 프로세스를 처리해주는 것이다. 사실, 시계침과 같이 매초마다 뷰를 렌더링하는 부분은 화면이 점등될 경우, 작동을 분기하는 것이 맞다.

테스트 시, Square Watch와 Round Watch 모두 고려해야 한다는 점도 잊지 말자.

  • Packaging

모바일과 웨어러블 디버그 빌드 테스트를 위해서, 번갈아 mobile, wear를 스위칭하여 빌드해야한다. 한번에 빌드 반영되는 방법이 있었으면 싶다. 이 빌드가 완료된 후, 자동으로 웨어나 모바일에 변경사항이 반영되게 된다. 모바일의 configActivity 테스트를 위해 직접 웨어 config에 들어가 테스트를 해야하는 번거로움을 피하기 위해, 메인 액티비티로 테스트 후, 연동하는 방식이 선호된다.

모바일과 웨어러블의 패키지명은 동일해야하고, 패키징 시 빌드를 관장하는 파일인 build.gradle의 설정 항목에서 wearApp Project(:wear) 옵션을 설정해줘야 웨어러블 앱으로 연동이 된다. 이 항목이 기입되어 릴리즈 빌드가 되야지만 모바일-release apk가 wear apk를 포함한 형태로 나온다. 그밖에 패키징 시의 다른 낯선 점은 없었다.

http://developer.android.com/training/wearables/apps/packaging.html

이렇게 릴리즈된 apk를 구글플레이에 업로드할 경우, 구글 플레이 측에서 해당 앱에 대한 리뷰 및 피드백을 제공한다. 더불어 메일로 친절하게 연락이 온다. http://developer.android.com/distribute/essentials/quality/wear.html

특히, 이 페이지의 해당 디자인 가이드라인을 지켰는지 검수를 의무화한다.

  • WatchLover

https://play.google.com/store/apps/details?id=bpsound.watchlover

현재, 많은 수의 WatchFace가 구글플레이에 공개되어 있고, 필자가 만든 것은 그것들과 비교할 때 디자인적으로 차이가 많이 난다. 그럼에도 이 정보를 공유하는 것은 앞으로의 웨어러블 시장에 대한 기대와 새로운 것을 만드는 즐거움을 알리기 위함이다. 또한, 추후에 오픈소스로 공개할 예정이다.

Show your support

Clapping shows how much you appreciated Will Park’s story.