Wear OS पर Maps API

पहने जाने वाले डिवाइस पर मैप

Android के लिए Maps SDK टूल का इस्तेमाल करके, पहने जाने वाले डिवाइस के लिए मैप बनाया जा सकता है. यह ऐप्लिकेशन सीधे Google के Wear OS डिवाइसों पर चलता है. आपके ऐप्लिकेशन के उपयोगकर्ता, मैप पर अपनी जगह की जानकारी सिर्फ़ अपनी कलाई पर एक नज़र में देखकर देख सकते हैं. उदाहरण के लिए, वे किसी रास्ते पर अपनी जगह दिखा सकते हैं, फिर जानकारी देखने के लिए ज़ूम इन कर सकते हैं या आपके ऐप्लिकेशन से मिली जानकारी विंडो देखने के लिए किसी मार्कर पर टैप कर सकते हैं.

इस पेज पर, Wear डिवाइस पर मौजूद एपीआई के काम करने के तरीके की जानकारी दी गई है. साथ ही, इस पेज पर आपको ऐप्लिकेशन बनाने का तरीका भी बताया गया है.

Wear OS पर इसका इस्तेमाल शुरू करना

Android के लिए Maps SDK टूल की मदद से पहने जाने वाला ऐप्लिकेशन बनाना, किसी भी दूसरे Android डिवाइस के लिए Google Maps ऐप्लिकेशन बनाने जैसा ही है. अंतर सिर्फ़ पहने जाने वाले डिवाइस के छोटे आकार के डिज़ाइन में होता है, ताकि ऐप्लिकेशन की उपयोगिता और परफ़ॉर्मेंस को ऑप्टिमाइज़ किया जा सके.

Android Studio, Wear OS को बेहतर बनाने के लिए सुझाया गया टूल है. यह प्रोजेक्ट सेटअप करने, लाइब्रेरी में शामिल करने, और पैकेजिंग से जुड़ी सुविधाएं उपलब्ध कराता है.

पहने जाने वाले डिवाइस को डिज़ाइन करने में मदद पाने के लिए, Wear OS डिज़ाइन से जुड़े दिशा-निर्देश देखें. पहने जाने वाले डिवाइस के लिए, अपना पहला ऐप्लिकेशन बनाने में मदद पाने के लिए, पहने जाने वाले डिवाइस के लिए ऐप्लिकेशन बनाने की गाइड देखें.

Wear OS पर अपना पहला मैप ऐप्लिकेशन बनाया जा रहा है

यह गाइड यह मान लेती है कि आपको Android के लिए Maps SDK टूल के बारे में पता है और आपने अपने ऐप्लिकेशन में, पहने जाने वाले डिवाइस के लिए मॉड्यूल बनाने के लिए Wear OS की गाइड का पालन किया है. अब आपको पहने जाने वाले मॉड्यूल में मैप जोड़ना है.

आपके Wear मॉड्यूल के लिए डिपेंडेंसी जोड़ना

पक्का करें कि आपके ऐप्लिकेशन के Wear OS मॉड्यूल की build.gradle फ़ाइल में ये डिपेंडेंसी शामिल हों:

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

डिपेंडेंसी के बारे में ज़्यादा जानकारी के लिए, अपने मौजूदा प्रोजेक्ट में Wear OS मॉड्यूल जोड़ने की गाइड देखें.

खारिज करने के लिए स्वाइप करने के जेस्चर को लागू करना और शुरुआती बैकग्राउंड का रंग सेट करना

हमारा सुझाव है कि पहने जाने वाले डिवाइस पर मैप दिखाने के लिए, SwipeDismissFrameLayout का इस्तेमाल करें. SwipeDismissFrameLayout क्लास का इस्तेमाल करके, स्वाइप करने के लिए स्वाइप करें जेस्चर लागू किया जा सकता है. इससे, उपयोगकर्ता स्क्रीन के बाएं किनारे से स्वाइप करके, ऐप्लिकेशन से बाहर निकल सकते हैं.

बैकग्राउंड के लिए अपनी पसंद का शुरुआती रंग सेट करने के लिए, map:backgroundColor एक्सएमएल एट्रिब्यूट का इस्तेमाल करें. इससे मैप टाइल के लोड होने तक, रंग तय किया जा सकेगा.

