Android এর জন্য Places SDK দিয়ে শুরু করুন (Kotlin)

1. আপনি শুরু করার আগে

এই কোডল্যাব আপনাকে শেখায় কিভাবে আপনার অ্যাপের সাথে Android এর জন্য Places SDK-কে একীভূত করতে হয় এবং প্রতিটি Places SDK বৈশিষ্ট্যগুলি ব্যবহার করতে হয়৷

স্থান ডেমো অ্যাপ্লিকেশন

পূর্বশর্ত

  • কোটলিন এবং অ্যান্ড্রয়েড বিকাশের প্রাথমিক জ্ঞান

আপনি কি শিখবেন

  • কোটলিন এক্সটেনশন সহ Android এর জন্য স্থান SDK কিভাবে ইনস্টল করবেন।
  • একটি নির্দিষ্ট স্থানের জন্য স্থানের বিবরণ কীভাবে লোড করবেন।
  • কীভাবে আপনার অ্যাপে একটি স্থান স্বয়ংসম্পূর্ণ উইজেট যোগ করবেন।
  • ডিভাইসের বর্তমানে রিপোর্ট করা অবস্থানের উপর ভিত্তি করে বর্তমান স্থানটি কীভাবে লোড করবেন।

আপনি কি প্রয়োজন হবে

এই কোডল্যাবটি সম্পূর্ণ করতে, আপনার নিম্নলিখিত অ্যাকাউন্ট, পরিষেবা এবং সরঞ্জামগুলির প্রয়োজন হবে:

2. সেট আপ করুন

নীচের সক্রিয়করণ পদক্ষেপের জন্য, স্থান API সক্ষম করুন৷

Google Maps প্ল্যাটফর্ম সেট আপ করুন

আপনার যদি ইতিমধ্যেই একটি Google ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্ট না থাকে এবং বিলিং সক্ষম করা একটি প্রকল্প থাকে, তাহলে অনুগ্রহ করে একটি বিলিং অ্যাকাউন্ট এবং একটি প্রকল্প তৈরি করতে Google মানচিত্র প্ল্যাটফর্মের সাথে শুরু করা নির্দেশিকাটি দেখুন৷

  1. ক্লাউড কনসোলে , প্রকল্পের ড্রপ-ডাউন মেনুতে ক্লিক করুন এবং এই কোডল্যাবের জন্য আপনি যে প্রকল্পটি ব্যবহার করতে চান সেটি নির্বাচন করুন।

  1. Google ক্লাউড মার্কেটপ্লেসে এই কোডল্যাবের জন্য প্রয়োজনীয় Google মানচিত্র প্ল্যাটফর্ম API এবং SDK সক্ষম করুন৷ এটি করতে, এই ভিডিও বা এই ডকুমেন্টেশনের ধাপগুলি অনুসরণ করুন৷
  2. ক্লাউড কনসোলের শংসাপত্র পৃষ্ঠায় একটি API কী তৈরি করুন। আপনি এই ভিডিও বা এই ডকুমেন্টেশনের ধাপগুলি অনুসরণ করতে পারেন। Google মানচিত্র প্ল্যাটফর্মের সমস্ত অনুরোধের জন্য একটি API কী প্রয়োজন৷

3. দ্রুত শুরু

যত তাড়াতাড়ি সম্ভব আপনাকে শুরু করতে, এই কোডল্যাবের সাথে আপনাকে অনুসরণ করতে সাহায্য করার জন্য স্টার্টার কোড ডাউনলোড করুন। সমাধানে ঝাঁপ দিতে আপনাকে স্বাগত জানাই, কিন্তু আপনি যদি এটি নিজে তৈরি করার জন্য সমস্ত পদক্ষেপগুলি অনুসরণ করতে চান তবে পড়তে থাকুন।

  1. আপনি যদি git ইনস্টল করে থাকেন তবে সংগ্রহস্থল ক্লোন করুন।
git clone https://github.com/googlemaps/codelab-places-101-android.git

বিকল্পভাবে, সোর্স কোড ডাউনলোড করতে এই বোতামটি ক্লিক করুন।

  1. কোডটি ডাউনলোড করার পরে, অ্যান্ড্রয়েড স্টুডিওতে /starter ডিরেক্টরির মধ্যে পাওয়া প্রকল্পটি খুলুন। এই প্রজেক্টে মৌলিক ফাইল কাঠামো অন্তর্ভুক্ত রয়েছে যা আপনাকে কোডল্যাব সম্পূর্ণ করতে হবে। আপনার যা কিছুর সাথে কাজ করতে হবে তা /starter ডিরেক্টরিতে অবস্থিত।

আপনি যদি সম্পূর্ণ সমাধান কোড চলমান দেখতে চান, আপনি /solution ডিরেক্টরিতে সম্পূর্ণ কোডটি দেখতে পারেন।

