Wear OS의 지도 API

웨어러블 기기의 지도

Android용 Maps SDK를 사용하면 Wear OS by Google 기기에서 바로 실행되는 지도 기반 웨어러블 앱을 만들 수 있습니다. 앱 사용자는 손목을 보는 것만으로도 지도에서 자신의 위치를 확인할 수 있습니다. 예를 들어 사용자의 위치를 경로에 표시한 후 확대하여 세부정보를 확인하거나 마커를 탭하여 앱에서 제공하는 정보 창을 확인할 수도 있습니다.

이 페이지에서는 Wear 기기에서 사용할 수 있는 API 기능을 설명하고 앱 빌드를 시작하는 데 도움이 됩니다.

Wear OS 시작하기

Android용 Maps SDK를 사용하여 웨어러블 앱을 빌드하는 것은 기본적으로 다른 Android 기기용 Google 지도 앱을 빌드하는 것과 같습니다. 차이가 있다면 웨어러블 기기의 폼 팩터가 더 작으므로 앱의 가용성과 성능을 최적화하도록 설계해야 한다는 것입니다.

Android 스튜디오는 Wear OS 개발용으로 권장되는 도구로, 프로젝트 설정, 라이브러리 포함, 패키징 편의성 등을 제공합니다.

웨어러블 앱 설계에 관한 일반적인 도움말은 Wear OS 설계 가이드라인을 참고하세요. 첫 웨어러블 앱을 만드는 데 도움이 필요하다면 웨어러블 앱 만들기 가이드를 참조하세요.

Wear OS에서 첫 번째 지도 앱 빌드

이 빠른 가이드에서는 사용자가 Android용 Maps SDK에 익숙하고 Wear OS 가이드에 따라 앱에서 웨어러블 모듈을 만들었으며 개발자가 웨어러블 모듈에 지도를 추가하고자 한다고 가정합니다.

Wear 모듈의 종속 항목 추가

앱의 Wear OS 모듈의 build.gradle 파일에 다음 종속 항목이 포함되어 있는지 확인합니다.

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.google.android.support:wearable:1.2.0'
  provided 'com.google.android.wearable:wearable:1.0.0'
  compile 'com.google.android.gms:play-services-maps:17.0.1'
}

종속 항목에 관한 자세한 내용은 Wear OS에서 레이아웃 정의하기 가이드를 참고하세요.

사용자가 앱을 종료할 수 있는 대화상자 포함

DismissOverlayView를 사용하여 웨어러블 기기에 지도를 표시하는 것이 좋습니다. DismissOverlayView 클래스를 사용하면 길게 눌러 닫기 UI 패턴을 구현할 수 있으며, 화면을 길게 클릭하여(길게 눌러) 앱을 종료하는 방법을 사용자에게 제공할 수 있습니다. 이 패턴은 Android용 Maps SDK가 웨어러블 앱을 종료할 때 흔히 사용하는 표준 좌우 스와이프 방식보다 우선적으로 적용되기 때문에 권장됩니다. Google 지도 앱에서 스와이프 동작은 지도에서 화면 이동 시 사용됩니다.

레이아웃 정의에 DismissOverlayView 요소를 다음과 같이 추가합니다.

<FrameLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_height="match_parent"
   android:layout_width="match_parent">

  ...

  <android.support.wearable.view.DismissOverlayView
     android:id="@+id/dismiss_overlay"
     android:layout_height="match_parent"
     android:layout_width="match_parent"/>

</FrameLayout>

활동에서 DismissOverlayView 객체를 가져오는 경우 긴 클릭 동작으로 앱을 종료할 수 있음을 사용자에게 알리는 소개 텍스트를 다음과 같이 설정하세요.

public class MainActivity extends WearableActivity
        implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private MapFragment mMapFragment;
    private DismissOverlayView mDismissOverlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.basic_wear_demo);

        mDismissOverlay =
            (DismissOverlayView) findViewById(R.id.dismiss_overlay);
        mDismissOverlay.setIntroText(R.string.basic_wear_long_press_intro);
        mDismissOverlay.showIntroIfNecessary();

        mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mMapFragment.getMapAsync(this);
    }
    ...
}

긴 클릭 동작을 수신 대기하고 DismissOverlayView.show()을(를) 호출하여 종료 버튼을 표시합니다. 이 버튼은 사용자가 클릭하면 활동을 종료합니다.

public void onMapLongClick(LatLng point) {
    mDismissOverlay.show();
}

지도 추가

평소와 같이 onMapReady(GoogleMap) 콜백 메서드를 사용하여 GoogleMap 객체의 핸들을 가져옵니다. 지도를 사용할 준비가 되면 콜백이 트리거됩니다. 콜백 메서드에서 지도에 아이콘 또는 다중선을 추가하거나 리스너를 추가할 수 있으며 카메라를 이동할 수 있습니다. 아래 예시에서는 시드니 오페라 하우스 근처에 마커를 추가합니다.