अपनी लेआउट परिभाषा में SwipeDismissFrameLayout और backgroundColor एलिमेंट को SupportMapFragment के कंटेनर के तौर पर जोड़ें:

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

जब आपको अपनी गतिविधि में SwipeDismissFrameLayout ऑब्जेक्ट मिल जाए, तो कॉलबैक जोड़ें. साथ ही, खारिज करने की ज़रूरी कार्रवाई करने के लिए कॉलबैक के व्यवहार को सेट करें, जैसा कि यहां दिखाया गया है:

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

    // ...
}

      

मैप जोड़ना

GoogleMap ऑब्जेक्ट को हैंडल करने के लिए, हमेशा की तरह onMapReady(GoogleMap) कॉलबैक वाले तरीके का इस्तेमाल करें. कॉलबैक तब ट्रिगर होता है, जब मैप इस्तेमाल करने के लिए तैयार हो. कॉलबैक तरीके में, मैप पर मार्कर या पॉलीलाइन जोड़े जा सकते हैं, लिसनर जोड़े जा सकते हैं या कैमरे को मूव किया जा सकता है. नीचे दिए गए उदाहरण में, सिडनी ऑपरा हाउस के पास एक मार्कर जोड़ा गया है:

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

      

आस-पास की आवाज़ सुनाने वाला मोड चालू कर रही हूँ

Android के लिए Maps SDK टूल, पहने जाने वाले ऐप्लिकेशन के लिए ऐंबियंट मोड पर काम करता है. ऐंबियंट मोड में काम करने वाले ऐप्लिकेशन को कभी-कभी हमेशा चालू ऐप्लिकेशन कहा जाता है. ऐंबियंट मोड तब चालू होता है, जब उपयोगकर्ता सक्रिय रूप से ऐप्लिकेशन का इस्तेमाल नहीं करता. साथ ही, यह ऐप्लिकेशन, पहने जाने वाले डिवाइस पर भी दिखता रहता है.

Android के लिए Maps SDK टूल, ऐंबियंट मोड में इस्तेमाल करने के लिए, मैप को आसान और कम रंगों में रेंडर करता है. साथ ही, डिवाइस के इंटरैक्टिव से ऐंबियंट मोड में बदलने पर, मैप की स्टाइल अपने-आप अडजस्ट हो जाती है. ऐंबियंट मोड में सभी मार्कर, ऑब्जेक्ट, और यूज़र इंटरफ़ेस (यूआई) कंट्रोल मौजूद नहीं होते. इससे आपके ऐप्लिकेशन की बिजली की खपत कम होती है और ऐंबियंट मोड में इस्तेमाल होने वाले दूसरे ऐप्लिकेशन का लुक और अनुभव एक जैसा बना रहता है, जैसे कि स्मार्टवॉच की होम स्क्रीन.