4. Android এর জন্য Places SDK ইনস্টল করুন৷

এই বিভাগে, আপনি আপনার অ্যাপের নির্ভরতাগুলিতে Android এর জন্য স্থান SDK যোগ করুন।

আপনার API কী যোগ করুন

আপনার অ্যাপে আগে তৈরি করা API কী প্রদান করুন যাতে Android এর জন্য Places SDK আপনার অ্যাপের সাথে আপনার কী যুক্ত করতে পারে।

  1. আপনার প্রোজেক্টের রুট ডিরেক্টরিতে local.properties নামক ফাইলটি খুলুন (একই স্তর যেখানে gradle.properties এবং settings.gradle আছে)।
  2. একটি নতুন কী GOOGLE_MAPS_API_KEY সংজ্ঞায়িত করুন, আপনার তৈরি করা API কী-তে এর মান সেট করুন৷

local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

লক্ষ্য করুন যে Git সংগ্রহস্থলের .gitignore ফাইলে local.properties তালিকাভুক্ত করা হয়েছে। কারণ আপনার API কী সংবেদনশীল তথ্য হিসেবে বিবেচিত হয় এবং সম্ভব হলে উৎস নিয়ন্ত্রণে চেক ইন করা উচিত নয়।

  1. এর পরে, আপনার API কী প্রকাশ করতে যাতে এটি আপনার অ্যাপ জুড়ে ব্যবহার করা যায়, আপনার অ্যাপের build.gradle ফাইলে Android প্লাগইন এর জন্য সিক্রেটস গ্রেডল প্লাগইন অন্তর্ভুক্ত করুন, app/ ডিরেক্টরিতে অবস্থিত, এবং plugins ব্লকের মধ্যে নিম্নলিখিত লাইনটি যোগ করুন:

অ্যাপ-লেভেল build.gradle

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. নিম্নলিখিত ক্লাসপথ অন্তর্ভুক্ত করতে আপনার প্রকল্প-স্তরের build.gradle ফাইলটি পরিবর্তন করুন:

প্রকল্প-স্তরের build.gradle

buildscript {
    dependencies {
        // ...
        classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
    }
}

এই প্লাগইনটি আপনার local.properties ফাইলের মধ্যে সংজ্ঞায়িত কীগুলিকে অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলে বিল্ড ভেরিয়েবল এবং বিল্ড টাইমে গ্রেডল-জেনারেট করা BuildConfig ক্লাসে ভেরিয়েবল হিসাবে উপলব্ধ করে। এই প্লাগইনটি ব্যবহার করা বয়লারপ্লেট কোডটি সরিয়ে দেয় যা অন্যথায় local.properties থেকে বৈশিষ্ট্যগুলি পড়ার জন্য প্রয়োজন হবে যাতে এটি আপনার অ্যাপ জুড়ে অ্যাক্সেস করা যায়।

Android নির্ভরতার জন্য স্থান SDK যোগ করুন

  1. এখন যেহেতু আপনার API কী অ্যাপের ভিতরে অ্যাক্সেস করা যেতে পারে, আপনার অ্যাপের build.gradle ফাইলে Android নির্ভরতার জন্য Places SDK যোগ করুন।

এই কোডল্যাবের সাথে আসা স্টার্টার প্রকল্পে, এই নির্ভরতা ইতিমধ্যেই আপনার জন্য যোগ করা হয়েছে।

অ্যাপ-লেভেল build.gradle

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. অ্যাপটি চালান।

আপনার এখন একটি খালি স্ক্রীন সহ একটি অ্যাপ দেখতে হবে। তিনটি ডেমো দিয়ে এই স্ক্রীনটি পপুলেট করা চালিয়ে যান।

5. জায়গাগুলি Android KTX ইনস্টল করুন৷

এক বা একাধিক Google মানচিত্র প্ল্যাটফর্ম অ্যান্ড্রয়েড SDK ব্যবহার করে Kotlin অ্যাপ্লিকেশানগুলির জন্য, Kotlin এক্সটেনশন (KTX) লাইব্রেরিগুলি আপনাকে কোরটিন, এক্সটেনশন বৈশিষ্ট্য/ফাংশন এবং আরও অনেক কিছুর মতো Kotlin ভাষার বৈশিষ্ট্যগুলির সুবিধা নিতে দেয়৷ প্রতিটি Google Maps SDK-এর একটি সংশ্লিষ্ট KTX লাইব্রেরি রয়েছে যা নীচে দেখানো হয়েছে:

Google মানচিত্র প্ল্যাটফর্ম KTX ডায়াগ্রাম

এই টাস্কে, আপনার অ্যাপে Kotlin-নির্দিষ্ট ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে Places Android KTX লাইব্রেরি ব্যবহার করুন।

প্লেস অ্যান্ড্রয়েড কেটিএক্স নির্ভরতা যোগ করুন

