Android पर AR (Kotlin) में आस-पास की जगहें दिखाएं

1. शुरू करने से पहले

खास जानकारी

यह कोडलैब आपको Google Maps Platform से डेटा का इस्तेमाल करके, Android पर ऑगमेंटेड रिएलिटी (एआर) में आस-पास की जगहें दिखाने का तरीका बताता है.

2344909dd9a52c60.png

ज़रूरी बातें

  • Android Studio का इस्तेमाल करके, Android डेवलपमेंट के बारे में बुनियादी जानकारी
  • Kotlin के बारे में जानकारी

आप क्या #39;जानेंगे

  • उपयोगकर्ता का डिवाइस के कैमरे और जगह की जानकारी ऐक्सेस करने की अनुमति का अनुरोध करें.
  • डिवाइस के आस-पास की जगह की जानकारी पाने के लिए जगहों के एपीआई के साथ इंटिग्रेट करें.
  • हॉरिज़ॉन्टल हवाई जहाज़ ढूंढने के लिए ARCore का इस्तेमाल करें, ताकि वर्चुअल ऑब्जेक्ट को Seneform का इस्तेमाल करके ऐंकर किया जा सके और 3D स्पेस में रखा जा सके.
  • डिवाइस की स्थिति के बारे में जानकारी पाने के लिए, सेंसर का इस्तेमाल करें. साथ ही, वर्चुअल ऑब्जेक्ट को सही जगह पर रखने के लिए, Android यूटिलिटी लाइब्रेरी के लिए Maps SDK टूल का इस्तेमाल करें.

आपको क्या चाहिए

  • Android Studio 2020.3.1 या इसके बाद का वर्शन
  • एक डेवलपमेंट मशीन जो OpenGL ES 3.0 या इसके बाद के वर्शन के साथ काम करती है
  • ARCore सुविधा वाला डिवाइस या ARCore चालू करने वाला Android एम्युलेटर (अगले चरण में दिए गए निर्देश)

2. सेट अप करें

Android Studio

इस कोडलैब में Android 10.0 (एपीआई लेवल 29) का इस्तेमाल किया जाता है. इसके लिए, यह ज़रूरी है कि आपने Android Studio में Google Play सेवाएं इंस्टॉल की हों. इन दोनों डिपेंडेंसी को इंस्टॉल करने के लिए, यह तरीका अपनाएं:

  1. SDK टूल के मैनेजर पर जाएं. आप इसे टूल &g; SDK मैनेजर पर क्लिक करके ऐक्सेस कर सकते हैं.

6c44a9cb9cf6c236.png

  1. देखें कि Android 10.0 इंस्टॉल किया गया है या नहीं. अगर नहीं, तो Android 10.0 (Q) के आगे दिया गया चेकबॉक्स चुनकर इसे इंस्टॉल करें. इसके बाद, ठीक है पर क्लिक करें और आखिर में, दिखाई देने वाले डायलॉग बॉक्स में ठीक है पर क्लिक करें.

368f17a974c75c73.png

  1. आखिर में, SDK टूल टैब पर जाकर Google Play सेवाएं इंस्टॉल करें. Google Play सेवाएं के बगल में मौजूद चेकबॉक्स को चुनें और ठीक है पर क्लिक करें. इसके बाद, दिखने वाले डायलॉग बॉक्स में ठीक है को चुनें.**

497a954b82242f4b.png

ज़रूरी एपीआई

नीचे दिए गए सेक्शन के तीसरे कदम में, इस कोडलैब के लिए Android के लिए Maps SDK और जगहों के लिए एपीआई चालू करें.

Google Maps Platform का इस्तेमाल शुरू करें

अगर आपने पहले Google Maps Platform का इस्तेमाल नहीं किया है, तो Google Maps Platform गाइड का इस्तेमाल शुरू करें या नीचे दिया गया तरीका अपनाने के लिए, Google Maps Platform प्लेलिस्ट का इस्तेमाल शुरू करें:

  1. बिलिंग खाता बनाएं.
  2. प्रोजेक्ट बनाएं.
  3. Google Maps Platform API और SDK टूल चालू करें (पिछले सेक्शन में दी गई है).
  4. एपीआई कुंजी जनरेट करें.

ज़रूरी नहीं: Android एम्युलेटर