यह पक्का करने के लिए कि आपका ऐप्लिकेशन, मैप के ऐंबियंट मोड का इस्तेमाल करता है, यह तरीका अपनाएं:

  1. Android 6.0 (एपीआई 23) या उसके बाद के प्लैटफ़ॉर्म को शामिल करने के लिए, अपने Android SDK को अपडेट करें. ये ऐसे एपीआई उपलब्ध कराते हैं जो गतिविधियों को ऐंबियंट मोड में जाने देते हैं. SDK टूल को अपडेट करने का तरीका जानने के लिए, SDK टूल के पैकेज जोड़ने से जुड़ा Android दस्तावेज़ देखें.
  2. ऐप्लिकेशन मेनिफ़ेस्ट में targetSdkVersion को 23 या उसके बाद वाले वर्शन पर सेट करके, पक्का करें कि आपका प्रोजेक्ट Android 6.0 या इसके बाद वाले वर्शन को टारगेट करता हो.
  3. अपने ऐप्लिकेशन की build.gradle फ़ाइल में, पहने जाने वाले डिवाइस जोड़ें. इस पेज पर सैंपल देखें.
  4. पहने जाने वाले डिवाइस के ऐप्लिकेशन मेनिफ़ेस्ट में, पहने जाने वाले डिवाइस की शेयर की गई लाइब्रेरी वाली एंट्री जोड़ें, जैसा कि Android ट्रेनिंग क्लास में अपने ऐप्लिकेशन को बेहतर तरीके से दिखाने के लिए बताया गया है.
  5. अपने ऐप्लिकेशन को बेहतर बनाए रखने के लिए, Android ट्रेनिंग क्लास में बताए गए तरीके के मुताबिक, हैंडहेल्ड और पहने जाने वाले ऐप्लिकेशन मेनिफ़ेस्ट में WAKE_LOCK अनुमति जोड़ें.
  6. अपनी गतिविधि के onCreate() तरीके में, AmbientModeSupport.attach() वाले तरीके को कॉल करें. इससे ऑपरेटिंग सिस्टम को पता चलता है कि ऐप्लिकेशन हमेशा चालू रहता है, ताकि जब डिवाइस बंद हो जाए, तब वह स्मार्टवॉच की होम स्क्रीन पर लौटने के बजाय ऐंबियंट मोड में चले.
  7. अपनी गतिविधि में AmbientModeSupport.AmbientCallbackProvider इंटरफ़ेस का इस्तेमाल करें, ताकि इसे ऐंबियंट मोड की स्थिति में बदलाव मिल सकें.
  8. आस-पास की आवाज़ सुनाने वाले मोड पर काम करने के लिए अपना मैप सेट करें. ऐसा करने के लिए, गतिविधि की एक्सएमएल लेआउट फ़ाइल में map:ambientEnabled="true" एट्रिब्यूट को सेट करें या GoogleMapOptions.ambientEnabled(true) को प्रोग्राम के हिसाब से सेट करें. यह सेटिंग एपीआई को बताती है कि ऐंबियंट मोड में इस्तेमाल करने के लिए, उसे ज़रूरी मैप टाइल को पहले से लोड करना होगा.
  9. जब गतिविधि ऐंबियंट मोड में स्विच हो जाती है, तो सिस्टम आपके दिए गए AmbientCallback में बताए गए onEnterAmbient() तरीके को कॉल करता है. onEnterAmbient() को ओवरराइड करें और SupportMapFragment.onEnterAmbient(ambientDetails) या MapView.onEnterAmbient(ambientDetails) को कॉल करें. एपीआई, मैप की नॉन-इंटरैक्टिव और लो-कलर रेंडरिंग में बदल जाता है.
  10. इसी तरह, onExitAmbient() कॉल में SupportMapFragment.onExitAmbient() या MapView.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()
            }
        }
    }
}

      

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

      

ऐंबियंट मोड में ऐप्लिकेशन चालू होने पर, उसकी स्क्रीन को अपडेट किया जा सकता है. कॉन्टेंट अपडेट करने और ऐंबियंट मोड के बारे में ज़्यादा जानने के लिए, अपने ऐप्लिकेशन को बेहतर ढंग से दिखाने के लिए Android की ट्रेनिंग क्लास देखें.

Wear OS पर Street View का इस्तेमाल करना

Street View, पहने जाने वाले डिवाइसों पर पूरी तरह काम करता है.

Street View पैनोरामा देखते समय उपयोगकर्ता ऐप्लिकेशन से बाहर निकल सकें, इसके लिए StreetViewPanorama.OnStreetViewPanoramaLongClickListener इंटरफ़ेस का इस्तेमाल करके, लंबे क्लिक के जेस्चर को सुनें. जब कोई उपयोगकर्ता Street View की इमेज पर किसी भी जगह क्लिक करता है, तो आपको एक onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation) इवेंट मिलेगा. एग्ज़िट बटन दिखाने के लिए, DismissOverlayView.show() पर कॉल करें.

नमूना कोड

GitHub पर एक सैंपल ऐप्लिकेशन उपलब्ध है. इसका इस्तेमाल, अपने ऐप्लिकेशन के शुरुआती पॉइंट के तौर पर किया जा सकता है. इस सैंपल में, Wear OS पर बेसिक Google Maps सेट अप करने का तरीका बताया गया है.

Wear OS पर Maps API के साथ काम करने वाली सुविधाएं

इस सेक्शन में बताया गया है कि हैंडहेल्ड डिवाइसों (फ़ोन और टैबलेट) की तुलना में, पहने जाने वाले डिवाइसों पर मौजूद मैप में किस तरह की सुविधाएं काम करती हैं. एपीआई की जिन सुविधाओं के बारे में नीचे नहीं बताया गया है उन्हें पूरे एपीआई के लिए बताए गए तरीके से काम करना चाहिए.