Kotlin-নির্দিষ্ট বৈশিষ্ট্যগুলির সুবিধা নিতে, আপনার অ্যাপ-স্তরের build.gradle ফাইলে এই SDK-এর জন্য সংশ্লিষ্ট KTX লাইব্রেরি অন্তর্ভুক্ত করুন।

build.gradle

dependencies {
    // ...

    // Places SDK for Android KTX Library
    implementation 'com.google.maps.android:places-ktx:2.0.0'
}

6. প্লেস ক্লায়েন্ট শুরু করুন

আবেদনের সুযোগের জন্য স্থান SDK শুরু করুন

app/src/main/java/com/google/codelabs/maps/placesdemo ফোল্ডারের DemoApplication.kt ফাইলের মধ্যে, Android এর জন্য Places SDK শুরু করুন। onCreate ফাংশনের শেষে নীচের লাইনগুলি পেস্ট করুন:

        // Initialize the SDK with the Google Maps Platform API key
        Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)

আপনি যখন আপনার অ্যাপ তৈরি করেন, তখন Android এর জন্য Secrets Gradle Plugin আপনার local.properties ফাইলে API কীটিকে BuildConfig.GOOGLE_MAPS_API_KEY হিসাবে উপলব্ধ করে।

ম্যানিফেস্টে অ্যাপ্লিকেশন ফাইল যোগ করুন

যেহেতু আপনি DemoApplication এর মাধ্যমে Application প্রসারিত করেছেন, তাই আপনাকে ম্যানিফেস্ট আপডেট করতে হবে। app/src/main main-এ অবস্থিত AndroidManifest.xml ফাইলের application উপাদানটিতে android:name প্রপার্টি যোগ করুন:

    <application
        android:name=".DemoApplication"
        ...
    </application>

এই কোডটি src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারে DemoApplication ক্লাসে অ্যাপ্লিকেশন ম্যানিফেস্টকে নির্দেশ করে।

7. স্থানের বিবরণ আনুন

একটি বিশদ স্ক্রীন তৈরি করুন

একটি খালি LinearLayout সহ একটি activity_details.xml লেআউট app/src/main/res/layout/ ফোল্ডারে উপলব্ধ। <LinearLayout> বন্ধনীগুলির মধ্যে নিম্নলিখিত কোড যোগ করে রৈখিক বিন্যাসটি পপুলেট করুন।

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/details_input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/details_input_hint"
            android:text="@string/details_input_default" />

    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:id="@+id/details_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_details" />

    <TextView
        android:id="@+id/details_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textIsSelectable="true" />

এই কোডটি একটি টেক্সট ইনপুট ক্ষেত্র যোগ করে যেখানে ব্যবহারকারী যেকোন প্লেস আইডি লিখতে পারে বা প্রদত্ত ডিফল্ট ব্যবহার করতে পারে, স্থানের বিশদ অনুরোধ শুরু করার জন্য একটি বোতাম এবং প্রতিক্রিয়া থেকে তথ্য প্রদর্শন করার জন্য একটি টেক্সটভিউ। সংশ্লিষ্ট স্ট্রিংগুলি আপনার জন্য src/main/res/values/strings.xml ফাইলে সংজ্ঞায়িত করা হয়েছে।

একটি বিস্তারিত কার্যকলাপ তৈরি করুন

  1. src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারে একটি DetailsActivity.kt ফাইল তৈরি করুন এবং এটিকে আপনার তৈরি করা লেআউটের সাথে যুক্ত করুন৷ ফাইলটিতে এই কোডটি পেস্ট করুন:
class DetailsActivity : AppCompatActivity() {
    private lateinit var placesClient: PlacesClient
    private lateinit var detailsButton: Button
    private lateinit var detailsInput: TextInputEditText
    private lateinit var responseView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_details)

        // Set up view objects
        detailsInput = findViewById(R.id.details_input)
        detailsButton = findViewById(R.id.details_button)
        responseView = findViewById(R.id.details_response_content)

    }
}
  1. এই কার্যকলাপের সাথে ব্যবহারের জন্য একটি স্থান ক্লায়েন্ট তৈরি করুন। onCreate ফাংশনে ভিউ অবজেক্ট সেট আপ করার পরে এই কোডটি আটকান।
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. স্থান ক্লায়েন্ট সেট আপ করার পরে, বোতামে একটি ক্লিক শ্রোতা সংযুক্ত করুন। onCreate ফাংশনে Places ক্লায়েন্ট তৈরির পরে এই কোডটি আটকান।
        // Upon button click, fetch and display the Place Details
        detailsButton.setOnClickListener {
            val placeId = detailsInput.text.toString()
            val placeFields = listOf(
                Place.Field.NAME,
                Place.Field.ID,
                Place.Field.LAT_LNG,
                Place.Field.ADDRESS
            )
            lifecycleScope.launch {
                try {
                    val response = placesClient.awaitFetchPlace(placeId, placeFields)
                    responseView.text = response.prettyPrint()
                } catch (e: Exception) {
                    e.printStackTrace()
                    responseView.text = e.message
                }
            }
        }