अगर आपके पास ARCore की सुविधा वाला डिवाइस नहीं है, तो आप Android Emulator का इस्तेमाल एआर (ऑगमेंटेड रिएलिटी) सीन को सिम्युलेट करने के लिए कर सकते हैं. साथ ही, आप अपने डिवाइस की जगह की जानकारी को नकली भी बना सकते हैं. यह देखते हुए कि आप इस कसरत में सीनफ़ॉर्म का भी इस्तेमाल कर रहे हैं, आपको यह भी पक्का करना होगा कि आपकी 'स्थिति के तहत दिए गए कदमों का पालन किया जा रहा है. कोट

3. तुरंत शुरू करना

इसे शुरू करने में आपकी मदद के लिए, यहां कुछ # कोड दिया गया है, ताकि आप इस कोडलैब के साथ-साथ आगे भी काम कर सकें. आप अपनी समस्या के हल पाने के लिए यहां आएं.

अगर आपने git इंस्टॉल किया हुआ है, तो आप डेटा स्टोर करने की जगह को क्लोन कर सकते हैं.

git clone https://github.com/googlecodelabs/display-nearby-places-ar-android.git

इसके अलावा, आप नीचे दिए गए बटन पर क्लिक करके सोर्स कोड डाउनलोड कर सकते हैं.

कोड मिलने के बाद, starter डायरेक्ट्री में मौजूद प्रोजेक्ट को खोलें.

4. प्रोजेक्ट अवलोकन

पिछले चरण से डाउनलोड किया गया कोड एक्सप्लोर करें. इस रिपॉज़िटरी में आपको app नाम का एक मॉड्यूल मिलेगा, जिसमें com.google.codelabs.findnearbyplacesar पैकेज होता है.

AndroidManifest.xml

AndroidManifest.xml फ़ाइल में ये एट्रिब्यूट दिए गए हैं, ताकि आप इस कोडलैब में ज़रूरी सुविधाओं का इस्तेमाल कर सकें:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- Sceneform requires OpenGL ES 3.0 or later. -->
<uses-feature
   android:glEsVersion="0x00030000"
   android:required="true" />

<!-- Indicates that app requires ARCore ("AR Required"). Ensures the app is visible only in the Google Play Store on devices that support ARCore. For "AR Optional" apps remove this line. -->
<uses-feature android:name="android.hardware.camera.ar" />

uses-permission के लिए, इनसे पता चलता है कि उन क्षमताओं का इस्तेमाल करने से पहले, उपयोगकर्ता को कौनसी अनुमतियां देनी होंगी, नीचे दी गई जानकारी दी जाती है:

  • android.permission.INTERNET—ऐसा इसलिए है, ताकि आपका ऐप्लिकेशन नेटवर्क से जुड़ी कार्रवाइयां कर सके और इंटरनेट पर डेटा फ़ेच कर सके. जैसे, 'जगहें एपीआई' से जगह की जानकारी.
  • android.permission.CAMERA—कैमरे का ऐक्सेस ज़रूरी है, ताकि आप डिवाइस और कैमरे का इस्तेमाल करके ऑगमेंटेड रिएलिटी (एआर) में ऑब्जेक्ट दिखा सकें.
  • android.permission.ACCESS_FINE_LOCATION—जगह की जानकारी का ऐक्सेस ज़रूरी है, ताकि आप डिवाइस की जगह की जानकारी के हिसाब से आस-पास की जगहें फ़ेच कर सकें.

uses-feature के लिए, जो बताता है कि इस ऐप्लिकेशन के लिए किन हार्डवेयर सुविधाओं की ज़रूरत है, ये चीज़ें बताई गई हैं:

  • OpenGL ES वर्शन 3.0 डालना ज़रूरी है.
  • ARCore की सुविधा वाला डिवाइस ज़रूरी है.

इसके अलावा, ऐप्लिकेशन ऑब्जेक्ट में ये मेटाडेटा टैग जोड़े जाते हैं:

<application
  android:allowBackup="true"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:roundIcon="@mipmap/ic_launcher_round"
  android:supportsRtl="true"
  android:theme="@style/AppTheme">
  
  <!-- 
     Indicates that this app requires Google Play Services for AR ("AR Required") and causes
     the Google Play Store to download and install Google Play Services for AR along with
     the app. For an "AR Optional" app, specify "optional" instead of "required". 
  -->

  <meta-data
     android:name="com.google.ar.core"
     android:value="required" />

  <meta-data
     android:name="com.google.android.geo.API_KEY"
     android:value="@string/google_maps_key" />

  <!-- Additional elements here --> 