फ़ंक्शन
पूरी तरह इंटरैक्टिव मोड और लाइट मोड

Android के लिए, Maps SDK टूल का इस्तेमाल पूरी तरह से इंटरैक्टिव मोड या लाइट मोड में किया जा सकता है. अगर पहने जाने वाले डिवाइस पर गेम की परफ़ॉर्मेंस को ऑप्टिमाइज़ करना है और आपके ऐप्लिकेशन को हाथ के जेस्चर, मैप को पैन और ज़ूम करने जैसी सुविधाओं की ज़रूरत नहीं है, तो लाइट मोड का इस्तेमाल करें.

लाइट मोड में, उपयोगकर्ता के मैप पर टैप करने पर, Google Maps मोबाइल ऐप्लिकेशन शुरू करने की इंटेंट बंद हो जाता है और पहने जाने वाले डिवाइस पर इसे चालू नहीं किया जा सकता.

लाइट मोड और पूरी तरह इंटरैक्टिव मोड के बीच के फ़र्क़ की पूरी सूची देखने के लिए, लाइट मोड का दस्तावेज़ देखें.

मैप टूलबार मैप टूलबार बंद है. इसे पहने जाने वाले डिवाइस पर चालू नहीं किया जा सकता.
यूज़र इंटरफ़ेस (यूआई) कंट्रोल पहने जाने वाले डिवाइसों पर, यूज़र इंटरफ़ेस कंट्रोल डिफ़ॉल्ट रूप से बंद होते हैं. इसमें ज़ूम, कंपास, और मेरी जगह की जानकारी के कंट्रोल शामिल हैं. उन्हें हमेशा की तरह UiSettings क्लास का इस्तेमाल करके चालू किया जा सकता है.
हाथ के जेस्चर सिंगल-टच जेस्चर उम्मीद के मुताबिक काम करते हैं. उदाहरण के लिए, मैप को पैन करने के लिए उसे छुएं और खींचें, ज़ूम इन करने के लिए दो बार टैप करें, और ज़ूम आउट करने के लिए दो उंगलियों से टैप करें. मल्टी-टच जेस्चर के लिए सहायता, उपयोगकर्ता के डिवाइस के हिसाब से अलग-अलग होती है. मल्टी-टच जेस्चर के उदाहरणों में, मैप को झुकाने के लिए दो उंगलियों से पुश करना, ज़ूम करने के लिए पिंच करना, और दो उंगलियों से घुमाना शामिल है.
इनडोर मैप और बिल्डिंग पहने जाने वाले डिवाइस पर इनडोर मैप, डिफ़ॉल्ट रूप से बंद होते हैं. इन्हें चालू करने के लिए, GoogleMap.setIndoorEnabled(true) को कॉल करें. अगर इनडोर मैप चालू है, तो मैप में डिफ़ॉल्ट फ़्लोर लेवल दिखेगा. लेवल पिकर यूज़र इंटरफ़ेस (यूआई) एलिमेंट, पहने जाने वाले डिवाइसों पर काम नहीं करता.
टाइल ऊपर लगाएं पहने जाने वाले डिवाइसों पर टाइल ओवरले काम नहीं करते.

Wear OS पर Maps API की मदद से ऐप्लिकेशन डेवलप करने के सबसे सही तरीके

अपने ऐप्लिकेशन में उपयोगकर्ता को बेहतरीन अनुभव देने का तरीका:

  • मैप को स्क्रीन का बड़ा हिस्सा कवर करना चाहिए. यह ज़रूरी है कि पहने जाने वाले डिवाइस के छोटे डिवाइस पर मैप की उपयोगिता को ऑप्टिमाइज़ किया जा सके.
  • अपने ऐप्लिकेशन का उपयोगकर्ता अनुभव डिज़ाइन करते समय, इस बात का ध्यान रखें कि पहने जाने वाले डिवाइस की बैटरी कम चार्ज होती है. स्क्रीन को सक्रिय रखने और मैप को देखने से बैटरी की परफ़ॉर्मेंस पर असर पड़ेगा.