এই কোডটি ইনপুট ক্ষেত্রে প্রবেশ করা প্লেস আইডি পুনরুদ্ধার করে, স্থানটির জন্য কোন ক্ষেত্রগুলিকে অনুরোধ করতে হবে তা সংজ্ঞায়িত করে, একটি FetchPlaceRequest তৈরি করে, কাজটি শুরু করে এবং সাফল্য বা ব্যর্থতার কথা শোনে। অনুরোধ সফল হলে, ফাংশন অনুরোধ করা বিবরণ সহ TextView পপুলেট করে।

  1. একটি এক্সটেনশন ফাংশন সংজ্ঞায়িত করে FetchPlaceResponse কে টেক্সটে রূপান্তর করুন। একটি StringUtil.kt ফাইল সরবরাহ করা হয়েছে স্থান SDK প্রতিক্রিয়াগুলিকে মানুষের পঠনযোগ্য স্ট্রিংগুলিতে রূপান্তরিত করা সহজ করার জন্য৷

DetailsActivity.kt ফাইলের শেষে, Fetch Place রেসপন্স অবজেক্টকে একটি স্ট্রিং-এ রূপান্তর করতে একটি ফাংশন সংজ্ঞায়িত করুন।

fun FetchPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

ম্যানিফেস্টে বিস্তারিত কার্যকলাপ যোগ করুন

app/src/main main-এ অবস্থিত AndroidManifest.xml ফাইলে <application> উপাদানের সন্তান হিসেবে DetailsActivity এর জন্য একটি <activity> উপাদান যোগ করুন:

        <activity android:name=".DetailsActivity" />

ডেমো মেনুতে বিস্তারিত কার্যকলাপ যোগ করুন

হোম স্ক্রিনে উপলব্ধ ডেমো তালিকাভুক্ত করার জন্য একটি খালি Demo মডিউল প্রদান করা হয়েছে। এখন আপনি একটি স্থানের বিবরণ কার্যকলাপ তৈরি করেছেন, এই কোড সহ src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারের Demo.kt ফাইলে এটি যোগ করুন:

    DETAILS_FRAGMENT_DEMO(
        R.string.details_demo_title,
        R.string.details_demo_description,
        DetailsActivity::class.java
    ),

সংশ্লিষ্ট স্ট্রিংগুলি src/main/res/values/strings.xml ফাইলে সংজ্ঞায়িত করা হয়েছে।

MainActivity.kt পরিদর্শন করুন এবং পর্যবেক্ষণ করুন যে এটি একটি ListView তৈরি করে যা Demo মডিউলের বিষয়বস্তুর মাধ্যমে পুনরাবৃত্তি করে পপুলেট করা হয়। যদি ব্যবহারকারী তালিকার একটি আইটেম ট্যাপ করে, ক্লিক শ্রোতা সংশ্লিষ্ট কার্যকলাপ খোলে।

অ্যাপটি চালান

  1. অ্যাপটি চালান। এইবার আপনার তালিকায় একটি আইটেম দেখতে হবে যা স্থানের বিবরণ ডেমো উপস্থাপন করে।
  2. স্থানের বিবরণ পাঠ্যটিতে আলতো চাপুন। আপনি একটি ইনপুট ক্ষেত্র এবং বোতাম দিয়ে তৈরি ভিউ দেখতে পাবেন।
  3. "বিশদ পান" বোতামে আলতো চাপুন। আপনি যদি ডিফল্ট প্লেস আইডি ব্যবহার করেন, তাহলে ছবি 1-এ দেখানো জায়গার নাম, ঠিকানা এবং মানচিত্রের স্থানাঙ্কগুলি প্রদর্শিত হবে।

প্রতিক্রিয়া সহ বিস্তারিত কার্যকলাপ স্থান

চিত্র 1. অবস্থানের বিশদ কার্যকলাপ প্রতিক্রিয়া প্রদর্শন সহ।

8. স্থান স্বয়ংসম্পূর্ণ যোগ করুন

একটি স্বয়ংসম্পূর্ণ স্ক্রিন তৈরি করুন৷

একটি খালি LinearLayout সহ একটি activity_autocomplete.xml লেআউট app/src/main/res/layout/ ফোল্ডারে প্রদান করা হয়েছে। <LinearLayout> বন্ধনীর মধ্যে এই কোড যোগ করে রৈখিক বিন্যাস পপুলেট করুন।

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/autocomplete_fragment"
        android:background="@android:color/white"
        android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/autocomplete_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textIsSelectable="true" />

