Wear OS'te Maps API

Giyilebilir cihazdaki bir harita

Android için Haritalar SDK'sını kullanarak doğrudan Wear OS by Google cihazlarında çalışan harita tabanlı bir giyilebilir uygulama oluşturabilirsiniz. Uygulamanızın kullanıcıları bileklerine bakarak konumlarını haritada görebilirler. Örneğin, rota üzerinde konumlarını çizebilir, daha sonra ayrıntıları görmek için yakınlaştırabilir veya bir işaretçiye dokunarak uygulamanız tarafından sunulan bilgi penceresini görebilirler.

Bu sayfada, Wear cihazlarda kullanılabilen API işlevi açıklanmaktadır ve uygulamanızı oluşturmaya başlamanıza yardımcı olur.

Wear OS'i kullanmaya başlama

Android için Haritalar SDK'sı ile giyilebilir bir uygulama geliştirmek, temelde diğer Android cihazlar için Google Haritalar uygulaması oluşturmakla aynıdır. Aradaki fark, uygulamanın kullanılabilirliğini ve performansını optimize etmek için giyilebilir cihazın daha küçük form faktörüne yönelik tasarımınızdır.

Android Studio proje kurulumu, kitaplığa dahil etme ve paketleme kolaylığı sağladığından Wear OS geliştirme için önerilen araçtır.

Giyilebilir cihaz uygulaması tasarlamayla ilgili genel yardım için Wear OS tasarım yönergelerine bakın. İlk giyilebilir uygulamanızı oluşturmayla ilgili yardım almak için giyilebilir uygulama oluşturma kılavuzuna bakın.

Wear OS'te ilk harita uygulamanızı oluşturma

Bu hızlı kılavuzda, Android için Haritalar SDK'sı hakkında bilgi sahibi olduğunuz, uygulamanızda giyilebilir cihaz modülü oluşturmak için Wear OS kılavuzlarına uyduğunuz ve artık giyilebilir cihaz modülüne harita eklemek istediğiniz varsayılmaktadır.

Wear modülünüze bağımlılık ekleme

Aşağıdaki bağımlılıkların, uygulamanızın Wear OS modülündeki build.gradle dosyasına eklendiğinden emin olun:

dependencies {
    // ...
    compileOnly 'com.google.android.wearable:wearable:2.9.0'
    implementation 'com.google.android.support:wearable:2.9.0'
    implementation 'com.google.android.gms:play-services-maps:18.2.0'

    // This dependency is necessary for ambient mode
    implementation 'androidx.wear:wear:1.3.0'
}

Bağımlılıklar hakkında daha fazla bilgi için Mevcut projenize Wear OS modülü ekleme kılavuzuna bakın.

Kapatmak için hızlıca kaydırma hareketi uygulama ve başlangıç arka plan rengini ayarlama

Haritayı giyilebilir cihazda görüntülemek için SwipeDismissFrameLayout kullanmanız önerilir. SwipeDismissFrameLayout sınıfını kullanarak, kullanıcılara ekranın en sol kenarından hızlıca kaydırarak uygulamadan çıkmaları için bir yol sağlayan hızlıca kaydırma hareketini uygulayabilirsiniz.

Özel bir başlangıç arka plan rengi ayarlamak için, gerçek harita parçaları yüklenene kadar görüntülenecek rengi tanımlamak üzere map:backgroundColor XML özelliğini kullanın.

Düzen tanımınıza SupportMapFragment kapsayıcısı olarak SwipeDismissFrameLayout ve backgroundColor öğelerini ekleyin:

  <androidx.wear.widget.SwipeDismissFrameLayout
      android:id="@+id/map_container"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        map:backgroundColor="#fff0b2dd" />
  </androidx.wear.widget.SwipeDismissFrameLayout>

Etkinliğinizde SwipeDismissFrameLayout nesnesini elde ettiğinizde, bir geri çağırma ekleyin ve aşağıda gösterildiği gibi gerekli kapatma işlemini gerçekleştirmek için geri çağırma davranışını belirleyin:

Kotlin