</application>

पहली मेटा-डेटा एंट्री यह बताती है कि इस ऐप्लिकेशन को चलाने के लिए ARCore की ज़रूरत है और दूसरी यह है कि आप Android के लिए Maps SDK में Google Maps Platform API कुंजी कैसे देते हैं.

build.gradle

build.gradle में नीचे दी गई अन्य डिपेंडेंसी तय होती हैं:

dependencies {
    // Maps & Location
    implementation 'com.google.android.gms:play-services-location:17.0.0'
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    implementation 'com.google.maps.android:maps-utils-ktx:1.7.0'

    // ARCore
    implementation "com.google.ar.sceneform.ux:sceneform-ux:1.15.0"

    // Retrofit
    implementation "com.squareup.retrofit2:retrofit:2.7.1"
    implementation "com.squareup.retrofit2:converter-gson:2.7.1"
}

यहां हर डिपेंडेंसी का छोटा सा ब्यौरा दिया गया है:

  • com.google.android.gms लाइब्रेरी, जैसे कि play-services-location और play-services-maps ग्रुप, लाइब्रेरी का इस्तेमाल करते हैं. इनका इस्तेमाल डिवाइस की जगह की जानकारी ऐक्सेस करने और Google Maps से जुड़ी सुविधाओं को ऐक्सेस करने के लिए किया जाता है.
  • Android यूटिलिटी लाइब्रेरी के मैप SDK टूल के लिए, com.google.maps.android:maps-utils-ktx Kotlin एक्सटेंशन (KTX) लाइब्रेरी है. इस लाइब्रेरी का इस्तेमाल, वर्चुअल ऑब्जेक्ट को बाद में रीयल स्पेस में रखने के लिए किया जाएगा.
  • com.google.ar.sceneform.ux:sceneform-ux, सीनफ़ॉर्म लाइब्रेरी है, जो आपको OpenGL की जानकारी के बिना ही असली 3D सीन रेंडर करने की सुविधा देगी.
  • ग्रुप आईडी com.squareup.retrofit2 में मौजूद डिपेंडेंसी, Retrofit डिपेंडेंसी है. इसकी मदद से, आप स्पेस एपीआई से इंटरैक्ट करने के लिए फटाफट एचटीटीपी क्लाइंट लिख सकते हैं.

प्रोजेक्ट स्ट्रक्चर

आपको ये #39; पैकेज और फ़ाइलें मिलेंगी:

  • **api—**इस पैकेज में ऐसी क्लास शामिल हैं जिनका इस्तेमाल Retrofit का इस्तेमाल करके 'जगह एपीआई' से इंटरैक्ट करने के लिए किया जाता है.
  • **ar—**इस पैकेज में ARCore से जुड़ी सभी फ़ाइलें हैं.
  • **मॉडल—**इस पैकेज में सिर्फ़ एक डेटा क्लास Place होती है. इसका इस्तेमाल, जगह की जानकारी वाले एपीआई की मदद से एक जगह को एनकैप्सुलेट करने के लिए किया जाता है, जैसा कि जगहें एपीआई से मिलता है.
  • MainActivity.kt—यह आपके ऐप्लिकेशन में शामिल सिंगल Activity है, जो मैप और कैमरा व्यू दिखाएगा.

5. सीन सेट अप किया जा रहा है

ऑगमेंटेड-रियलिटी पीस से शुरू करके, ऐप्लिकेशन के मुख्य कॉम्पोनेंट को जानें.

MainActivity में एक SupportMapFragment होता है, जो मैप ऑब्जेक्ट दिखाने के साथ-साथ ArFragmentPlacesArFragment का सब-क्लास भी बनाता है जो ऑगमेंटेड रिएलिटी (एआर) दिखाने वाला व्यू दिखाता है.

ऑगमेंटेड रिएलिटी (एआर) सेट अप किया गया