এই কোডটি একটি স্বয়ংসম্পূর্ণ সাপোর্ট ফ্র্যাগমেন্ট উইজেট এবং প্রতিক্রিয়া থেকে তথ্য প্রদর্শন করার জন্য একটি AutocompleteSupportFragment যোগ করে। সংশ্লিষ্ট স্ট্রিংগুলি src/main/res/values/strings.xml ফাইলে সংজ্ঞায়িত করা হয়েছে।

একটি স্বয়ংসম্পূর্ণ কার্যকলাপ তৈরি করুন

  1. src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারে একটি AutocompleteActivity.kt ফাইল তৈরি করুন এবং এই কোড দিয়ে এটি সংজ্ঞায়িত করুন:
class AutocompleteActivity : AppCompatActivity() {
    private lateinit var responseView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_autocomplete)

        // Set up view objects
        responseView = findViewById(R.id.autocomplete_response_content)
        val autocompleteFragment =
            supportFragmentManager.findFragmentById(R.id.autocomplete_fragment)
                    as AutocompleteSupportFragment
    }
}

এই কোডটি আপনার লেআউট ফাইলে সংজ্ঞায়িত দৃশ্য এবং AutocompleteSupportFramgent এর সাথে কার্যকলাপকে যুক্ত করে।

  1. পরবর্তী, ব্যবহারকারী যখন প্লেস স্বয়ংসম্পূর্ণ দ্বারা উপস্থাপিত ভবিষ্যদ্বাণীগুলির একটি নির্বাচন করে তখন কী ঘটবে তা সংজ্ঞায়িত করুন৷ onCreate ফাংশনের শেষে এই কোডটি যোগ করুন:
        // Specify the types of place data to return.
        autocompleteFragment.setPlaceFields(listOf(Place.Field.NAME, Place.Field.ID, Place.Field.LAT_LNG, Place.Field.ADDRESS))

        // Listen to place selection events
        lifecycleScope.launchWhenCreated {
            autocompleteFragment.placeSelectionEvents().collect { event ->
                when (event) {
                    is PlaceSelectionSuccess -> {
                        val place = event.place
                        responseView.text = StringUtil.stringifyAutocompleteWidget(place, false)
                    }
                    is PlaceSelectionError -> Toast.makeText(
                        this@AutocompleteActivity,
                        "Failed to get place '${event.status.statusMessage}'",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }

এই কোডটি সংজ্ঞায়িত করে যে কোন ক্ষেত্রগুলি স্থানের জন্য অনুরোধ করতে হবে, একটি স্থান নির্বাচন ইভেন্টের জন্য শোনে এবং সাফল্য বা ব্যর্থতার জন্য শোনে। অনুরোধ সফল হলে, ফাংশনটি স্থানের বিশদ বিবরণ সহ টেক্সটভিউকে পপুলেট করে। মনে রাখবেন যে স্থান স্বয়ংসম্পূর্ণ একটি স্থান বস্তু প্রদান করে; স্থান স্বয়ংসম্পূর্ণ উইজেট ব্যবহার করার সময় একটি পৃথক স্থান বিবরণ অনুরোধ করার কোন প্রয়োজন নেই.

ম্যানিফেস্টে স্বয়ংসম্পূর্ণ কার্যকলাপ যোগ করুন

app/src/main main-এ অবস্থিত AndroidManifest.xml ফাইলে <application> উপাদানের সন্তান হিসেবে AutocompleteActivity এর জন্য একটি <activity> উপাদান যোগ করুন:

        <activity android:name=".AutocompleteActivity" />

ডেমো মেনুতে স্বয়ংসম্পূর্ণ কার্যকলাপ যোগ করুন

ঠিক আগের মতই, Demo মডিউলের তালিকায় যোগ করে হোম স্ক্রিনে প্লেস স্বয়ংসম্পূর্ণ ডেমো যোগ করুন। এখন আপনি একটি স্থান স্বয়ংসম্পূর্ণ কার্যকলাপ তৈরি করেছেন, এটি src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারে Demo.kt ফাইলে যোগ করুন। DETAILS_FRAGMENT_DEMO আইটেমের পরে অবিলম্বে এই কোডটি আটকান:

    AUTOCOMPLETE_FRAGMENT_DEMO(
        R.string.autocomplete_fragment_demo_title,
        R.string.autocomplete_fragment_demo_description,
        AutocompleteActivity::class.java
    ),

সংশ্লিষ্ট স্ট্রিংগুলি src/main/res/values/strings.xml ফাইলে সংজ্ঞায়িত করা হয়েছে।

অ্যাপটি চালান

  1. অ্যাপটি চালান। এই সময় আপনি হোম স্ক্রীন তালিকায় দুটি আইটেম দেখতে হবে.
  2. Place Autocomplete সারিতে ট্যাপ করুন। চিত্র 2-এ দেখানো হিসাবে আপনি একটি স্থান স্বয়ংসম্পূর্ণ ইনপুট পপ আপ দেখতে পাবেন।
  3. একটি জায়গার নাম লিখতে শুরু করুন। এটি একটি স্থাপনার নাম, একটি ঠিকানা বা একটি ভৌগলিক অঞ্চল হতে পারে৷ আপনি টাইপ করার সাথে সাথে ভবিষ্যদ্বাণী উপস্থাপন করা উচিত।
  4. ভবিষ্যদ্বাণীগুলির মধ্যে একটি নির্বাচন করুন। ভবিষ্যদ্বাণীগুলি অদৃশ্য হয়ে যাওয়া উচিত এবং টেক্সটভিউ এখন চিত্র 3-এ দেখানো হিসাবে নির্বাচিত স্থান সম্পর্কে বিশদ প্রদর্শন করা উচিত।

ব্যবহারকারী ইনপুট ক্ষেত্রে ট্যাপ করার পরে স্বয়ংসম্পূর্ণ কার্যকলাপ

চিত্র 2. ব্যবহারকারী ইনপুট ক্ষেত্রে ট্যাপ করার পরে স্বয়ংসম্পূর্ণ কার্যকলাপ।

ব্যবহারকারী টাইপ এবং &ldquo;নায়াগ্রা জলপ্রপাত&rdquo; নির্বাচন করার পরে স্বয়ংসম্পূর্ণ কার্যকলাপ

চিত্র 3. ব্যবহারকারী "নায়াগ্রা জলপ্রপাত" টাইপ এবং নির্বাচন করার পরে স্থানের বিবরণ প্রদর্শন করে স্বয়ংসম্পূর্ণ কার্যকলাপ।

9. ডিভাইসের বর্তমান স্থান পান

একটি বর্তমান স্থান স্ক্রীন তৈরি করুন

একটি খালি LinearLayout সহ একটি activity_current.xml লেআউট app/src/main/res/layout/ ফোল্ডারে প্রদান করা হয়েছে। <LinearLayout> বন্ধনীগুলির মধ্যে নিম্নলিখিত কোড যোগ করে রৈখিক বিন্যাসটি পপুলেট করুন।

    <Button
        android:id="@+id/current_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/current_button" />

    <TextView
        android:id="@+id/current_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:scrollbars = "vertical"
        android:textIsSelectable="true" />

একটি বর্তমান স্থান কার্যকলাপ তৈরি করুন

  1. src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারে একটি CurrentActivity.kt ফাইল তৈরি করুন এবং এই কোড দিয়ে এটি সংজ্ঞায়িত করুন:
class CurrentPlaceActivity : AppCompatActivity() {
    private lateinit var placesClient: PlacesClient
    private lateinit var currentButton: Button
    private lateinit var responseView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_current)

        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)

        // Set view objects
        currentButton = findViewById(R.id.current_button)
        responseView = findViewById(R.id.current_response_content)


        // Set listener for initiating Current Place
        currentButton.setOnClickListener {
            checkPermissionThenFindCurrentPlace()
        }
    }
}