public class MainActivity extends WearableActivity
        implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private static final LatLng SYDNEY = new LatLng(-33.85704, 151.21522);
    private GoogleMap mMap;

    ...

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        mMap.addMarker(new MarkerOptions().position(SYDNEY)
            .title("Sydney Opera House"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 10));
        mMap.setOnMapLongClickListener(this);
    }
}

대기 모드 사용 설정

Android용 Maps SDK는 웨어러블 앱에 필요한 대기 모드를 지원합니다. 대기 모드를 지원하는 앱을 일컬어 상시 사용 설정 앱이라고도 합니다. 대기 모드는 사용자가 앱을 더 이상 사용하지 않을 때 활성화되며 웨어러블 기기에 앱이 계속 표시되도록 허용합니다.

Android용 Maps SDK는 대기 모드에서 사용할 수 있는 보다 간편한 저색조 렌더링의 지도를 제공하며 지도 스타일은 기기가 대화형 모드에서 대기 모드로 전환될 때 자동으로 조정됩니다. 대기 모드에서는 모든 마커, 객체, UI 컨트롤이 사라집니다. 이렇게 하면 앱의 전력 소모가 줄어들고 시계 모드 등 다른 주변 앱과 동일한 외관 및 느낌을 연출할 수 있습니다.

앱에서 지도의 대기 모드를 사용하려면 다음 단계를 따릅니다.

  1. 활동이 대기 모드로 전환될 수 있게 API를 제공하는 Android 5.1(API 22) 이상의 플랫폼을 포함하도록 Android SDK를 업데이트합니다. SDK를 업데이트하는 방법은 SDK 패키지 추가에 관한 Android 문서를 참고하세요.
  2. 앱 매니페스트에서 targetSdkVersion을 22 이상으로 설정하여 프로젝트 대상을 Android 5.1 이상으로 지정합니다.
  3. 앱의 build.gradle 파일에 웨어러블 종속 항목을 추가합니다. 이 페이지의 샘플을 참고하세요.
  4. 지속적 앱 표시에 관한 Android 교육 클래스에 설명된 대로 웨어러블 공유 라이브러리 항목을 웨어러블 앱 매니페스트에 추가합니다.
  5. 지속적 앱 표시에 관한 Android 교육 클래스에 설명된 대로 WAKE_LOCK 권한을 핸드헬드 및 웨어러블 앱 매니페스트에 추가합니다.
  6. WearableActivity를 확장하는 활동을 생성합니다.
  7. 활동의 onCreate() 메서드에서 setAmbientEnabled() 메서드를 호출합니다. 이 메서드는 애플리케이션이 상시 작동하므로 기기의 전원이 부족하면 시계 모드로 돌아가지 않고 대기 모드로 진입해야 한다고 운영체제에 알립니다.
  8. 지도가 대기 모드를 지원하도록 설정합니다. 활동의 XML 레이아웃 파일에서 map:ambientEnabled="true" 속성을 설정하거나 GoogleMapOptions.ambientEnabled(true)을(를) 설정하여 프로그래밍 방식으로 이 속성을 실행할 수 있습니다. 이 설정은 대기 모드에서 사용할 필수 지도 타일을 미리 로드해야 한다고 API에 알립니다.
  9. 활동이 대기 모드로 전환되면 시스템은 웨어러블 활동에서 onEnterAmbient() 메서드를 호출합니다. onEnterAmbient()을(를) 재정의하고 MapFragment.onEnterAmbient(ambientDetails) 또는 MapView.onEnterAmbient(ambientDetails)을(를) 호출합니다. API는 비대화식 저색조 렌더링의 지도로 전환합니다.
  10. 마찬가지로 onExitAmbient()에서 MapFragment.onExitAmbient() 또는 MapView.onExitAmbient()를 호출합니다. API는 일반 렌더링의 지도로 전환합니다.

다음 코드 샘플은 앱과 지도에서 대기 모드를 활성화합니다.

public class MainActivity extends WearableActivity
        implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {

    private MapFragment mMapFragment;

    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);

        // Enable ambient support, so the map remains visible in a simplified,
        // low-color display when the user is no longer actively using the app
        // and the app is still visible on the watch face.
        setAmbientEnabled();

        // ... Perform other activity setup processes here too ...
    }

    /**
     * Starts ambient mode on the map.
     * The API swaps to a non-interactive and low-color rendering of the map
     * when the user is no longer actively using the app.
     */
    @Override
    public void onEnterAmbient(Bundle ambientDetails) {
        super.onEnterAmbient(ambientDetails);
        mMapFragment.onEnterAmbient(ambientDetails);
    }

    /**
     * Exits ambient mode on the map.
     * The API swaps to the normal rendering of the map when the user starts
     * actively using the app.
     */
    @Override
    public void onExitAmbient() {
        super.onExitAmbient();
        mMapFragment.onExitAmbient();
    }
}

