Wear OS'te Maps API

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
Giyilebilir cihazdaki harita

Android için Haritalar SDK'sını kullanarak, doğrudan Wear OS by Google cihazlarda çalışan harita tabanlı bir giyilebilir cihaz oluşturabilirsiniz. Uygulamanızın kullanıcıları konumlarını sadece bileklerine bakarak haritada görebilirler. Örneğin, belirli bir rotadaki konumlarını çizebilirler, ardından ayrıntıları görmek için yakınlaştırabilirler veya uygulamanız tarafından sağlanan bilgi penceresini görmek için bir işaretçiye dokunabilirsiniz.

Bu sayfada, giyilebilir bir cihazda mevcut olan API işlevleri açıklanmaktadır ve uygulamanızı oluşturmaya başlamanıza yardımcı olursunuz.

Wear OS'i kullanmaya başlama

Android için Haritalar SDK'sı ile giyilebilir bir uygulama oluşturmak, temel olarak diğer tüm 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 biçimli faktörüne göre tasarımınızdır.

Android Studio; proje kurulumu, kitaplık ekleme ve paketleme kolaylığı sağladığından Wear OS'in geliştirilmesi için önerilen araçtır.

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

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

Bu kısa kılavuzda, Android için Haritalar SDK'sı hakkında bilgi sahibi olduğunuz, Wear OS kılavuzlarını kullanarak uygulamanızda giyilebilir modül oluşturmaya başladığınız ve artık giyilebilir modüle bir harita eklemek istediğiniz varsayılmaktadır.

Wear modülünüz için bağımlılık ekleme

Aşağıdaki bağımlıların, uygulamanızın Wear OS modülünün 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.0.2'

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

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

Başlangıç için arka plan rengini ayarlamak için kaydırarak kapatma hareketini uygulayın.

Haritayı giyilebilir cihazda görüntülemek için SwipeDismissFrameLayout kullanmanız önerilir. SwipeDismissFrameLayout sınıfını kullanarak ekranı karartma hareketini uygulayarak kullanıcıların ekranın en sol kenarından uygulamaya çıkmalarını sağlayabilirsiniz.

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

SwipeDismissFrameLayout ve backgroundColor öğelerini, SupportMapFragment tanımının kapsayıcısı olarak düzen tanımınıza 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 aldığınızda, bir geri çağırma ekleyin ve geri çağırmanın davranışını, aşağıda gösterilen gerekli reddetme işlemini gerçekleştirmek için ayarlayın:

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);
    }

    // ...
}

      

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)
    }

    // ...
}

      

Harita ekleme

GoogleMap nesnesine bir tutma yeri almak için onMapReady(GoogleMap) geri çağırma yöntemini her zamanki gibi kullanın. Harita, kullanıma hazır olduğunda geri çağırma tetiklenir. Geri çağırma yönteminde haritaya işaretçiler veya çoklu çizgiler, dinleyiciler ekleyebilir ya da kamerayı hareket ettirebilirsiniz. Aşağıdaki örnekte, Sidney Opera Binası'nın yakınına bir işaretçi eklenmiştir:

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));
}

      

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))
}

      

Ambiyans modunu etkinleştirme

Android için Haritalar SDK'sı, giyilebilir cihazlarda ambiyans modunu destekler. Ambiyans modunu destekleyen uygulamalar bazen her zaman açık olarak adlandırılır. Ambiyans modu, kullanıcı artık uygulamayı aktif olarak kullanmadığında etkinleştirilir ve uygulamanın giyilebilir cihazda görünmeye devam etmesine izin verilir.

Android için Haritalar SDK'sı, ambiyans modunda kullanılmak üzere haritanın basitleştirilmiş, düşük renkli bir şekilde oluşturulmasını sağlar ve cihaz etkileşimli moddan ambiyans moduna geçildiğinde harita stili otomatik olarak ayarlanır. Ambiyans modunda tüm işaretçiler, nesneler ve kullanıcı arayüzü kontrolleri kaybolur. Bu özellik, uygulamanızın güç tüketimini azaltır ve saat yüzleri gibi diğer ortam uygulamalarıyla tutarlı bir görünüm ve tarz sağlar.