class MainActivity : AppCompatActivity(), OnMapReadyCallback,
                     AmbientModeSupport.AmbientCallbackProvider {


    public override fun onCreate(savedState: Bundle?) {
        super.onCreate(savedState)

        // Set the layout. It only contains a SupportMapFragment and a DismissOverlay.
        setContentView(R.layout.activity_main)

        // Enable ambient support, so the map remains visible in simplified, low-color display
        // when the user is no longer actively using the app but the app is still visible on the
        // watch face.
        val controller = AmbientModeSupport.attach(this)
        Log.d(MainActivity::class.java.simpleName, "Is ambient enabled: " + controller.isAmbient)

        // Retrieve the containers for the root of the layout and the map. Margins will need to be
        // set on them to account for the system window insets.
        val mapFrameLayout = findViewById<SwipeDismissFrameLayout>(R.id.map_container)
        mapFrameLayout.addCallback(object : SwipeDismissFrameLayout.Callback() {
            override fun onDismissed(layout: SwipeDismissFrameLayout) {
                onBackPressed()
            }
        })

        // Obtain the MapFragment and set the async listener to be notified when the map is ready.
        mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }

    // ...
}

      

Java


public class MainActivity extends AppCompatActivity implements OnMapReadyCallback,
    AmbientModeSupport.AmbientCallbackProvider {


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

        // Set the layout. It only contains a SupportMapFragment and a DismissOverlay.
        setContentView(R.layout.activity_main);

        // Enable ambient support, so the map remains visible in simplified, low-color display
        // when the user is no longer actively using the app but the app is still visible on the
        // watch face.
        AmbientModeSupport.AmbientController controller = AmbientModeSupport.attach(this);
        Log.d(MainActivity.class.getSimpleName(), "Is ambient enabled: " + controller.isAmbient());

        // Retrieve the containers for the root of the layout and the map. Margins will need to be
        // set on them to account for the system window insets.
        final SwipeDismissFrameLayout mapFrameLayout = (SwipeDismissFrameLayout) findViewById(
            R.id.map_container);
        mapFrameLayout.addCallback(new SwipeDismissFrameLayout.Callback() {
            @Override
            public void onDismissed(SwipeDismissFrameLayout layout) {
                onBackPressed();
            }
        });

        // Obtain the MapFragment and set the async listener to be notified when the map is ready.
        mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    // ...
}

      

Harita ekleme

GoogleMap nesnesini herkese açık kullanıcı adı olarak belirlemek için her zamanki gibi onMapReady(GoogleMap) geri çağırma yöntemini kullanın. Geri çağırma, harita kullanıma hazır olduğunda tetiklenir. Geri çağırma yönteminde, haritaya işaretçiler veya çoklu çizgiler ekleyebilir, dinleyiciler ekleyebilir ya da kamerayı hareket ettirebilirsiniz. Aşağıdaki örnekte Sidney Opera Binası'nın yanına bir işaretçi eklenmiş:

Kotlin



private val sydney = LatLng(-33.85704, 151.21522)

override fun onMapReady(googleMap: GoogleMap) {
    // Add a marker with a title that is shown in its info window.
    googleMap.addMarker(
        MarkerOptions().position(sydney)
            .title("Sydney Opera House")
    )

    // Move the camera to show the marker.
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 10f))
}

      

Java


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

@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
    // Add a marker with a title that is shown in its info window.
    googleMap.addMarker(new MarkerOptions().position(SYDNEY)
        .title("Sydney Opera House"));

    // Move the camera to show the marker.
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 10));
}

      

Ambiyans modunu etkinleştirme

Android için Haritalar SDK'sı, giyilebilir uygulamalar için ambiyans modunu destekler. Ambiyans modunu destekleyen uygulamalar bazen her zaman açık uygulamalar olarak da adlandırılır. Kullanıcı artık uygulamayı aktif olarak kullanmıyorsa ambiyans modu etkinleştirilir ve uygulamanın giyilebilir cihazda görünür durumda kalmasına izin verilir.

Android için Haritalar SDK'sı, haritanın ambiyans modunda kullanılmak üzere basitleştirilmiş ve yalın bir renkle oluşturulmasını sağlar. Cihaz etkileşimliden ambiyans moduna geçtiğinde harita stili otomatik olarak ayarlanır. Ambiyans modunda tüm işaretçiler, nesneler ve kullanıcı arayüzü kontrolleri kaybolur. Bu, uygulamanızın güç tüketimini azaltır ve kadran gibi diğer ortam uygulamalarıyla tutarlı bir görünüm ve tarz sağlar.