এই কোডটি আপনার লেআউট ফাইলে সংজ্ঞায়িত দৃশ্যের সাথে কার্যকলাপকে যুক্ত করে। এটি বোতামটিতে ক্লিক করার সময় একটি ক্লিক লিসেনার যোগ করে ফাংশন checkPermissionThenFindCurrentPlace কে কল করার জন্য যখন বোতামটি ক্লিক করা হয়।

  1. সূক্ষ্ম অবস্থানের অনুমতি পরীক্ষা করতে checkPermissionThenFindCurrentPlace() সংজ্ঞায়িত করুন এবং অনুমতির জন্য অনুরোধ করুন যদি এটি এখনও মঞ্জুর করা না হয়। onCreate ফাংশনের পরে এই কোডটি পেস্ট করুন।
    /**
     * Checks that the user has granted permission for fine or coarse location.
     * If granted, finds current Place.
     * If not yet granted, launches the permission request.
     * See https://developer.android.com/training/permissions/requesting
     */
    private fun checkPermissionThenFindCurrentPlace() {
        when {
            (ContextCompat.checkSelfPermission(
                this,
                ACCESS_FINE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
                this,
                ACCESS_COARSE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED) -> {
                // You can use the API that requires the permission.
                findCurrentPlace()
            }
            shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)
            -> {
                Log.d(TAG, "Showing permission rationale dialog")
                // TODO: In an educational UI, explain to the user why your app requires this
                // permission for a specific feature to behave as expected. In this UI,
                // include a "cancel" or "no thanks" button that allows the user to
                // continue using your app without granting the permission.
            }
            else -> {
                // Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                    ),
                    PERMISSION_REQUEST_CODE
                )
            }
        }
    }

    companion object {
        private val TAG = "CurrentPlaceActivity"
        private const val PERMISSION_REQUEST_CODE = 9
    }
  1. checkPermissionThenFindCurrentPlace ফাংশনের else শাখা যখন requestPermissions কল করে, অ্যাপটি ব্যবহারকারীর কাছে একটি অনুমতি অনুরোধ ডায়ালগ উপস্থাপন করবে। ব্যবহারকারী যদি অ্যান্ড্রয়েড 12 এর চেয়ে কম ওএস চালিত একটি ডিভাইস চালান, তবে ব্যবহারকারী শুধুমাত্র সুনির্দিষ্ট (সূক্ষ্ম) অবস্থানের অনুমতি দিতে পারেন। ব্যবহারকারী যদি অ্যান্ড্রয়েড 12 বা উচ্চতর সংস্করণে চালিত একটি ডিভাইস ব্যবহার করেন, তাহলে চিত্র 4-এ দেখানো হিসাবে, তাদের সুনির্দিষ্ট (সূক্ষ্ম) অবস্থানের পরিবর্তে আনুমানিক (মোটা) অবস্থান প্রদানের বিকল্প দেওয়া হবে।