Uygulamanızın haritanın ambiyans modunu kullandığından emin olmak için aşağıdaki adımları uygulayın:

  1. Android SDK'nızı, etkinliklerin ambiyans moduna geçmesine izin veren API'leri sağlayan Android 6.0 (API 23) veya sonraki bir platformu içerecek şekilde güncelleyin. SDK'nızı güncelleme hakkında bilgi edinmek için SDK paketleri ekleme ile ilgili Android dokümanlarına bakın.
  2. Uygulama manifest dosyasında targetSdkVersion değerini 23 veya daha yüksek bir değere ayarlayarak projenizin Android 6.0 veya sonraki bir sürümü hedeflediğinden emin olun.
  3. Giyilebilir cihazları uygulamanızın build.gradle dosyasına ekleyin. Bu sayfadaki örneğe bakın.
  4. Giyilebilir cihaz kitaplığının girişini, giyilebilir cihaz uygulama manifest dosyasına ekleyin. Bunun için uygulamanızın görünür kalmasını sağlama ile ilgili Android eğitim sınıfını inceleyin.
  5. WAKE_LOCK iznini uygulamanızı görünür tutma konusunda Android eğitim sınıfında açıklandığı şekilde elde tutulan ve giyilebilir uygulama manifestlerine ekleyin.
  6. Etkinliğinizin onCreate() yönteminde AmbientModeSupport.attach() yöntemini çağırın. Bu, işletim sistemine uygulamanın her zaman açık olduğunu bildirir. Böylece cihaz kapandıktan sonra saat yüzüne dönmek yerine ambiyans moduna geçmesi gerekir.
  7. Ambiyans modu durumundaki değişiklikleri alabilmek 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) özelliğini ayarlayarak programatik bir şekilde yapabilirsiniz. Bu ayar, API'ye ortam modunda kullanılmak için gerekli harita bloklarını önceden yüklemesi gerektiğini bildirir.
  9. Etkinlik ambiyans moduna geçildiğinde sistem, sağladığınız AmbientCallback içinde onEnterAmbient() yöntemini çağırır. onEnterAmbient() alanını geçersiz kılarak SupportMapFragment.onEnterAmbient(ambientDetails) veya MapView.onEnterAmbient(ambientDetails) numaralı telefonu arayın. API, haritanın etkileşimli olmayan ve düşük renkli bir şekilde oluşturulmasına neden olur.
  10. Benzer şekilde, onExitAmbient() uygulamasında SupportMapFragment.onExitAmbient() veya MapView.onExitAmbient() numaralı telefonu arayın. API, haritanın normal şekilde oluşturulmasına geçiş yapar.

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

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();
            }
        };
    }
}

      

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()
            }
        }
    }
}

      

Uygulama ambiyans modundayken ekranı güncelleyebilirsiniz. İçeriği güncelleme ve genel olarak ambiyans modu hakkında daha ayrıntılı bilgi için uygulamanızı görünür tutma ile ilgili Android eğitim dersine bakın.

Wear OS'te Street View'u kullanma

Street View giyilebilir cihazlarda tam olarak desteklenir.

Street View panoramasını görüntüleyen kullanıcıların uygulamadan çıkmasına izin vermek için StreetViewPanorama.OnStreetViewPanoramaLongClickListener arayüzünü kullanarak uzun tıklama hareketini dinleyin. Bir kullanıcı Street View görüntüsünde bir yeri uzun tıkladığında, onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation) etkinliği alırsınız. Çıkış düğmesi görüntülemek için DismissOverlayView.show() numaralı telefonu arayın.

Örnek kod

GitHub'da uygulamanızın başlangıç noktası olarak kullanabileceğiniz örnek bir uygulama mevcuttur. Ö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, taşınabilir cihazlarda (telefonlar ve tabletler) karşılaştırıldığında giyilebilir cihazlardaki haritalar için desteklenen işlevlerin farklılıkları özetlenmektedir. Aşağıda belirtilmeyen tüm API özellikleri, tam API için belirtildiği şekilde ç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 cihazdaki performansı optimize etmek istiyorsanız basit bir modu tercih edebilirsiniz. Uygulamanızın hareketler veya haritayı kaydırma ve yakınlaştırma gibi etkileşimleri desteklemesi gerekmez.

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

Basit mod ile tamamen etkileşimli mod arasındaki farkların tam listesi için lite modu dokümanlarına bakın.

Harita araç çubuğu Harita araç çubuğu devre dışı durumdadır ve giyilebilir cihazlarda etkinleştirilemez.
Kullanıcı arayüzü kontrolleri Kullanıcı arayüzü kontrolleri giyilebilir cihazlarda varsayılan olarak devre dışıdır. Buna yakınlaştırma, pusula ve konum kontrolleri dahildir. Bunları her zamanki gibi UiSettings sınıfını kullanarak etkinleştirebilirsiniz.
Hareketler Tek dokunuşla jestler beklendiği gibi çalışır. Haritayı kaydırmak için dokunup sürükleyin, uzaklaştırmak için iki kez dokunun ve uzaklaştırmak için iki parmağınızla dokunun. Destek, kullanıcının cihazına bağlı olarak çoklu dokunma hareketleri için farklılık gösterir. Çoklu dokunma hareketlerine örnek olarak haritayı eğmek için iki parmakla basma, 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 bir cihazda varsayılan olarak devre dışıdır. Bunları GoogleMap.setIndoorEnabled(true) numaralı telefonu arayarak etkinleştirebilirsiniz. İç mekan haritaları etkinleştirilirse harita, varsayılan kat düzeyini gösterir. Seviye seçici kullanıcı arayüzü öğesi, giyilebilir cihazlarda desteklenmez.
Karo yer paylaşımları Giyilebilir cihazlarda parça yer paylaşımları desteklenmez.

Wear OS'te Maps API ile uygulama geliştirmeye ilişkin en iyi uygulamalar

Uygulamanızda en iyi kullanıcı deneyimini sağlama:

  • Harita ekranın büyük bir kısmını kaplamalıdır. Bu, giyilebilir bir cihazın küçük form faktöründeki 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üne sahip olduğunu dikkate alın. Ekranın etkin ve görünür olmasını sağlamak pil performansını etkiler.