ऑगमेंटेड रिएलिटी (एआर) व्यू दिखाने के अलावा, PlacesArFragment अगर उपयोगकर्ता को कैमरा ऐक्सेस करने की अनुमति नहीं देता है, तो उसे उपयोगकर्ता उससे अनुमति भी देगा. getAdditionalPermissions तरीके को बदलकर, दूसरी अनुमतियों का भी अनुरोध किया जा सकता है. ध्यान रखें कि आपको अनुमति देने के लिए जगह की जानकारी की अनुमति भी ज़रूरी है. इसके बारे में getAdditionalPermissions में बताएं और इसे बदलें:

class PlacesArFragment : ArFragment() {

   override fun getAdditionalPermissions(): Array<String> =
       listOf(Manifest.permission.ACCESS_FINE_LOCATION)
           .toTypedArray()
}

इसे चलाएं

ऐसा करने के बाद, Android Studio में starter डायरेक्ट्री में जाकर कंकाल कोड खोलें. अगर आप चलाएं > app' टूलबार से चलाएं और ऐप्लिकेशन को अपने डिवाइस या एम्युलेटर पर डिप्लॉय करें, तो आपको जगह की जानकारी और कैमरा ऐक्सेस करने की अनुमति देने के लिए कहा जाएगा. आगे बढ़ें और अनुमति दें पर क्लिक करें. ऐसा करने पर, आपको कैमरा व्यू और मैप व्यू एक साथ दिखेगा:

e3e3073d5c86f427.png

हवाई जहाज़ों का पता लगाना

जब आप अपने कैमरे के साथ आस-पास का माहौल देखते हैं, तो हो सकता है कि आपको हॉरिज़ॉन्टल सतहों पर सफ़ेद बिंदुओं के कुछ निशान, इस इमेज में कालीन पर लगे सफ़ेद बिंदु की तरह दिखें.

2a9b6ea7dcb2e249.png

ये सफ़ेद बिंदु, ARCore की ओर से दिए गए दिशा-निर्देश हैं. ये दिशा-निर्देश बताते हैं कि एक हॉरिज़ॉन्टल प्लेन का पता लगाया गया है. इन पहचानी गई विमानों की मदद से आप &' नाम के ऐंकर बना सकते हैं; ताकि आप वर्चुअल ऑब्जेक्ट को रीयल स्पेस में रख सकें.

ARCore और इसके आस-पास के माहौल को समझने के बारे में ज़्यादा जानने के लिए, इसकी बुनियादी सिद्धांतों के बारे में पढ़ें.

6. आस-पास की जगहें पाएं

इसके बाद, आपको $API का इस्तेमाल करके आस-पास की जगहें फ़ेच करने के बाद, डिवाइस और उसकी मौजूदा जगह की जानकारी को ऐक्सेस करके दिखाना होगा.

Maps सेट अप करना

Google Maps Platform API कुंजी

इससे पहले, आपने 'जगहें एपीआई' की क्वेरी करने और Android के लिए मैप SDK टूल का इस्तेमाल करने के लिए, Google Maps Platform API कुंजी बनाई थी. ऐसा करने के लिए, gradle.properties फ़ाइल खोलें और स्ट्रिंग "YOUR API KEY HERE" को अपनी बनाई गई एपीआई कुंजी से बदलें.

मैप पर डिवाइस की जगह की जानकारी दिखाना

एपीआई कुंजी जोड़ने के बाद, मैप पर एक हेल्पर जोड़ें, ताकि उपयोगकर्ताओं को मैप से जोड़ने में मदद मिल सके. ऐसा करने के लिए, setUpMaps तरीके पर जाएं और mapFragment.getMapAsync कॉल में, googleMap.isMyLocationEnabled को true. पर सेट करें. ऐसा करने से मैप पर नीला बिंदु दिखेगा.

private fun setUpMaps() {
   mapFragment.getMapAsync { googleMap ->
       googleMap.isMyLocationEnabled = true
       // ...
   }
}

मौजूदा जगह की जानकारी पाएं

डिवाइस की जगह की जानकारी पाने के लिए, आपकोFusedLocationProviderClient क्लास का इस्तेमाल करना होगा. इसका एक इंस्टेंस पाना MainActivity की onCreate विधि में पहले ही किया जा चुका है. इस ऑब्जेक्ट का इस्तेमाल करने के लिए, getCurrentLocation तरीके का इस्तेमाल करें. यह lambda आर्ग्युमेंट को स्वीकार करता है, ताकि कॉल करने वाले को इस तरीके से जगह की जानकारी भेजी जा सके.