Uygulamanızın, haritanın ambiyans modunu kullanmasını sağlamak için aşağıdaki adımları uygulayın:

  1. Android SDK'nızı, etkinliklerin ambiyans moduna girmesine izin veren API'ler sağlayan Android 6.0 (API 23) veya sonraki bir platformu içerecek şekilde güncelleyin. SDK'nızı nasıl güncelleyeceğiniz hakkında bilgi edinmek için SDK paketleri ekleme hakkındaki Android dokümanlarına bakın.
  2. Uygulama manifesti'nde targetSdkVersion değerini 23 veya sonraki bir sürüme ayarlayarak projenizin Android 6.0 veya sonraki sürümleri hedeflediğinden emin olun.
  3. Giyilebilir cihaz bağımlılıklarını, uygulamanızın build.gradle dosyasına ekleyin. Bu sayfadaki örneğe bakın.
  4. Giyilebilir cihaz paylaşılan kitaplık girişini, uygulamanızı görünür tutma ile ilgili Android eğitim sınıfında açıklandığı şekilde giyilebilir cihaz uygulama manifestine ekleyin.
  5. Uygulamanızı görünür tutma ile ilgili Android eğitim sınıfında açıklandığı şekilde, avuç içi ve giyilebilir uygulama manifest'lerine WAKE_LOCK iznini ekleyin.
  6. Etkinliğinizin onCreate() yönteminde AmbientModeSupport.attach() yöntemini çağırın. Bu şekilde, işletim sistemine uygulamanın her zaman açık olduğu bildirilir. Böylece cihaz kapatıldığında saat yüzüne dönmek yerine ambiyans moduna girmesi gerekir.
  7. Ambiyans modu durum değişikliklerini alabilmesi için Etkinliğinize AmbientModeSupport.AmbientCallbackProvider arayüzünü uygulayın.
  8. Haritanızı, ambiyans modunu destekleyecek şekilde ayarlayın. Bunu, etkinliğin XML düzen dosyasında map:ambientEnabled="true" özelliğini ayarlayarak veya GoogleMapOptions.ambientEnabled(true) ayarlayarak programatik bir şekilde yapabilirsiniz. Bu ayar, API'ye ambiyans modunda kullanım için gerekli harita bloklarını önceden yüklemesi gerektiğini bildirir.
  9. Etkinlik ambiyans moduna geçtiğinde sistem, sağladığınız AmbientCallback öğesinde onEnterAmbient() yöntemini çağırır. onEnterAmbient() değerini geçersiz kılın ve SupportMapFragment.onEnterAmbient(ambientDetails) veya MapView.onEnterAmbient(ambientDetails) numaralı telefonu arayın. API'nin yerini, haritayı etkileşimsiz ve düşük renkli olarak oluşturabilirsiniz.
  10. Benzer şekilde, onExitAmbient() görüşmesinde SupportMapFragment.onExitAmbient() veya MapView.onExitAmbient() araması yapın. API, haritanın normal şekilde oluşturulmasına geçer.

Aşağıdaki kod örneği, etkinlikte ambiyans modunu etkinleştirir:

Kotlin



class AmbientActivity : AppCompatActivity(), AmbientModeSupport.AmbientCallbackProvider {

    private lateinit var mapFragment: SupportMapFragment

    public override fun onCreate(savedState: Bundle?) {
        super.onCreate(savedState)

        // Set the layout. It only contains a SupportMapFragment and a DismissOverlay.
        setContentView(R.layout.activity_main)

        // Enable ambient support, so the map remains visible in simplified, low-color display
        // when the user is no longer actively using the app but the app is still visible on the
        // watch face.
        val controller = AmbientModeSupport.attach(this)
        Log.d(AmbientActivity::class.java.simpleName, "Is ambient enabled: " + controller.isAmbient)

        // Obtain the MapFragment and set the async listener to be notified when the map is ready.
        mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
    }