Android 12 বা উচ্চতর ভার্সনে চলমান ডিভাইসে ব্যবহারকারীর অনুমতির অনুরোধ করা

চিত্র 4. অ্যান্ড্রয়েড 12 বা উচ্চতর সংস্করণে চালিত একটি ডিভাইসে ব্যবহারকারীর অনুমতির অনুরোধ করা সুনির্দিষ্ট বা আনুমানিক অবস্থান প্রদানের বিকল্প উপস্থাপন করে।

ব্যবহারকারী সিস্টেম পারমিশন ডায়ালগে সাড়া দেওয়ার পরে, সিস্টেমটি আপনার অ্যাপের onRequestPermissionsResult বাস্তবায়নের জন্য আহ্বান জানায়। সিস্টেমটি অনুমতি ডায়ালগে ব্যবহারকারীর প্রতিক্রিয়া, সেইসাথে আপনার সংজ্ঞায়িত অনুরোধ কোডটি পাস করে। checkPermissionThenFindCurrentPlace এর নীচে নিম্নলিখিত কোডটি পেস্ট করে এই বর্তমান স্থান কার্যকলাপের সাথে সম্পর্কিত অবস্থানের অনুমতিগুলির জন্য অনুরোধ কোডটি পরিচালনা করতে onRequestPermissionResult ওভাররাইড করুন।

    @SuppressLint("MissingPermission")
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>, grantResults: IntArray
    ) {
        if (requestCode != PERMISSION_REQUEST_CODE) {
            super.onRequestPermissionsResult(
                requestCode,
                permissions,
                grantResults
            )
            return
        } else if (permissions.toList().zip(grantResults.toList())
                .firstOrNull { (permission, grantResult) ->
                    grantResult == PackageManager.PERMISSION_GRANTED && (permission == ACCESS_FINE_LOCATION || permission == ACCESS_COARSE_LOCATION)
                } != null
        )
            // At least one location permission has been granted, so proceed with Find Current Place
            findCurrentPlace()
    }
  1. একবার অনুমতি দেওয়া হলে, ফাংশন findCurrentPlace চলবে। onRequestPermissionsResult ফাংশনের পরে এই কোড দিয়ে ফাংশনটি সংজ্ঞায়িত করুন।
    /**
     * Fetches a list of [PlaceLikelihood] instances that represent the Places the user is
     * most
     * likely to be at currently.
     */
    @RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
    private fun findCurrentPlace() {
        // Use fields to define the data types to return.
        val placeFields: List<Place.Field> =
            listOf(Place.Field.NAME, Place.Field.ID, Place.Field.ADDRESS, Place.Field.LAT_LNG)

        // Use the builder to create a FindCurrentPlaceRequest.
        val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)

        // Call findCurrentPlace and handle the response (first check that the user has granted permission).
        if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // Retrieve likely places based on the device's current location
            lifecycleScope.launch {
                try {
                    val response = placesClient.awaitFindCurrentPlace(placeFields)
                    responseView.text = response.prettyPrint()

                    // Enable scrolling on the long list of likely places
                    val movementMethod = ScrollingMovementMethod()
                    responseView.movementMethod = movementMethod
                } catch (e: Exception) {
                    e.printStackTrace()
                    responseView.text = e.message
                }
            }
        } else {
            Log.d(TAG, "LOCATION permission not granted")
            checkPermissionThenFindCurrentPlace()

        }
    }