इस तरीके को पूरा करने के लिए, FusedLocationProviderClient ऑब्जेक्ट की lastLocation प्रॉपर्टी को ऐक्सेस किया जा सकता है. इसके बाद, एक addOnSuccessListener पर इस तरह से जोड़ा जा सकता है:

fusedLocationClient.lastLocation.addOnSuccessListener { location ->
    currentLocation = location
    onSuccess(location)
}.addOnFailureListener {
    Log.e(TAG, "Could not get location")
}

getCurrentLocation तरीके को getMapAsync में दिए गए lambda में setUpMaps तरीके से कॉल किया जाता है, ताकि आस-पास की जगहों को फ़ेच किया जा सके.

जगहों के नेटवर्क से जुड़ी कॉल शुरू करें

getNearbyPlaces तरीके के कॉल में, ध्यान दें कि नीचे दिए गए पैरामीटर placesServices.nearbyPlaces तरीके में पास किए जाते हैं—एक एपीआई कुंजी, डिवाइस की जगह, मीटर का दायरा (जो दो कि॰मी॰ पर सेट है), और एक जगह का टाइप (फ़िलहाल park पर सेट है).

val apiKey = "YOUR API KEY"
placesService.nearbyPlaces(
   apiKey = apiKey,
   location = "${location.latitude},${location.longitude}",
   radiusInMeters = 2000,
   placeType = "park"
)

नेटवर्क कॉल पूरा करने के लिए, आगे बढ़ें और अपनी gradle.properties फ़ाइल में तय की गई API (एपीआई) कुंजी पास करें. यह कोड स्निपेट आपकी build.gradle फ़ाइल में, android > defaultConfig कॉन्फ़िगरेशन के तहत तय किया गया है:

android {
   defaultConfig {
       resValue "string", "google_maps_key", (project.findProperty("GOOGLE_MAPS_API_KEY") ?: "")
   }
}

इससे स्ट्रिंग रिसॉर्स वैल्यू google_maps_key, बिल्ड टाइम में उपलब्ध हो जाएगी.

नेटवर्क कॉल पूरा करने के लिए, आप Context ऑब्जेक्ट पर getString के ज़रिए, इस स्ट्रिंग रिसॉर्स को पढ़ सकते हैं.

val apiKey = this.getString(R.string.google_maps_key)

7. एआर (ऑगमेंटेड रिएलिटी) में जगहें

अब तक, आपने ये काम किए हैं:

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

इस कसरत को पूरा करने के लिए, आपको उन जगहों को सेट करना होगा जिन्हें आप ऑगमेंटेड रिएलिटी (एआर) में फ़ेच कर रहे हैं.

सीन की समझ

ARCore, हर इमेज फ़्रेम में, फ़ीचर पॉइंट नाम के दिलचस्प और अलग-अलग पॉइंट का पता लगाकर, डिवाइस के कैमरे से असल दुनिया की स्थिति को समझता है. इन फ़ीचर पॉइंट को ग्रुप करने के बाद, टेबल और फ़्लोर जैसे किसी हॉरिज़ॉन्टल हॉरिज़ॉन्टल प्लेन में ले जाने के लिए, ARCore इस सुविधा को हॉरिज़ॉन्टल प्लेन के तौर पर ऐप्लिकेशन के लिए उपलब्ध करा सकता है.

जैसा कि आपने पहले देखा था, सफ़ेद बिंदु का इस्तेमाल करके, हवाई जहाज़ का पता चलने पर ARCore उपयोगकर्ता की मदद करता है.

2a9b6ea7dcb2e249.png

ऐंकर जोड़ना

हवाई जहाज़ का पता लगने के बाद, आप ऐंकर नाम का ऑब्जेक्ट अटैच कर सकते हैं. ऐंकर का इस्तेमाल करके, आप वर्चुअल ऑब्जेक्ट डाल सकते हैं. साथ ही, ये गारंटी दे सकते हैं कि ये ऑब्जेक्ट, स्पेस में एक ही जगह पर दिखेंगे. हवाई जहाज़ का पता लगने पर, कोड को अटैच करके कोड में बदलाव करें.