앱이 대기 모드에 있을 때 화면을 업데이트할 수 있습니다. 콘텐츠 업데이트 및 대기 모드에 관한 자세한 내용은 지속적 앱 표시에 관한 Android 교육 클래스를 참조하세요.

Wear OS에서 스트리트 뷰 사용

스트리트 뷰는 웨어러블 기기에서 완전히 지원됩니다.

사용자가 스트리트 뷰 파노라마를 볼 때 앱을 종료할 수 있도록 하려면 StreetViewPanorama.OnStreetViewPanoramaLongClickListener 인터페이스를 사용하여 긴 클릭 동작을 수신 대기합니다. 사용자가 스트리트 뷰 이미지의 한 지점을 길게 클릭하면 onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation) 이벤트가 수신됩니다. 종료 버튼을 표시하려면 DismissOverlayView.show()을(를) 호출합니다.

샘플 코드

샘플 앱은 GitHub에 포함되어 있으며 이를 앱의 시작점으로 사용할 수 있습니다. 샘플에서는 Wear OS에서 기본 Google 지도를 설정하는 방법을 보여줍니다.

Wear OS의 지도 API에서 지원되는 기능

이 섹션에서는 웨어러블 기기에서 지도에 지원되는 기능을 핸드헬드 기기(스마트폰 및 태블릿)와 비교할 때 어떤 차이가 있는지 간략히 설명합니다. 아래 언급되지 않은 모든 API 기능은 전체 API에 대해 기록된 대로 작동합니다.

기능
완전 대화형 모드 및 라이트 모드

Android용 Maps SDK를 완전 대화형 모드 또는 라이트 모드로 사용할 수 있습니다. 웨어러블 기기에서 성능을 최적화하고 앱에서 동작 또는 지도 화면 이동 및 확대/축소와 같은 상호작용을 지원할 필요가 없다면 라이트 모드를 고려하세요.

라이트 모드에서는 사용자가 지도를 탭할 때 Google 지도 모바일 앱을 시작하는 인텐트가 사용 중지되어 있으며 웨어러블 기기에서는 사용 설정할 수 없습니다.

라이트 모드와 완전 대화형 모드 간의 차이점을 열거한 전체 목록은 라이트 모드 문서에서 확인하세요.

지도 툴바 지도 툴바사용 중지되어 있으며 웨어러블 기기에서는 사용 설정할 수 없습니다.
UI 컨트롤 UI 컨트롤은 웨어러블 기기에서 기본적으로 사용 중지되어 있습니다. 여기에는 확대/축소, 나침반, 내 위치 컨트롤이 포함됩니다. 평소와 같이 UiSettings 클래스를 사용하여 사용 설정할 수 있습니다.
동작 원터치 동작이 예상대로 작동합니다. 예를 들어, 터치 및 드래그하여 지도 화면 이동, 두 번 탭하여 확대, 두 손가락으로 탭하여 축소 등이 있습니다. 멀티터치 동작 지원은 사용자의 기기에 따라 다릅니다. 멀티터치 동작의 예에는 두 손가락을 밀어서 지도를 기울이거나 손가락을 모아서 확대/축소하기, 두 손가락 회전 등이 포함됩니다.
실내 지도 및 건물 실내 지도는 웨어러블 기기에서 기본적으로 사용 중지되어 있습니다. 이는 GoogleMap.setIndoorEnabled(true)을(를) 호출하여 사용 설정할 수 있습니다. 실내 지도가 사용 설정되어 있다면 지도에 기본 층 수가 표시됩니다. 수준 선택도구 UI 요소는 웨어러블 기기에서 지원되지 않습니다.
타일 오버레이 웨어러블 기기에서 타일 오버레이지원되지 않습니다.

Wear OS에서 Maps API를 사용한 개발 권장사항

앱에서 최고의 사용자 경험을 제공하는 방법:

  • 지도는 화면에서 많은 부분을 차지합니다. 이는 웨어러블 기기의 작은 폼 팩터에서 지도의 사용성을 최적화하는 데 필요합니다.
  • 앱의 사용자 환경을 설계할 때에는 웨어러블 기기의 배터리 전원이 부족하다는 점을 고려해야 합니다. 화면이 활성화된 상태에서 지도 계속 표시하면 배터리 성능에 영향을 미칩니다.