    override fun getAmbientCallback(): AmbientModeSupport.AmbientCallback {
        return object : AmbientModeSupport.AmbientCallback() {
            /**
             * 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 fun onEnterAmbient(ambientDetails: Bundle) {
                super.onEnterAmbient(ambientDetails)
                mapFragment.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 fun onExitAmbient() {
                super.onExitAmbient()
                mapFragment.onExitAmbient()
            }
        }
    }
}

      

Java


public class AmbientActivity extends AppCompatActivity implements
    AmbientModeSupport.AmbientCallbackProvider {

    private SupportMapFragment mapFragment;

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

        // Set the layout. It only contains a SupportMapFragment and a DismissOverlay.
        setContentView(R.layout.activity_main);

        // Enable ambient support, so the map remains visible in simplified, low-color display
        // when the user is no longer actively using the app but the app is still visible on the
        // watch face.
        AmbientModeSupport.AmbientController controller = AmbientModeSupport.attach(this);
        Log.d(AmbientActivity.class.getSimpleName(), "Is ambient enabled: " + controller.isAmbient());

        // Obtain the MapFragment and set the async listener to be notified when the map is ready.
        mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    }

    @Override
    public AmbientCallback getAmbientCallback() {
        return new AmbientCallback() {
            /**
             * 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);
                mapFragment.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();
                mapFragment.onExitAmbient();
            }
        };
    }
}

      

Uygulama ambiyans modundayken ekranı güncelleyebilirsiniz. İçerik güncelleme ve genel olarak ambiyans modu hakkında daha fazla bilgi edinmek için uygulamanızı görünür tutma ile ilgili Android eğitim sınıfına göz atın.

Street View'ı Wear OS'te kullanma

Street View giyilebilir cihazlarda tam olarak desteklenir.

Kullanıcıların bir Street View panoramasını görüntülerken uygulamadan çıkmasına izin vermek için uzun tıklama hareketini dinlemek üzere StreetViewPanorama.OnStreetViewPanoramaLongClickListener arayüzünü kullanın. Kullanıcı Street View resminde herhangi bir yeri uzunca tıkladığında bir onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation) etkinliği alırsınız. Bir çıkış düğmesi görüntülemek için DismissOverlayView.show() komutunu çağırın.

Örnek kod

Uygulamanız için başlangıç noktası olarak kullanabileceğiniz örnek bir uygulama GitHub'da mevcut. Örnekte, Wear OS'te temel bir Google Haritasının nasıl kurulacağı gösterilmektedir.

Wear OS'teki Maps API'de desteklenen işlevler

Bu bölümde, el cihazlarıyla (telefonlar ve tabletler) karşılaştırıldığında giyilebilir cihazlarda haritalar için desteklenen işlevlerdeki farklılıklar açıklanmaktadır. Aşağıda belirtilmeyen tüm API özellikleri, tam API için belgelendiği gibi çalışmalıdır.

İşlevler
Tamamen etkileşimli mod ve basit mod

Android için Haritalar SDK'sını tamamen etkileşimli modda veya basit modda kullanabilirsiniz. Giyilebilir cihazda performansı optimize etmek istiyorsanız ve uygulamanızın hareketler veya haritayı kaydırma ve yakınlaştırma gibi etkileşimleri desteklemesi gerekmiyorsa basit modu tercih edebilirsiniz.

Basit modda, kullanıcı haritaya dokunduğunda Google Haritalar mobil uygulamasını başlatma niyeti devre dışıdır ve giyilebilir bir cihazda etkinleştirilemez.

Basit mod ile tam etkileşimli mod arasındaki farklılıkların tam listesi için basit mod dokümanlarına bakın.

Harita araç çubuğu Harita araç çubuğu devre dışıdır ve giyilebilir cihazlarda etkinleştirilemez.
Kullanıcı arayüzü kontrolleri Giyilebilir cihazlarda kullanıcı arayüzü kontrolleri varsayılan olarak devre dışıdır. Buna yakınlaştırma, pusula ve konum denetimlerim de dahildir. Bunları, her zamanki gibi UiSettings sınıfını kullanarak etkinleştirebilirsiniz.
Hareketler Tek dokunuşla hareketler beklendiği gibi çalışır. Örnek olarak, haritayı kaydırmak için dokunup sürükleme, yakınlaştırmak için iki kez dokunma ve uzaklaştırmak için iki parmakla dokunma verilebilir. Çoklu dokunma hareketleri için destek, kullanıcının cihazına bağlı olarak değişir. Çok dokunmalı hareketlere örnek olarak haritayı yatırmak için iki parmakla itme, yakınlaştırmak için sıkıştırma ve iki parmakla döndürme yer alır.
İç mekan haritaları ve binaları İç mekan haritaları giyilebilir cihazlarda varsayılan olarak devre dışıdır. Bunları GoogleMap.setIndoorEnabled(true) numaralı telefonu arayarak etkinleştirebilirsiniz. İç mekan haritaları etkinse haritada varsayılan kat düzeyi gösterilir. Seviye seçici kullanıcı arayüzü öğesi, giyilebilir cihazlarda desteklenmez.
Yer paylaşımlı karo Kart yer paylaşımları, giyilebilir cihazlarda desteklenmez.

Wear OS'te Maps API ile uygulama geliştirmeyle ilgili en iyi uygulamalar

Uygulamanızda en iyi kullanıcı deneyimini sunma:

  • Harita, ekranın büyük bir kısmını kaplamalıdır. Bu, giyilebilir bir cihazın küçük form faktörüyle haritanın kullanılabilirliğini optimize etmek için gereklidir.
  • Uygulamanızın kullanıcı deneyimini tasarlarken giyilebilir bir cihazın düşük pil gücünü göz önünde bulundurun. Ekranın etkin ve haritanın görünür olması pil performansını etkiler.