setUpAr में, OnTapArPlaneListener को PlacesArFragment के साथ अटैच किया जाता है. जब भी किसी विमान को एआर (ऑगमेंटेड रिएलिटी) सीन में टैप किया जाता है, तो इस लिसनर का इस्तेमाल किया जाता है. इस कॉल के अंदर, आप पहचानकर्ता में दिए गए HitResult से इस तरह का Anchor और AnchorNode बना सकते हैं:

arFragment.setOnTapArPlaneListener { hitResult, _, _ ->
   val anchor = hitResult.createAnchor()
   anchorNode = AnchorNode(anchor)
   anchorNode?.setParent(arFragment.arSceneView.scene)
   addPlaces(anchorNode!!)
}

AnchorNode में, आप चाइल्ड नोड ऑब्जेक्ट—PlaceNode इंस्टेंस को उस सीन में अटैच करेंगे जो addPlaces मेथड कॉल में मैनेज किए जाते हैं.

इसे चलाएं

अगर आप ऊपर किए गए बदलावों के साथ ऐप्लिकेशन चलाते हैं, तो प्लेन का पता चलने तक अपने आस-पास देखें. आगे बढ़ें और हवाई जहाज़ बताने वाले सफ़ेद बिंदुओं पर टैप करें. ऐसा करने के बाद, आपको मैप पर अपने आस-पास के सभी नज़दीकी पार्क के लिए मार्कर दिखाई देने लगेंगे. हालांकि, अगर आपको {39; सूचना मिलती है, तो वर्चुअल ऑब्जेक्ट उस ऐंकर पर अटक जाते हैं जिसे बनाया गया है. यह ऑब्जेक्ट, उन पार्क की जगह पर नहीं रखा जाता जहां वे रहते हैं.

f93eb87c98a0098d.png

आपके आखिरी चरण के लिए, डिवाइस पर Android यूटिलिटी लाइब्रेरी के लिए मैप SDK टूल और सेंसर मैनेजर का इस्तेमाल करके इसे ठीक करें.

8. जगहों की रैंकिंग

ऑगमेंटेड रिएलिटी (एआर) में वर्चुअल जगह का आइकॉन सही जगह पर रखने के लिए, आपको दो तरह की जानकारी की ज़रूरत होगी:

  • जहां उत्तर उत्तर सही है
  • उत्तर और हर स्थान के बीच का कोण

उत्तर तय करना

डिवाइस की स्थिति बताने वाले सेंसर (जियोमैग्नेटिक और एक्सलरोमीटर) का इस्तेमाल करके उत्तर तय किया जा सकता है. इन दो सेंसर का इस्तेमाल करके, आप स्पेस में डिवाइस की स्थिति के बारे में रीयल-टाइम जानकारी इकट्ठा कर सकते हैं. स्थिति सेंसर के बारे में ज़्यादा जानकारी के लिए, डिवाइस के रुझान देखें पर जाएं.

इन सेंसर को ऐक्सेस करने के लिए, आपको SensorManager&#39 इंस्टॉल करना होगा. इसके बाद, आपको उन सेंसर पर SensorEventListener रजिस्टर करना होगा. आपके लिए यह तरीका MainActivity' लाइफ़साइकल के तरीकों में पहले ही पूरा किया जा चुका है:

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   // ...
   sensorManager = getSystemService()!!
   // ...
}

override fun onResume() {
   super.onResume()
   sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also {
       sensorManager.registerListener(
           this,
           it,
           SensorManager.SENSOR_DELAY_NORMAL
       )
   }
   sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also {
       sensorManager.registerListener(
           this,
           it,
           SensorManager.SENSOR_DELAY_NORMAL
       )
   }
}

override fun onPause() {
   super.onPause()
   sensorManager.unregisterListener(this)
}

onSensorChanged तरीके में, एक SensorEvent ऑब्जेक्ट दिया जाता है, जिसमें किसी दिए गए सेंसर की डेटा की जानकारी होती है. यह बदलाव समय के साथ बदलता है. आगे बढ़ें और इस तरीके से नीचे दिया गया कोड जोड़ें:

override fun onSensorChanged(event: SensorEvent?) {
   if (event == null) {
       return
   }
   if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
       System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size)
   } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
       System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size)
   }

   // Update rotation matrix, which is needed to update orientation angles.
   SensorManager.getRotationMatrix(
       rotationMatrix,
       null,
       accelerometerReading,
       magnetometerReading
   )
   SensorManager.getOrientation(rotationMatrix, orientationAngles)
}

