1. আপনি শুরু করার আগে
এই কোডল্যাব আপনাকে একটি সাধারণ অ্যান্ড্রয়েড অ্যাপ তৈরি করতে শেখায় যা Google মানচিত্র প্ল্যাটফর্ম নেভিগেশন SDK ব্যবহার করে একটি পূর্ব-কনফিগার করা গন্তব্যে নেভিগেট করতে।
আপনি শেষ হয়ে গেলে আপনার অ্যাপটি এমন দেখাবে।
পূর্বশর্ত
- কোটলিনে বেসিক অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্টের জ্ঞান
- মৌলিক Google Maps SDK ধারণা যেমন মানচিত্র, অবস্থান, স্থানাঙ্কের সাথে কিছু পরিচিতি।
আপনি কি শিখবেন
- গন্তব্যে নেভিগেট করতে নেভিগেশন SDK ব্যবহার করে একটি সাধারণ Android অ্যাপ কীভাবে তৈরি করবেন।
- দূরবর্তী Google Maven সংগ্রহস্থল থেকে নেভিগেশন SDK কিভাবে সংহত করবেন
- ন্যাভিগেশন SDK শেষ ব্যবহারকারীর শর্তাবলীর সাথে অবস্থানের অনুমতি এবং ব্যবহারকারীর চুক্তি কীভাবে পরিচালনা করবেন
- কিভাবে SDK শুরু করবেন
- কীভাবে একটি গন্তব্য সেট করবেন এবং নেভিগেশন নির্দেশিকা শুরু করবেন।
আপনি কি প্রয়োজন হবে
- অ্যান্ড্রয়েড স্টুডিওর সর্বশেষ স্থিতিশীল সংস্করণ ইনস্টল করা হয়েছে৷ এই কোডল্যাবটি অ্যান্ড্রয়েড স্টুডিও জেলিফিশ ব্যবহার করে তৈরি করা হয়েছে। আপনি যদি একটি ভিন্ন সংস্করণ ব্যবহার করেন, তাহলে ইন্টারফেস এবং উপাদানগুলির চেহারা এবং বিন্যাস পরিবর্তিত হতে পারে।
- বিলিং সক্ষম সহ একটি Google অ্যাকাউন্ট এবং প্রকল্প৷
- একটি Android ডিভাইস বিকাশকারী মোডে USB ডিবাগিং সক্ষম, অথবা একটি Android এমুলেটর। আপনি যেটি বেছে নিন তা অবশ্যই নেভিগেশন SDK-এর জন্য ন্যূনতম প্রয়োজনীয়তা পূরণ করবে
2. সেট আপ করুন
আপনার যদি ইতিমধ্যে একটি Google ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্ট না থাকে এবং বিলিং সক্ষম করা একটি প্রকল্প না থাকে, তাহলে Google মানচিত্র প্ল্যাটফর্মের সাথে শুরু করার নির্দেশাবলী অনুসরণ করে আপনার Google ক্লাউড প্রকল্প সেট আপ করুন https://developers.google.com/maps/gmp-get-started
কনসোলে আপনার Google ক্লাউড প্রকল্প নির্বাচন করুন
ক্লাউড কনসোলে , প্রকল্পের ড্রপ-ডাউন মেনুতে ক্লিক করুন এবং এই কোডল্যাবের জন্য আপনি যে প্রকল্পটি ব্যবহার করতে চান সেটি নির্বাচন করুন।
আপনার প্রকল্পে নেভিগেশন SDK সক্ষম করুন৷
Google ক্লাউড মার্কেটপ্লেসে এই কোডল্যাবের জন্য প্রয়োজনীয় Google মানচিত্র প্ল্যাটফর্ম API এবং SDK সক্ষম করুন৷
Google ক্লাউড কনসোলে APIs এবং পরিষেবাগুলি > লাইব্রেরিতে নেভিগেট করুন এবং "নেভিগেশন SDK" অনুসন্ধান করুন।
আপনি একটি অনুসন্ধান ফলাফল দেখতে হবে.
পণ্যের বিবরণ পৃষ্ঠা খুলতে নেভিগেশন SDK ফলাফলে ক্লিক করুন। আপনার প্রকল্পে SDK সক্ষম করতে সক্ষম বোতামটি ক্লিক করুন৷
Android এর জন্য Google Maps SDK-এর জন্য এই প্রক্রিয়াটি পুনরাবৃত্তি করুন।
একটি API কী তৈরি করুন
ক্লাউড কনসোলের শংসাপত্র পৃষ্ঠায় একটি API কী তৈরি করুন। আপনি Google মানচিত্র প্ল্যাটফর্মের সাথে শুরু করার কুইকস্টার্ট বিভাগের ধাপ 3-এর ধাপগুলি অনুসরণ করতে পারেন৷ Google মানচিত্র প্ল্যাটফর্মের সমস্ত অনুরোধের জন্য একটি API কী প্রয়োজন৷
3. নমুনা প্রকল্প ফাইল পান
এই বিভাগটি বর্ণনা করে কিভাবে এই কোডল্যাবের জন্য GitHub সংগ্রহস্থল থেকে ফাইল ক্লোন করে একটি মৌলিক খালি অ্যান্ড্রয়েড স্টুডিও প্রকল্প সেট আপ করতে হয়। গিথুব রেপোতে কোডল্যাব কোডের আগে এবং পরে সংস্করণ রয়েছে। কোডল্যাবটি একটি খালি প্রজেক্ট টেমপ্লেট দিয়ে শুরু হবে এবং শেষ অবস্থায় তৈরি হবে। আপনি যদি আটকে যান তবে আপনি রেপোতে সমাপ্ত প্রকল্পটি একটি রেফারেন্স হিসাবে ব্যবহার করতে পারেন।
এই কোডল্যাবের জন্য কোড পেতে এই Github রেপো ক্লোন করুন।
git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git
আপনার যদি গিট ইনস্টল না থাকে, কোডটি পেতে এই বোতামটি ক্লিক করুন:
যত তাড়াতাড়ি সম্ভব আপনাকে শুরু করতে, রেপোতে Starter
ফোল্ডারে কিছু স্টার্টার কোড রয়েছে যা আপনাকে এই কোডল্যাবের সাথে অনুসরণ করতে সহায়তা করবে। স্টার্টার প্রজেক্ট একটি বেসিক অ্যাপ UI এবং বিল্ড কনফিগারেশন প্রদান করে কিন্তু এতে নেভিগেশন SDK যোগ করা নেই। আপনি যেকোন সময় এগিয়ে যেতে বা আপনার অগ্রগতি পরীক্ষা করতে চাইলে একটি সমাপ্ত Solution
প্রকল্পও রয়েছে।
অ্যান্ড্রয়েড স্টুডিওতে ক্লোন করা রেপো খুলুন
একবার আপনি স্থানীয়ভাবে রেপো ক্লোন করার পরে, একটি বিদ্যমান প্রকল্প হিসাবে Starter
ফোল্ডারটি খুলতে অ্যান্ড্রয়েড স্টুডিও ব্যবহার করুন।
- অ্যান্ড্রয়েড স্টুডিওতে স্বাগতম ডায়ালগ থেকে, খুলুন বোতামে ক্লিক করুন।
- যে ফোল্ডারে আপনি ক্লোন করা রেপো সংরক্ষণ করেছেন সেখানে নেভিগেট করুন এবং শীর্ষ স্তরের "
codelab-navigation-101-android-kotlin
" ফোল্ডারের ভিতরেStarter
ফোল্ডারটি নির্বাচন করুন৷ - প্রকল্পটি তৈরি এবং রান করে তা পরীক্ষা করুন।
একটি ভার্চুয়াল ডিভাইস যোগ করুন, বা একটি হার্ডওয়্যার ডিভাইস সংযোগ করুন
আপনার কম্পিউটারে একটি অ্যান্ড্রয়েড ডিভাইস সংযোগ করতে, একটি হার্ডওয়্যার ডিভাইসে অ্যাপগুলি কীভাবে চালাতে হয় সে সম্পর্কে Android স্টুডিও নির্দেশাবলী অনুসরণ করুন। বিকল্পভাবে, আপনি Android ভার্চুয়াল ডিভাইস (AVD) ম্যানেজার ব্যবহার করে একটি ভার্চুয়াল ডিভাইস কনফিগার করতে পারেন। একটি এমুলেটর নির্বাচন করার সময়, নিশ্চিত করুন যে আপনি এমন একটি ছবি বাছাই করেছেন যাতে Google API গুলি অন্তর্ভুক্ত থাকে৷
অ্যান্ড্রয়েড স্টুডিওতে, রান মেনু বিকল্প বা প্লে বোতাম আইকনে ক্লিক করুন। অনুরোধ হিসাবে একটি ডিভাইস চয়ন করুন.
4. আপনার অ্যাপে নেভিগেশন SDK যোগ করুন
আপনার প্রকল্পে নেভিগেশন SDK লাইব্রেরি এবং আপনার API কী যোগ করুন
আপনার অ্যাপে নেভিগেশন SDK লাইব্রেরি যোগ করতে, Google Maven সংগ্রহস্থল থেকে নেভিগেশন SDK আনতে এবং একটি সংস্করণ নম্বর কনফিগার করতে আপনাকে আপনার অ্যাপ-স্তরের build.gradle.kts
সংশোধন করতে হবে।
নেভিগেশন SDK সংস্করণ নম্বর সংরক্ষণ করতে আপনার বিল্ড কনফিগারে একটি ভেরিয়েবল তৈরি করুন।
আপনার অ্যাপে ব্যবহৃত ন্যাভিগেশন SDK-এর সংস্করণের মান ধারণ করতে আপনার অ্যাপ-স্তরের build.gradle.kts
এ একটি ভেরিয়েবল সেট আপ করুন, যাতে ভবিষ্যতে সর্বশেষ সংস্করণে পরিবর্তন করা সহজ হয়।
সর্বশেষ সংস্করণ নম্বরের জন্য নেভিগেশন SDK রিলিজ নোটগুলি পরীক্ষা করুন৷
val navSdkVersion by extra("6.0.0")
আপনি ফাইল > প্রজেক্ট স্ট্রাকচার > ভেরিয়েবলে পাওয়া ডায়ালগ ব্যবহার করে এই এবং অন্যান্য ভেরিয়েবলের মান পরিবর্তন করতে পারেন:
বিল্ড কনফিগারেশনে একটি নির্ভরতা যোগ করুন
এখন আপনার অ্যাপ-লেভেল build.gradle.kts.
ব্যবহৃত সংস্করণটি হবে ${navSdkVersion}
এর মান যা আপনি এইমাত্র আপনার অ্যাপ-লেভেল build.gradle.kts
এ সেট করেছেন :
dependencies {
// Include the Google Navigation SDK.
api("com.google.android.libraries.navigation:navigation:${navSdkVersion}")
...
আপনার API কী যোগ করুন
API কী পরিচালনা করতে Secrets Gradle প্লাগইন ব্যবহার করুন
আপনার অ্যাপে API কী নিরাপদে পরিচালনা করতে আমরা সিক্রেটস গ্রেডল প্লাগইন ব্যবহার করার পরামর্শ দিই। প্লাগইনটি আপনার শীর্ষ স্তরের build.gradle.kts
ফাইলে নির্ভরতা হিসাবে প্রাথমিক প্রকল্প টেমপ্লেটে যোগ করা হয়েছে।
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
//... other plugin definitions here
}
আপনার শীর্ষ-স্তরের ডিরেক্টরিতে secrets.properties
ফাইলটি খুলুন এবং তারপরে আপনার API কী দিয়ে YOUR_API_KEY
প্রতিস্থাপন করুন। এই ফাইলে আপনার কী সংরক্ষণ করুন কারণ secrets.properties
একটি সংস্করণ নিয়ন্ত্রণ সিস্টেমে চেক করা থেকে বাদ দেওয়া হয়েছে৷
MAPS_API_KEY=YOUR_API_KEY
এই বিষয়ে আরও তথ্যের জন্য, নেভিগেশন SDK ডকুমেন্টেশনে আপনার অ্যাপে API কী যোগ করুন দেখুন।
local.defaults.properties এর বিষয়বস্তু যাচাই করুন
খালি প্রজেক্টে আপনার শীর্ষ-স্তরের ডিরেক্টরিতে একটি local.defaults.properties
ফাইল রয়েছে, secrets.properties
ফাইলের মতো একই ফোল্ডার। এটি খুলুন এবং নিম্নলিখিত কোডটি পর্যবেক্ষণ করুন।
MAPS_API_KEY=DEFAULT_API_KEY
এটি MAPS_API_KEY
সম্পত্তির জন্য একটি ব্যাকআপ মান প্রদান করার জন্য বিদ্যমান যদি প্রকল্পে secrets.properties
যোগ করা না হয়, যাতে বিল্ডগুলি ব্যর্থ না হয়। এই ফাইলটি সম্পাদনা করার কোন প্রয়োজন নেই। MAPS_API_KEY
এর secrets.properties
সংজ্ঞা পাওয়া না গেলে ডিফল্ট মানটি একটি API কী ত্রুটি সহ রানটাইমে অ্যাপটি চলা বন্ধ করবে।
Android ম্যানিফেস্ট আপনার নির্দিষ্ট করা API কী ব্যবহার করছে কিনা তা পরীক্ষা করুন
অ্যাপ/src/main/AndroidManifest.xml খুলুন। আপনি লক্ষ্য করবেন যে MAPS_API_KEY
বৈশিষ্ট্যটি অ্যাপ্লিকেশনটির জন্য API কী সেট করতে ব্যবহৃত হয়:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
আপনার অ্যাপ-লেভেল build.gradle.kts
ফাইল খুলুন এবং secrets
সম্পত্তি খুঁজুন।
প্লাগইনটির propertiesFileName
সেটিং secrets.properties
এ সেট করা উচিত এবং defaultPropertiesFileName
local.defaults.properties
পড়তে হবে।
secrets {
// Optionally specify a different file name containing your secrets.
// The plugin defaults to "local.properties"
propertiesFileName = "secrets.properties"
// A properties file containing default secret values. This file can be
// checked in version control.
defaultPropertiesFileName = "local.defaults.properties"
}
সমস্ত ফাইল সংরক্ষণ করুন এবং Gradle এর সাথে আপনার প্রকল্প সিঙ্ক করুন।
5. অ্যাপের অনুমতি কনফিগার করুন এবং একটি মৌলিক UI যোগ করুন
সুনির্দিষ্ট অবস্থানের অনুমতি অনুরোধ করুন
নেভিগেশন SDK কাজ করার জন্য GPS সংকেতের উপর নির্ভর করে, তাই আপনার অ্যাপটিকে ব্যবহারকারীকে সুনির্দিষ্ট অবস্থানের ডেটাতে অ্যাক্সেস দেওয়ার জন্য জিজ্ঞাসা করতে হবে। AndroidManifest.xml-এ <manifest>
এলিমেন্টের চাইল্ড হিসেবে সুনির্দিষ্ট অবস্থান অ্যাক্সেস করার অনুমতি যোগ করুন।
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
/>
</manifest>
আপনি Android বিকাশকারী ডকুমেন্টেশনের অনুরোধ অবস্থানের অনুমতি বিভাগে Android অবস্থানের অনুমতি সম্পর্কে আরও পড়তে পারেন৷
একটি Android 14 ডিভাইসে আপনার অ্যাপ চালানোর জন্য, সুনির্দিষ্ট অবস্থান অ্যাক্সেস অনুমতির মতো একই স্থানে নিম্নলিখিত uses-permission
ট্যাগ যোগ করে ফোরগ্রাউন্ড পরিষেবা লোকেশন অনুমতির জন্য অনুরোধ করুন:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
একটি মৌলিক UI সহ একটি লঞ্চ কার্যকলাপ যোগ করুন৷
যখন আপনার অ্যাপটি চলে, তখন ব্যবহারকারী তাদের অবস্থান অ্যাক্সেস করার অনুমতি দিয়েছে কিনা তা পরীক্ষা করার জন্য স্টার্ট আপের সময় কার্যকর করা কোডের প্রয়োজন হবে এবং প্রতিটি সম্ভাব্য পরিস্থিতি পরিচালনা করার জন্য অনুমতির অনুরোধ করা হবে যদি এটি এখনও মঞ্জুর করা না হয়। এটি করতে, আপনার অ্যাপে একটি মৌলিক ব্যবহারকারী ইন্টারফেস যোগ করুন। এই কোডল্যাবটি UI ব্যবহার করে যা আপনি যখন Android স্টুডিওতে একটি নতুন, খালি ভিউ অ্যাক্টিভিটি তৈরি করেন তখন তৈরি হয়। নেভিগেশন UI-এর কার্যকলাপে কোড যোগ করার আগে অবস্থানের অনুমতি পরীক্ষা করার জন্য আপনি এটিকে মানিয়ে নেবেন।
কোড এডিটরে MainActivity.kt
ফাইলটি খুলুন এবং কোডটি পরিদর্শন করুন, যা একটি মৌলিক UI দেখায়।
রানটাইমে অবস্থান অ্যাক্সেস অনুমতি অনুরোধ
নেভিগেশন SDK শুরু হওয়ার আগে আপনার অ্যাপটিকে সুনির্দিষ্ট অবস্থান অ্যাক্সেস করার অনুরোধটি ট্রিগার করতে হবে।
আপনার অ্যাপ শুরু হলে এই চেকটি নিশ্চিত করতে, আপনার কার্যকলাপের ওভাররাইডেড onCreate()
পদ্ধতিতে আপনার MainActivity
ক্লাসে কিছু কোড যোগ করুন।
নিম্নলিখিত কোড ব্যবহারকারী সূক্ষ্ম অবস্থানের অনুমতি প্রদান করেছে কিনা তা পরীক্ষা করে। যদি না হয়, এটি অনুমতি অনুরোধ করে. আপনার onCreate()
পদ্ধতিতে এই কোডটি যোগ করুন।
val permissions =
if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
arrayOf(permission.ACCESS_FINE_LOCATION, permission.POST_NOTIFICATIONS)
} else {
arrayOf(permission.ACCESS_FINE_LOCATION)
}
if (permissions.any { !checkPermissionGranted(it) }) {
if (permissions.any { shouldShowRequestPermissionRationale(it) }) {
// Display a dialogue explaining the required permissions.
}
val permissionsLauncher =
registerForActivityResult(
RequestMultiplePermissions(),
{ permissionResults ->
if (permissionResults.getOrDefault(permission.ACCESS_FINE_LOCATION, false)) {
onLocationPermissionGranted()
} else {
finish()
}
},
)
permissionsLauncher.launch(permissions)
} else {
android.os.Handler(Looper.getMainLooper()).postDelayed({ onLocationPermissionGranted() }, SPLASH_SCREEN_DELAY_MILLIS)
}
}
private fun checkPermissionGranted(permissionToCheck: String): Boolean =
ContextCompat.checkSelfPermission(this, permissionToCheck) == PackageManager.PERMISSION_GRANTED
আপনার MainActivity
ক্লাসে একটি নতুন ফাংশন যোগ করুন, যাকে বলা হয় onLocationPermissionGranted
, যা ব্যবহারকারী তাদের অবস্থান শেয়ার করার অনুমতি দিলে ফলাফল পরিচালনা করবে। পরবর্তী ধাপে আমরা একটি নতুন নেভিগেশন কার্যকলাপ চালু করতে এখানে কোড যোগ করব।
private fun onLocationPermissionGranted() {
//code to initialize Navigation SDK will go here
}
আপনার প্রকল্প তৈরি করুন. আপনার যদি কোনও বিল্ড ত্রুটি থাকে তবে সেগুলি খুঁজে বের করুন এবং ঠিক করুন।
একটি নতুন ভার্চুয়াল ডিভাইসে আপনার প্রকল্প চালান. অ্যাপটি ইনস্টল এবং শুরু হলে অনুমতির অনুরোধের ডায়ালগটি আপনার দেখতে হবে।
6. একটি নেভিগেশন ইউজার ইন্টারফেস যোগ করুন
একটি নেভিগেশন UI যোগ করার দুটি উপায় আছে: SupportNavigationFragment
বা NavigationView
।
সরলতার জন্য কোডল্যাব একটি NavigationView
ব্যবহার করে।
লেআউট সম্পাদনা করুন
নেভিগেশন ভিউ-এর জন্য লেআউট যোগ করতে res/layout/activity_main.xml
সম্পাদনা করুন।
- ফাইলটি খুলুন এবং কোড ভিউতে স্যুইচ করুন।
- নীচের উদাহরণের মতো একটি
RelativeLayout
ভিতরে একটিNavigationView
এর একটি নতুন লেআউট দিয়ে ফাইলের সম্পূর্ণ বিষয়বস্তু প্রতিস্থাপন করুন। আপনি যেমন অ্যাপে একটি নেভিগেশন ভিউ যোগ করবেন, একটি সাধারণ লেআউট করবে। - আপনার নেভিগেশন ভিউকে "
@+id/navigation_view
" এর একটি আইডি দিন।
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.libraries.navigation.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
নেভিগেশন কার্যকলাপ সেট আপ করুন
অ্যান্ড্রয়েড স্টুডিওতে, এডিটরে MainActivity.kt ফাইলটি খুলুন।
আপনার অ্যাপে সঠিকভাবে নেভিগেশন অভিজ্ঞতা ফাংশন নিশ্চিত করতে কিছু মৌলিক সেটআপ কোড যোগ করুন। MainActivity.kt ফাইলে, নিম্নলিখিত পরিবর্তনগুলি করুন:
- আপনার
NavigationView
রেফারেন্স করতে আপনারMainActivity
ক্লাসে একটি পরিবর্তনশীল ঘোষণা করুন:
private lateinit var navView: NavigationView
- আপনার
NavigationView
তে একটি রেফারেন্স পেতেonCreate()
পদ্ধতিতে কিছু কোড যোগ করুন:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
- নেভিগেশন নির্দেশিকা চলাকালীন স্ক্রীন চালু থাকে তা নিশ্চিত করতে
onCreate()
পদ্ধতিতে কিছু কোড যোগ করুন:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
- আপনার
NavigationView
এর আইডি উল্লেখ করতেViewCompat.setOnApplyWindowInsetsListener
কল করার কোডটি সম্পাদনা করুন।
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.navigation_view)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
- ব্যবহারকারীকে প্রতিক্রিয়া দেখানোর জন্য ক্লাসে একটি
showToast()
পদ্ধতি যোগ করুন:
private fun showToast(errorMessage: String) {
Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show()
}
7. নেভিগেশন SDK শুরু করুন৷
এখন যেহেতু আপনি মৌলিক নেভিগেশন কার্যকলাপ সেটআপ সম্পন্ন করেছেন, আপনি নেভিগেশন SDK শুরু করতে পারেন। এটি করার জন্য, আপনার MainActivity.kt ফাইলে নিম্নলিখিত কোড যোগ করুন:
/** Starts the Navigation API, capturing a reference when ready. */
@SuppressLint("MissingPermission")
private fun initializeNavigationApi() {
NavigationApi.getNavigator(
this,
object : NavigatorListener {
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
// code to start guidance will go here
}
override fun onError(@NavigationApi.ErrorCode errorCode: Int) {
when (errorCode) {
NavigationApi.ErrorCode.NOT_AUTHORIZED -> {
// Note: If this message is displayed, you may need to check that
// your API_KEY is specified correctly in AndroidManifest.xml
// and is been enabled to access the Navigation API
showToast(
"Error loading Navigation API: Your API key is " +
"invalid or not authorized to use Navigation."
)
}
NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED -> {
showToast(
"Error loading Navigation API: User did not " +
"accept the Navigation Terms of Use."
)
}
else -> showToast("Error loading Navigation API: $errorCode")
}
}
},
)
}
এই কোডটি initializeNavigationApi()
নামে একটি নতুন পদ্ধতি তৈরি করে। এই পদ্ধতিটি NavigationApi.getNavigator()
কল করে একটি Navigator
অবজেক্টের একটি রেফারেন্স পায় এবং কলব্যাক পরিচালনা করার জন্য একটি NavigatorListener
প্রয়োগ করে।
লক্ষ্য করুন যে যখন নেভিগেশন এপিআই আরম্ভ করা হয় তখন NavigationListener.onNavigatorReady
পদ্ধতিটি চালু করা হবে, একটি Navigator
অবজেক্ট একটি প্যারামিটার হিসাবে পাস করে। উপরের কোডটি এই পদ্ধতিতে পাস করা প্রারম্ভিক Navigator
অবজেক্টের সাথে আপনি আগে ঘোষিত mNavigator
ভেরিয়েবল আপডেট করবে।
সবশেষে, onLocationPermissionGranted
পদ্ধতি থেকে আপনার initializeNavigationApi
পদ্ধতিতে একটি কল যোগ করুন।
private fun onLocationPermissionGranted() {
initializeNavigationApi()
}
8. মূল নেভিগেশন ইভেন্টের জন্য শ্রোতাদের যোগ করুন
যখন আপনার ব্যবহারকারীরা নির্দেশিকা অনুসরণ করে, তখন নেভিগেশন SDK এমন ইভেন্টগুলি চালাবে যা অ্যাপটিকে পথের মূল অবস্থার পরিবর্তনগুলি সম্পর্কে অবহিত করতে পারে, যেমন ব্যবহারকারী যখন পুনরায় রুট করে বা তাদের গন্তব্যে পৌঁছায়। MainActivity.kt ফাইলে, এই ইভেন্টগুলি পরিচালনা করতে শ্রোতাদের যোগ করুন:
-
MainActivity
ক্লাসের মধ্যে, ইভেন্ট লিসেনার অবজেক্টের উল্লেখ করার জন্য দুটি ভেরিয়েবল ঘোষণা করুন:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
- ন্যাভিগেটর শুরু হলে শ্রোতাদের সেট আপ করতে একটি
registerNavigationListeners()
পদ্ধতি যোগ করুন। যখন আগমন ইভেন্টটি চালু করা হয় তখন এই পদ্ধতিটিNavigator.clearDestinations()
NavigationView
রিসেট করতে কল করে:
/**
* Registers a number of example event listeners that show an on screen message when certain
* navigation events occur (e.g. the driver's route changes or the destination is reached).
*/
private fun registerNavigationListeners() {
withNavigatorAsync {
arrivalListener =
Navigator.ArrivalListener { // Show an onscreen message
showToast("User has arrived at the destination!")
mNavigator?.clearDestinations()
}
mNavigator?.addArrivalListener(arrivalListener)
routeChangedListener =
Navigator.RouteChangedListener { // Show an onscreen message when the route changes
showToast("onRouteChanged: the driver's route changed")
}
mNavigator?.addRouteChangedListener(routeChangedListener)
}
}
-
initializeNavigationApi
পদ্ধতিতেonNavigatorReady
কলব্যাক কোড থেকেregisterNavigationListeners()
জন্য একটি কল যোগ করুন:
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
//listen for events en route
registerNavigationListeners()
}
- ইউজার ইন্টারফেস কনফিগার করুন। নির্দেশিকা চলাকালীন আপনি নেভিগেশন ব্যবহারকারী ইন্টারফেসের বিভিন্ন দিক নিয়ন্ত্রণ করতে পারেন। একটি গুরুত্বপূর্ণ কাস্টমাইজেশন হল ক্যামেরা অবস্থান। নিচের মত
onNavigatorReady
এnavigator
অবজেক্ট রিটার্নেরsetTaskRemovedBehaviour
পদ্ধতিতে একটি কল যোগ করুন। অ্যাপটি সোয়াইপ করা হলে এটি নির্দেশিকা এবং বিজ্ঞপ্তি বন্ধ করবে:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
- একটি
CameraPerspective
নির্দিষ্ট করতেGoogleMap.followMyLocation
এ একটি কল যোগ করুন।GoogleMap
নিচের মতNavigatorView.getMapAsync()
পদ্ধতির মাধ্যমে অ্যাক্সেস করা হয়:
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
- অ্যাপ লাইফসাইকেল জুড়ে নেভিগেশন ফাংশন সুচারুভাবে কাজ করে তা নিশ্চিত করতে, আপনার
MainActivity
ক্লাসে নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করুন:
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
navView.onSaveInstanceState(savedInstanceState)
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
navView.onTrimMemory(level)
}
override fun onStart() {
super.onStart()
navView.onStart()
}
override fun onResume() {
super.onResume()
navView.onResume()
}
override fun onPause() {
navView.onPause()
super.onPause()
}
override fun onConfigurationChanged(configuration: Configuration) {
super.onConfigurationChanged(configuration)
navView.onConfigurationChanged(configuration)
}
override fun onStop() {
navView.onStop()
super.onStop()
}
override fun onDestroy() {
navView.onDestroy()
withNavigatorAsync {
// Unregister event listeners to avoid memory leaks.
if (arrivalListener != null) {
navigator.removeArrivalListener(arrivalListener)
}
if (routeChangedListener != null) {
navigator.removeRouteChangedListener(routeChangedListener)
}
navigator.simulator?.unsetUserLocation()
navigator.cleanup()
}
super.onDestroy()
}
9. একটি গন্তব্য সেট করুন
আপনি এখন একটি গন্তব্য সেট করতে এবং নেভিগেশন নির্দেশিকা শুরু করতে প্রস্তুত৷ MainActivity.kt ফাইলে, নিম্নলিখিত পরিবর্তনগুলি করুন:
- একটি নতুন
navigateToPlace()
পদ্ধতি যোগ করুন যা নেভিগেশন গন্তব্য সেট করে এবং একটিplaceId
প্যারামিটার গ্রহণ করে।
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {
}
- আপনার
navigateToPlace()
পদ্ধতিতে, পদ্ধতিতে পাস করা Place ID থেকে একটিWaypoint
তৈরি করতেWaypoint.builder()
পদ্ধতি ব্যবহার করুন।UnsupportedPlaceIdException
PlaceIdException যা এটি নিক্ষেপ করতে পারে তা পরিচালনা করুন, এমন পরিস্থিতিতে যেখানে প্লেস আইডি একটি সুনির্দিষ্ট ঠিকানায় সমাধান করে না:
val waypoint: Waypoint? =
// Set a destination by using a Place ID (the recommended method)
try {
Waypoint.builder().setPlaceIdString(placeId).build()
} catch (e: Waypoint.UnsupportedPlaceIdException) {
showToast("Place ID was unsupported.")
return
}
- Waypoint ব্যবহার করে একটি গন্তব্য সেট করতে আপনার
navigateToPlace()
পদ্ধতিতে নিম্নলিখিত কোড যোগ করুন:
val pendingRoute = mNavigator?.setDestination(waypoint)
// Set an action to perform when a route is determined to the destination
pendingRoute?.setOnResultListener { code ->
when (code) {
RouteStatus.OK -> {
// Code to start guidance will go here
}
RouteStatus.ROUTE_CANCELED -> showToast("Route guidance canceled.")
RouteStatus.NO_ROUTE_FOUND,
RouteStatus.NETWORK_ERROR ->
// TODO: Add logic to handle when a route could not be determined
showToast("Error starting guidance: $code")
else -> showToast("Error starting guidance: $code")
}
}
Navigator
অবজেক্টের একটি setDestinations()
পদ্ধতি রয়েছে যা বিভিন্ন প্যারামিটার নিতে পারে। সবচেয়ে মৌলিক বিকল্প হল একটি Waypoint
সরবরাহ করা। এটি ডিফল্ট DRIVING
এর একটি ভ্রমণ মোডে থাকবে, যা 4 চাকার গাড়ির জন্য উপযুক্ত৷ setDestinations()
পদ্ধতি একটি RouteStatus
অবজেক্ট ধারণকারী ListenableResultFuture
অবজেক্ট প্রদান করে। RouteStatus
গন্তব্যে একটি রুট পাওয়া গেছে কিনা তা নির্দেশ করবে এবং যদি না হয় তবে আপনাকে বিভিন্ন ত্রুটির অবস্থা পরিচালনা করার অনুমতি দেবে।
- নেভিগেশন ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে অতিরিক্ত কনফিগারেশন পরিবর্তন করুন:
// Hide the toolbar to maximize the navigation UI
supportActionBar?.hide()
// Enable voice audio guidance (through the device speaker)
mNavigator?.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE)
// Simulate vehicle progress along the route (for demo/debug builds)
if (BuildConfig.DEBUG) {
mNavigator?.simulator?.simulateLocationsAlongExistingRoute(
SimulationOptions().speedMultiplier(5f)
)
}
এই পরিবর্তনগুলির মধ্যে নিম্নলিখিত উন্নতিগুলি অন্তর্ভুক্ত রয়েছে:
- নেভিগেশন UI এর জন্য স্থান সর্বাধিক করার জন্য অ্যাকশন বারটি লুকানো।
- সতর্কতা এবং নেভিগেশন নির্দেশাবলী বলতে অডিও নির্দেশিকা সক্ষম করা হচ্ছে।
- একটি গতি গুণক নির্দিষ্ট করে ডিবাগিংয়ের জন্য সিমুলেটর সেট আপ করা হচ্ছে।
- একটি প্লেস আইডি খুঁজুন যা আপনার গন্তব্য হিসেবে কাজ করবে। আদর্শভাবে এটি ব্যবহারকারীর অবস্থান থেকে খুব বেশি দূরে হবে না। Google মানচিত্র প্ল্যাটফর্ম প্লেস আইডি ফাইন্ডার ইউটিলিটি ব্যবহার করুন বা একটি Places API কল থেকে একটি Place ID প্রাপ্ত করুন৷
আপনি যদি ন্যাভিগেশন অনুকরণ করেন তবে আপনি কোডে ব্যবহারকারীর অবস্থান সেট করতে পারেন বা আপনার সংযুক্ত ডিভাইস থেকে এটি নিতে পারেন। কোডল্যাব ধরে নেবে আপনি লন্ডন, ইউকেতে একটি অবস্থান অনুকরণ করছেন।
- একটি প্রারম্ভিক অবস্থান এবং একটি স্থান আইডি সংরক্ষণ করতে আপনার
MainActivity
ক্লাসে একটি সহচর বস্তু যোগ করুন৷ কোডল্যাব লন্ডনে একটি স্টার্ট লোকেশন এবং ট্রাফালগার স্কোয়ারের প্লেস আইডি ব্যবহার করবে:
companion object{
const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
val startLocation = LatLng(51.345678, -0.1234456)
}
-
initializeNavigationApi
পদ্ধতির ভিতরেonNavigatorReady
কলব্যাক থেকে আপনারnavigateToPlace()
পদ্ধতিতে একটি কল যোগ করুন এবং যুক্তির একটি শাখা যোগ করুন যা ডিবাগ মোডে কার্যকর হবে, যা ব্যবহারকারীর অবস্থান নির্ধারণ করে:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
mNavigator = navigator
if (BuildConfig.DEBUG) {
mNavigator?.simulator?.setUserLocation(MainActivity.startLocation)
}
//listen for events en route
registerNavigationListeners()
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
//navigate to a destination
navigateToPlace(MainActivity.TRAFALGAR_SQUARE)
10. আপনার কোড তৈরি করুন এবং চালান
আপনি যখন প্রথমবার অ্যাপটি চালাবেন, আপনাকে অ্যাপটিকে অবস্থানের অনুমতি দিতে হবে এবং নেভিগেশন SDK ব্যবহারের শর্তাবলী মেনে নিতে হবে।
দ্রষ্টব্য: অ্যাপটি চালালে setDestinations() পদ্ধতিতে কল করা হবে যা ব্যবহার করা প্রথম 1000টি গন্তব্যের পরে চার্জ লাগে। আরও তথ্যের জন্য ব্যবহার এবং বিলিং দেখুন।
অবস্থান নির্ধারণ করা হচ্ছে
ডিফল্টরূপে অনুকরণ করা ডিভাইসটির অবস্থান মাউন্টেন ভিউ ক্যালিফোর্নিয়ার Google ক্যাম্পাসে সেট করা থাকতে পারে, যদি না আপনি কোডে একটি অবস্থান সেট করেন বা এমুলেটর বৈশিষ্ট্য ডায়ালগ ব্যবহার করেন।
যদি তাই হয়, তাহলে আপনি দেখতে পাবেন যে অ্যাপটি আপনার কনফিগার করা প্লেস আইডির কোনো রুট খুঁজে পাচ্ছে না (ডিফল্টরূপে, Sydney Opera House, Sydney, Australia)। এটি আপনার showToast()
পদ্ধতি দ্বারা প্রদর্শিত "কোন পথ পাওয়া যায়নি" উল্লেখ করে একটি বার্তা দ্বারা নির্দেশিত হবে।
শুরুর অবস্থানে কোড করা কঠিন
কোডে একটি ভিন্ন অবস্থান সেট করতে, mNavigator.startGuidance()
এ কল করার আগে MainActivity.kt-এ আপনার navigateToPlace()
পদ্ধতিতে নিম্নলিখিত লাইনটি যোগ করুন:
mNavigator?.simulator?.setUserLocation(startLocation)
আপনার পছন্দের একটি ডিফল্ট অবস্থানে এমুলেটর শুরু করা হচ্ছে
ডিভাইস এমুলেটরে একটি ভিন্ন অবস্থান সেট করতে, এমুলেটরটি চালু না হলে এটি চালু করুন এবং টুলটিপ "এক্সটেন্ডেড কন্ট্রোলস" সহ 3 ডট মেনুতে ক্লিক করুন। যে ডায়ালগটি খোলে তাতে "অবস্থান" এর জন্য একটি মেনু বিকল্প রয়েছে।
উদাহরণস্বরূপ, আপনি যদি গন্তব্য হিসেবে সিডনি অপেরা হাউসের প্লেস আইডি ব্যবহার করেন, তাহলে অস্ট্রেলিয়ার সিডনিতে একটি অবস্থান বেছে নিন। উদাহরণস্বরূপ, "বন্ডি সমুদ্র সৈকত" অনুসন্ধান করুন, একটি পরামর্শ নির্বাচন করুন এবং ডায়ালগের নীচে ডানদিকে "অবস্থান সংরক্ষণ করুন" এ ক্লিক করুন। ভবিষ্যতে ব্যবহারের জন্য একটি সংরক্ষিত তালিকায় অবস্থান যোগ করতে আপনি "সেভ পয়েন্ট" এ ক্লিক করতে পারেন।
আপনি যদি গন্তব্য হিসাবে একটি ভিন্ন স্থান আইডি সেট করেন, তাহলে এটির কাছাকাছি একটি অবস্থান চয়ন করুন যাতে সিমুলেটেড রুটটি বাস্তবসম্মত হয় এবং সহজ ডিবাগিংয়ের জন্য খুব বেশি দীর্ঘ না হয়।
অ্যাপটি পুনরায় চালু করুন এবং এটি এখন গন্তব্যে নেভিগেট করা উচিত।
11. অভিনন্দন!
আপনি এই কোডল্যাব সম্পূর্ণ করেছেন। ভাল হয়েছে - আপনি আপনার গন্তব্যে পৌঁছেছেন! শুভ কোডিং :-)
12. এটিকে আরও এগিয়ে নিয়ে যাওয়া
আপনি যদি আপনার অ্যাপ ডেভেলপমেন্টকে আরও এগিয়ে নিতে চান, তাহলে অনুপ্রেরণার জন্য নিম্নলিখিত বিষয়গুলি দেখুন।
- আরও নেভিগেশন ইভেন্টের জন্য শুনুন । যদি ড্রাইভার পুনরায় রুট করে, বা যখন তারা আসে তখন একটি বার্তা প্রদর্শন করতে কোড যোগ করুন।
- নেভিগেশন ইন্টারফেস কাস্টমাইজ করুন ।
- আপনি যদি একটি বড় চ্যালেঞ্জ পছন্দ করেন, তাহলে ব্যবহারকারীকে গন্তব্য সেট করার অনুমতি দেওয়ার জন্য আপনি একটি Places API প্লেস পিকার নিয়ন্ত্রণ যোগ করতে পারেন কিনা দেখুন৷ ইঙ্গিত: Github-এ নেভিগেশন SDK ডেমো অ্যাপগুলির একটি নমুনা বাস্তবায়ন রয়েছে৷
- Github-এ ন্যাভিগেশন SDK ডেমো অ্যাপে ব্যবহৃত পন্থা অবলম্বন করে ন্যাভিগেটর এবং GoogleMap অবজেক্টকে অ্যাসিঙ্ক্রোনাসভাবে কল করার সম্ভাব্য সমস্যাগুলি প্রতিরোধ করুন। আরও জটিল অ্যাপের পরিস্থিতিতে, আপনার কোড চলাকালীন এই অবজেক্টগুলি আরম্ভ করা শেষ নাও হতে পারে। পরামর্শ: খুব দ্রুত বাস্তবায়নের জন্য আপনি আপনার MainActivity.kt ফাইলের শেষে InitializedNavScope ক্লাস যোগ করতে পারেন।