এই কোডটি সম্ভাব্য স্থানগুলির জন্য কোন ক্ষেত্রগুলিকে অনুরোধ করতে হবে তা নির্ধারণ করে, একটি FindCurrentPlaceRequest তৈরি করে, টাস্কটি শুরু করে এবং অনুরোধ করা বিশদ সহ TextView পূরণ করে৷

  1. একটি এক্সটেনশন ফাংশন সংজ্ঞায়িত করে FindCurrentPlaceResponse কে পাঠ্যে রূপান্তর করুন। একটি StringUtil.kt ফাইল সরবরাহ করা হয়েছে স্থান SDK প্রতিক্রিয়াগুলিকে মানুষের পঠনযোগ্য স্ট্রিংগুলিতে রূপান্তরিত করা সহজ করার জন্য৷

CurrentPlaceActivity.kt ফাইলের শেষে, কারেন্ট প্লেস রেসপন্স অবজেক্টকে একটি স্ট্রিং-এ রূপান্তর করার জন্য একটি ফাংশন সংজ্ঞায়িত করুন।

fun FindCurrentPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

ম্যানিফেস্টে বর্তমান স্থান কার্যকলাপ যোগ করুন

app/src/main main-এ অবস্থিত AndroidManifest.xml ফাইলে <application> উপাদানের সন্তান হিসেবে CurrentPlaceActivity এর জন্য একটি <activity> উপাদান যোগ করুন:

        <activity android:name=".CurrentPlaceActivity" />

ডেমো মেনুতে বর্তমান স্থান কার্যকলাপ যোগ করুন

ঠিক আগের মতোই, Demo মডিউলের তালিকায় এটিকে যুক্ত করে হোম স্ক্রিনে বর্তমান স্থানের ডেমো যোগ করুন। এখন আপনি একটি বর্তমান স্থান কার্যকলাপ তৈরি করেছেন, এটি src/main/java/com/google/codelabs/maps/placesdemo/ ফোল্ডারে Demo.kt ফাইলে যোগ করুন। AUTOCOMPLETE_FRAGMENT_DEMO আইটেমের পরে অবিলম্বে এই কোডটি আটকান:

    CURRENT_FRAGMENT_DEMO(
        R.string.current_demo_title,
        R.string.current_demo_description,
        CurrentPlaceActivity::class.java
    ),

সংশ্লিষ্ট স্ট্রিংগুলি src/main/res/values/strings.xml ফাইলে সংজ্ঞায়িত করা হয়েছে।

অ্যাপটি চালান

  1. অ্যাপটি চালান। এই সময় আপনি হোম স্ক্রীন তালিকায় তিনটি আইটেম দেখতে হবে.
  2. বর্তমান স্থান সারিতে আলতো চাপুন। আপনি পর্দায় একটি বোতাম দেখতে হবে.
  3. বোতামে ট্যাপ করুন। আপনি যদি আগে এই অ্যাপে অবস্থানের অনুমতি না দিয়ে থাকেন, তাহলে একটি অনুমতির অনুরোধ পপ আপ করা উচিত।
  4. ডিভাইসের অবস্থান অ্যাক্সেস করার জন্য অ্যাপটিকে অনুমতি দিন।
  5. আবার বোতামে আলতো চাপুন। এই সময়, 20টি পর্যন্ত কাছাকাছি স্থান এবং তাদের সম্ভাবনার একটি তালিকা প্রদর্শিত হওয়া উচিত, যেমন চিত্র 5 এ দেখানো হয়েছে।

ডিভাইসের রিপোর্ট করা অবস্থানের জন্য সম্ভাব্য বর্তমান স্থানের মিল উপস্থাপন করা হচ্ছে

চিত্র 5. বর্তমান স্থানটি ডিভাইসের রিপোর্ট করা অবস্থানের সাথে মিলে যাচ্ছে।

10. অভিনন্দন

আপনি Android এর জন্য Places SDK সহ একটি Android অ্যাপ সফলভাবে তৈরি করেছেন৷

আপনি যা শিখেছেন

এরপর কি?

  • আরও অনুপ্রেরণার জন্য নমুনা এবং ডেমোগুলির android-places-demos GitHub সংগ্রহস্থল অন্বেষণ করুন বা কাঁটাচামচ করুন৷
  • Google মানচিত্র প্ল্যাটফর্মের সাথে Android অ্যাপ তৈরি করার জন্য আরও Kotlin কোডল্যাব থেকে শিখুন।
  • নিম্নলিখিত প্রশ্নের উত্তর দিয়ে আপনি যে বিষয়বস্তুটিকে সবচেয়ে উপযোগী মনে করবেন তা তৈরি করতে আমাদের সাহায্য করুন:

আপনি অন্য কোন কোডল্যাব দেখতে চান?

মানচিত্রে ডেটা ভিজ্যুয়ালাইজেশন আমার মানচিত্রের শৈলী কাস্টমাইজ করার বিষয়ে আরও মানচিত্রে 3D মিথস্ক্রিয়া জন্য বিল্ডিং

আপনি যে কোডল্যাব চান তা কি তালিকাভুক্ত নয়? এখানে একটি নতুন সমস্যা সহ এটি অনুরোধ করুন