ऊपर दिया गया कोड, सेंसर टाइप की जांच करता है. साथ ही, यह इस बात पर निर्भर करता है कि टाइप किस तरह का है. यह सेंसर का सही रीडिंग अपडेट करेगा (या तो एक्सलरोमीटर या मैग्नेटोमीटर में किया गया). इन सेंसर रीडिंग का इस्तेमाल करके डिवाइस के मुकाबले उत्तर की ओर से कितने डिग्री का मान तय किया जा सकता है (यानी मान orientationAngles[0]).

गोल आकार वाला शीर्षक

अब जब उत्तर तय किया जा चुका है, तो अगला चरण उत्तर और हर जगह के कोण का पता लगाना है. इसके बाद, उस जानकारी का इस्तेमाल करके ऑगमेंटेड रिएलिटी (एआर) में जगहों को सही शीर्षक पर रखना है.

शीर्षक की गणना करने के लिए, आप Android यूटिलिटी लाइब्रेरी के लिए Maps SDK टूल का इस्तेमाल करेंगे. इसमें गोलाकार ज्यामिति के ज़रिए दूरी और शीर्षक की गणना करने के लिए कुछ हेल्पर फ़ंक्शन शामिल होते हैं. ज़्यादा जानकारी के लिए, लाइब्रेरी की यह खास जानकारी पढ़ें.

इसके बाद, आप यूटिलिटी लाइब्रेरी में sphericalHeading तरीके का इस्तेमाल करेंगे. यह दो LatLng ऑब्जेक्ट के बीच के शीर्षक/बीयरिंग की गिनती करता है. यह जानकारी Place.kt में बताए गए getPositionVector तरीके के अंदर चाहिए. यह तरीका आखिर में Vector3 ऑब्जेक्ट दिखाएगा. इसका इस्तेमाल हर PlaceNode, एआर (ऑगमेंटेड रिएलिटी) स्पेस में अपनी स्थानीय पोज़िशन के तौर पर करेगा.

आगे बढ़ें और उस तरीके में शीर्षक की परिभाषा को नीचे दिए गए तरीके से बदलें:

val heading = latLng.sphericalHeading(placeLatLng)

ऐसा करने से, नीचे बताए गए तरीके का मतलब होगा:

fun Place.getPositionVector(azimuth: Float, latLng: LatLng): Vector3 {
   val placeLatLng = this.geometry.location.latLng
   val heading = latLng.sphericalHeading(placeLatLng)
   val r = -2f
   val x = r * sin(azimuth + heading).toFloat()
   val y = 1f
   val z = r * cos(azimuth + heading).toFloat()
   return Vector3(x, y, z)
}

स्थानीय स्थिति

जब एआर (ऑगमेंटेड रिएलिटी) में PlaceNode ऑब्जेक्ट जोड़े जाते हैं, तो एआर (ऑगमेंटेड रिएलिटी) में जगहों को सही तरीके से घुमाने के लिए, आखिरी चरण में getPositionVector का नतीजा इस्तेमाल किया जाता है. आगे बढ़ें और MainActivity में addPlaces पर जाएं. यह लाइन हर placeNode पर होनी चाहिए जहां हर माता-पिता को सेट किया जाता है (placeNode.setParent(anchorNode) के ठीक नीचे). getPositionVector के localPosition को इस तरह कॉल करने के नतीजे पर सेट करें:

val placeNode = PlaceNode(this, place)
placeNode.setParent(anchorNode)
placeNode.localPosition = place.getPositionVector(orientationAngles[0], currentLocation.latLng)

डिफ़ॉल्ट रूप से, मेथड के getPositionVector वाले तरीके से नोड की y दूरी को एक मीटर पर सेट किया जाता है, जैसा कि getPositionVector तरीके मेंy की वैल्यू से बताया गया है. अगर आप यह दूरी घटाना या बढ़ाना चाहते हैं, तो दो मीटर कहें और ज़रूरत के हिसाब से वैल्यू में बदलाव करें.

इस बदलाव के साथ, जोड़े गए PlaceNode ऑब्जेक्ट को सही शीर्षक में दिखाना चाहिए. अब आगे बढ़ें और नतीजा देखने के लिए ऐप्लिकेशन चलाएं!

9. बधाई हो

इसमें शामिल होने के लिए बधाई!

ज़्यादा जानें