অ্যান্ড্রয়েড (জাভা) এর জন্য আপনার নিজস্ব বর্তমান স্থান চয়নকারী তৈরি করুন

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

আপনার ব্যবহারকারীদের তাদের বর্তমান অবস্থান সনাক্ত করতে স্থানগুলির একটি তালিকা উপস্থাপন করতে Android এর জন্য Google মানচিত্র প্ল্যাটফর্ম এবং স্থান SDK কীভাবে ব্যবহার করবেন তা শিখুন৷

bd07a9ad2cb27a06.png

পূর্বশর্ত

  • বেসিক জাভা দক্ষতা

আপনি কি করবেন

  • একটি Android অ্যাপে একটি মানচিত্র যোগ করুন।
  • ব্যবহারকারীকে ভৌগোলিক অবস্থানের অনুমতি ব্যবহার করুন।
  • ব্যবহারকারীর বর্তমান অবস্থানের কাছাকাছি স্থানগুলি আনুন৷
  • তাদের বর্তমান অবস্থান সনাক্ত করতে ব্যবহারকারীর কাছে বর্তমান সম্ভাব্য স্থানগুলি।

আপনি কি নির্মাণ করবেন

আপনি স্ক্র্যাচ থেকে আপনার অ্যান্ড্রয়েড অ্যাপ তৈরি করেন, কিন্তু ডিবাগ করার সময় তুলনা করার জন্য আপনি নমুনা কোড ডাউনলোড করতে পারেন। GitHub থেকে নমুনা কোড ডাউনলোড করুন, অথবা, আপনি যদি কমান্ড-লাইন ব্যবহারের জন্য গিট সেট আপ করে থাকেন তবে নিম্নলিখিতটি লিখুন:

git clone https://github.com/googlecodelabs/current-place-picker-android.git

এই কোডল্যাবের মাধ্যমে কাজ করার সময় আপনি যদি কোনো সমস্যায় পড়েন (কোড বাগ, ব্যাকরণগত ত্রুটি, অস্পষ্ট শব্দ, বা অন্য কিছু), অনুগ্রহ করে কোডল্যাবের নীচের বাম কোণে একটি ভুল প্রতিবেদন করুন লিঙ্কের মাধ্যমে সমস্যাটি রিপোর্ট করুন৷

2. শুরু করুন

এই কোডল্যাব শুরু করার আগে, আপনাকে নিম্নলিখিতগুলি সেট আপ করতে হবে:

অ্যান্ড্রয়েড স্টুডিও

https://developer.android.com/studio থেকে অ্যান্ড্রয়েড স্টুডিও ডাউনলোড করুন।

আপনার যদি ইতিমধ্যেই অ্যান্ড্রয়েড স্টুডিও থেকে থাকে, তাহলে নিশ্চিত করুন যে আপনার কাছে সর্বশেষ সংস্করণ রয়েছে অ্যান্ড্রয়েড স্টুডিও > আপডেটের জন্য চেক করুন... এ ক্লিক করে।

1f36bae83b64e33.png

এই ল্যাবটি অ্যান্ড্রয়েড স্টুডিও 3.4 ব্যবহার করে লেখা হয়েছে।

অ্যান্ড্রয়েড এসডিকে

অ্যান্ড্রয়েড স্টুডিওতে, আপনি SDK ম্যানেজার ব্যবহার করে আপনার পছন্দসই SDKগুলি কনফিগার করতে পারেন৷ এই ল্যাবটি Android Q SDK ব্যবহার করে।

  1. অ্যান্ড্রয়েড স্টুডিও ওয়েলকাম স্ক্রীন থেকে, কনফিগার > SDK ম্যানেজার -এ ক্লিক করুন।

d3fa03c269ec231c.png

  1. আপনার পছন্দসই SDK চেকবক্স নির্বাচন করুন, তারপর প্রয়োগ করুন ক্লিক করুন।

আপনার কাছে এখনও SDK না থাকলে, এটি আপনার মেশিনে SDK ডাউনলোড শুরু করবে৷

884e0aa1314f70d.png

গুগল প্লে পরিষেবা

SDK ম্যানেজার থেকে, আপনাকে Google Play পরিষেবাগুলিও ইনস্টল করতে হবে৷

  1. SDK টুলস ট্যাবে ক্লিক করুন এবং Google Play পরিষেবার চেকবক্স নির্বাচন করুন।

স্ট্যাটাস পড়লে আপডেট করুন আপডেট উপলব্ধ

ad6211fd78f3b629.png

3. এমুলেটর প্রস্তুত করুন

অ্যাপটি চালানোর জন্য, আপনি আপনার নিজের ডিভাইসটি সংযুক্ত করতে পারেন বা Android এমুলেটর ব্যবহার করতে পারেন।

আপনার নিজের ডিভাইস ব্যবহার করলে, বাস্তব ডিভাইস নির্দেশাবলীতে যান: এই পৃষ্ঠার শেষে Google Play পরিষেবা আপডেট করুন

একটি এমুলেটর যোগ করুন

  1. অ্যান্ড্রয়েড স্টুডিও ওয়েলকাম স্ক্রীন থেকে, কনফিগার > AVD ম্যানেজার ক্লিক করুন।

5dd2d14c9c56d3f9.png

এটি অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস ম্যানেজার ডায়ালগ খোলে।

  1. ভার্চুয়াল ডিভাইস তৈরি করুন... ক্লিক করুন আপনি যে ডিভাইসগুলি থেকে বেছে নিতে পারেন তার একটি তালিকা খুলতে।

2d44eada384f8b35.png

  1. প্লে সহ একটি ডিভাইস চয়ন করুন d5722488d80cd6be.png প্লে স্টোর কলামে আইকন এবং পরবর্তী ক্লিক করুন।

e0248f1c6e85ab7c.png

আপনি সিস্টেম চিত্রগুলির একটি সেট দেখতে পাবেন যা আপনি ইনস্টল করতে পারেন৷ যদি Q টার্গেট করে Android 9.+ (Google Play) এর পাশে ডাউনলোড শব্দ থাকে, তাহলে ডাউনলোড এ ক্লিক করুন।

316d0d1efabd9f24.png

  1. আপনার ভার্চুয়াল ডিভাইসটিকে একটি নাম দিতে পরবর্তীতে ক্লিক করুন, তারপরে Finish এ ক্লিক করুন।

আপনি আপনার ভার্চুয়াল ডিভাইসের তালিকায় ফিরে যান।

  1. স্টার্ট ক্লিক করুন ba8adffe56d3b678.png আপনার নতুন ডিভাইসের পাশে:

7605864ed27f77ea.png

কয়েক মুহূর্ত পরে, এমুলেটর খোলে।

এমুলেটর নির্দেশাবলী—Google Play পরিষেবা আপডেট করুন

  1. একবার এমুলেটর চালু হলে , ন্যাভিগেশন বারে যেটি**।**

2e1156e02643d018.png

এটি এক্সটেন্ডেড কন্ট্রোল ডায়ালগ খোলে।

  1. মেনুতে Google Play এ ক্লিক করুন।

একটি আপডেট উপলব্ধ হলে, আপডেট ক্লিক করুন.

5afd2686c5cad0e5.png

  1. একটি Google অ্যাকাউন্ট দিয়ে এমুলেটরে সাইন ইন করুন৷

আপনার ব্যক্তিগত তথ্য থেকে আপনার পরীক্ষা আলাদা রাখতে আপনি আপনার নিজস্ব ব্যবহার করতে পারেন বা বিনামূল্যে একটি নতুন অ্যাকাউন্ট তৈরি করতে পারেন।

Google Play তারপর Google Play পরিষেবাগুলিতে খোলে।

  1. Google Play পরিষেবাগুলির সর্বশেষ সংস্করণ পেতে আপডেট ক্লিক করুন৷

f4bc067e80630b9c.png

আপনার অ্যাকাউন্ট সেটআপ সম্পূর্ণ করতে এবং একটি অর্থপ্রদানের বিকল্প যোগ করতে বলা হলে, এড়িয়ে যান ক্লিক করুন।

এমুলেটরে অবস্থান সেট করুন

  1. একবার এমুলেটর চালু হলে, গুগল ম্যাপ অ্যাপ আইকনটি টানতে হোম স্ক্রিনে অনুসন্ধান বারে "মানচিত্র" টাইপ করুন।

2d996aadd53685a6.png

  1. চালু করতে আইকনে ক্লিক করুন।

আপনি একটি ডিফল্ট মানচিত্র দেখতে.

  1. মানচিত্রের নীচে ডানদিকে, আপনার অবস্থানে ক্লিক করুন৷ c5b4e2fda57a7e71.png .

লোকেশন ব্যবহার করার জন্য আপনাকে ফোনের অনুমতি দিতে বলা হয়েছে।

f2b68044eabca151.png

  1. এক্সটেন্ডেড কন্ট্রোল মেনু খুলতে ... ক্লিক করুন।
  2. অবস্থান ট্যাবে ক্লিক করুন।
  3. একটি অক্ষাংশ এবং দ্রাঘিমাংশ লিখুন।

এখানে আপনার পছন্দের কিছু লিখুন, তবে নিশ্চিত করুন যে এটি এমন একটি এলাকায় রয়েছে যেখানে প্রচুর জায়গা রয়েছে৷

(এই কোডল্যাব থেকে ফলাফলের প্রতিলিপি করতে হাওয়াইয়ের মাউয়ের কিহেই শহরের জন্য অক্ষাংশ 20.7818 এবং দ্রাঘিমাংশ -156.4624 ব্যবহার করুন।)

  1. পাঠান ক্লিক করুন এবং এই অবস্থানের সাথে মানচিত্র আপডেট.

f9576b35218f4187.png

আপনি আপনার অ্যাপ্লিকেশন চালানোর জন্য প্রস্তুত এবং অবস্থানের সাথে এটি পরীক্ষা করুন৷

প্রকৃত ডিভাইস নির্দেশাবলী—Google Play পরিষেবা আপডেট করুন

আপনি যদি একটি বাস্তব অ্যান্ড্রয়েড ডিভাইস ব্যবহার করেন, তাহলে নিম্নলিখিতগুলি করুন:

  1. Google Play পরিষেবাগুলি অনুসন্ধান করতে এবং খুলতে হোম স্ক্রিনে অনুসন্ধান বারটি ব্যবহার করুন৷
  2. আরো বিস্তারিত ক্লিক করুন.

উপলব্ধ থাকলে, আপডেট ক্লিক করুন।

ad16cdb975b5c3f7.pngbaf0379ef8a9c88c.png

4. একটি Google মানচিত্র কার্যকলাপের সাথে অ্যাপ শেল তৈরি করুন৷

  1. অ্যান্ড্রয়েড স্টুডিও স্বাগত স্ক্রিনে, একটি নতুন অ্যান্ড্রয়েড স্টুডিও প্রকল্প শুরু করুন নির্বাচন করুন।
  2. ফোন এবং ট্যাবলেট ট্যাবে, Google মানচিত্র কার্যকলাপ নির্বাচন করুন।

c9c80aa8211a8761.png

আপনার প্রকল্প কনফিগার করুন ডায়ালগ খোলে। এখানে আপনি আপনার অ্যাপের নাম দেন এবং আপনার ডোমেনের উপর ভিত্তি করে প্যাকেজ তৈরি করেন।

এখানে কারেন্ট প্লেস নামক একটি অ্যাপের সেটিংস রয়েছে, যা com.google.codelab.currentplace প্যাকেজের সাথে মিলে যায়।

37f5b93b94ee118c.png

  1. ভাষা হিসাবে Java নির্বাচন করুন এবং androidx ব্যবহার করুন নির্বাচন করুন। নিদর্শন *.

বাকি সেটিংসের জন্য ডিফল্ট রাখুন।

  1. শেষ ক্লিক করুন.

5. Gradle বিল্ড ফাইলে Google পরিষেবা নির্ভরতা যোগ করুন

অ্যান্ড্রয়েডে অবস্থানের অনুমতিগুলি অ্যাক্সেস করতে, আপনার Google Play পরিষেবাগুলি থেকে Google অবস্থান এবং কার্যকলাপ সনাক্তকরণ API প্রয়োজন৷ এটি এবং অন্যান্য Google Play পরিষেবা APIগুলি যোগ করার বিষয়ে আরও তথ্যের জন্য, Google Play পরিষেবাগুলি সেট আপ করুন দেখুন৷

অ্যান্ড্রয়েড স্টুডিও প্রজেক্টে সাধারণত দুটি build.gradle ফাইল থাকে। একটি সামগ্রিক প্রকল্পের জন্য এবং একটি অ্যাপের জন্য। আপনার যদি অ্যান্ড্রয়েড ভিউতে অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট এক্সপ্লোরার থাকে তবে আপনি Gradle Scripts ফোল্ডারে উভয়ই দেখতে পাবেন। Google পরিষেবা যোগ করতে আপনাকে build.gradle (Module: app) ফাইলটি সম্পাদনা করতে হবে।

f3043429cf719c47.png

  1. অবস্থানের জন্য Google পরিষেবা এবং স্থান API ( প্রসঙ্গে নমুনা কোড ) যোগ করতে dependencies বিভাগে দুটি লাইন যোগ করুন।

build.gradle (মডিউল: অ্যাপ)

plugins {
  id 'com.android.application'
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.google.codelab.currentplace"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.google.android.libraries.places:places:1.1.0'
}

6. Google মানচিত্র প্ল্যাটফর্ম API সক্রিয় করুন এবং একটি API কী পান৷

নিম্নলিখিত সক্রিয়করণ পদক্ষেপের জন্য, আপনাকে Android এবং Places API- এর জন্য Maps SDK সক্ষম করতে হবে৷

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

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

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

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

আপনার তৈরি করা API কীটি অনুলিপি করুন। অ্যান্ড্রয়েড স্টুডিওতে ফিরে যান এবং অ্যান্ড্রয়েড > অ্যাপ > রেস > মান s এর অধীনে google_maps_api.xml ফাইলটি খুঁজুন।

আপনার কপি করা API কী দিয়ে YOUR_KEY_HERE প্রতিস্থাপন করুন।

aa576e551a7a1009.png

আপনার অ্যাপ এখন কনফিগার করা হয়েছে।

7. লেআউট ফাইল সম্পাদনা করুন

  1. আপনার প্রজেক্ট এক্সপ্লোরারে, Android > app > res > layout activity_maps.xml ফাইলটি খুলুন।

4e0d986480c57efa.png

  1. আপনি আপনার লেআউটের জন্য ডিজাইন বা টেক্সট এডিটর নির্বাচন করার জন্য নীচে ট্যাব সহ স্ক্রিনের ডানদিকে মৌলিক UI দেখতে পাবেন। পাঠ্য নির্বাচন করুন এবং লেআউট ফাইলের সম্পূর্ণ বিষয়বস্তু এর সাথে প্রতিস্থাপন করুন:

activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:titleTextColor="@android:color/white"
        android:background="@color/colorPrimary" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="349dp"
            tools:context=".MapsActivity" />

        <ListView
            android:id="@+id/listPlaces"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

এটি আপনাকে একটি ইউজার ইন্টারফেস দেবে যা এইরকম দেখাচ্ছে:

1bf786808a4697ce.png

8. অ্যাপ বার সেট আপ করুন

ব্যবহারকারী যখন তাদের বর্তমান স্থান বেছে নিতে চান তখন ক্লিক করার জন্য একটি বোতাম দিতে, একটি আইকন সহ একটি অ্যাপ বার যোগ করুন যা ব্যবহারকারীর বর্তমান স্থান খুঁজে পায় এবং কাছাকাছি সম্ভাব্য স্থানগুলি প্রদর্শন করে৷ এটি এই মত দেখাবে:

3a17c92b613a26c5.png

একটি ফোনে, শুধুমাত্র আইকন দেখানো হয়। আরও স্থান সহ একটি ট্যাবলেটে, পাঠ্যটিও অন্তর্ভুক্ত করা হয়েছে।

আইকন তৈরি করুন

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

সম্পদ স্টুডিও খোলে।

  1. আইকন টাইপ মেনুতে, অ্যাকশন বার এবং ট্যাব আইকনগুলিতে ক্লিক করুন।
  2. আপনার সম্পদের নাম দিন ic_geolocate
  3. সম্পদের ধরন হিসেবে ক্লিপ আর্ট নির্বাচন করুন**।**
  4. ক্লিপ আর্টের পাশের গ্রাফিকে ক্লিক করুন।

এটি নির্বাচন আইকন উইন্ডোটি খোলে।

  1. একটি চিহ্ন পছন্দ করুন.

আপনি আপনার অভিপ্রায় সম্পর্কিত আইকন খুঁজতে অনুসন্ধান বার ব্যবহার করতে পারেন।

  1. location অনুসন্ধান করুন এবং একটি অবস্থান-সম্পর্কিত আইকন চয়ন করুন।

আমার অবস্থান আইকনটি Google মানচিত্র অ্যাপে ব্যবহৃত আইকনটির মতোই যখন একজন ব্যবহারকারী তাদের বর্তমান অবস্থানে ক্যামেরা স্ন্যাপ করতে চান৷

  1. ঠিক আছে > নেক্সট > ফিনিশ ক্লিক করুন এবং নিশ্চিত করুন যে drawable নামে একটি নতুন ফোল্ডার রয়েছে যাতে আপনার নতুন আইকন ফাইল রয়েছে।

b9e0196137ed18ae.png

স্ট্রিং সম্পদ যোগ করুন

  1. প্রজেক্ট এক্সপ্লোরারে, Android > app > res > values- এ ক্লিক করুন এবং strings.xml ফাইলটি খুলুন।
  2. <string name="title_activity_maps">Map</string> এর পরে নিম্নলিখিত লাইন যোগ করুন :

strings.xml

    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>

প্রথম লাইনটি আপনার অ্যাপ বারে ব্যবহৃত হয় যখন আইকনের পাশে একটি পাঠ্য লেবেল অন্তর্ভুক্ত করার জন্য স্থান থাকে। অন্যগুলি চিহ্নিতকারীর জন্য ব্যবহৃত হয় যা আপনি মানচিত্রে যোগ করেন।

এখন ফাইলের কোড এই মত দেখায়:

<resources>
    <string name="app_name">Current Place</string>
    <string name="title_activity_maps">Map</string>
    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>
</resources>

অ্যাপ বার যোগ করুন

  1. প্রজেক্ট এক্সপ্লোরারে, Android > app- এ ক্লিক করুন, তারপর res ফোল্ডারে ডান-ক্লিক করুন এবং app/src/main/res res-এর অধীনে একটি নতুন সাব-ডিরেক্টরি তৈরি করতে নতুন > ডিরেক্টরি নির্বাচন করুন।
  2. ডিরেক্টরি menu নাম দিন।
  3. menu ফোল্ডারে ডান-ক্লিক করুন এবং নতুন > ফাইল নির্বাচন করুন।
  4. ফাইলটির নাম দিন menu.xml
  5. এই কোডে পেস্ট করুন:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "Locate me", should appear as action button if possible -->
    <item
        android:id="@+id/action_geolocate"
        android:icon="@drawable/ic_geolocate"
        android:title="@string/action_geolocate"
        app:showAsAction="always|withText" />

</menu>

অ্যাপ বার স্টাইল আপডেট করুন

  1. প্রজেক্ট এক্সপ্লোরারে, অ্যান্ড্রয়েড > app > res > values প্রসারিত করুন এবং ভিতরে styles.xml ফাইলটি খুলুন।
  2. <style> ট্যাগে, মূল সম্পত্তি সম্পাদনা করুন "Theme.AppCompat.NoActionBar"
  3. name সম্পত্তি নোট করুন, যা আপনি পরবর্তী ধাপে ব্যবহার করেন।

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

AndroidManifest.xml-এ অ্যাপের থিম আপডেট করুন

  1. Android > app > manifests এ ক্লিক করুন এবং AndroidManifest.xml ফাইল খুলুন।
  2. android:theme লাইন খুঁজুন এবং মানটিকে সম্পাদনা করুন বা নিশ্চিত করুন @style/AppTheme

AndroidManifest.xml

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

আপনি এখন কোডিং শুরু করতে প্রস্তুত!

9. অ্যাপটি চালু করুন

  1. আপনার প্রজেক্ট এক্সপ্লোরারে, MapsActivity.java ফাইলটি খুঁজুন।

আপনি ধাপ 1 এ আপনার অ্যাপের জন্য যে প্যাকেজটি তৈরি করেছেন তার সাথে সংশ্লিষ্ট ফোল্ডারে এটি রয়েছে।

8b0fa27d417f5f55.png

  1. ফাইলটি খুলুন এবং আপনি জাভা কোড এডিটরে আছেন।

স্থান SDK এবং অন্যান্য নির্ভরতা আমদানি করুন৷

বিদ্যমান আমদানি বিবৃতিগুলি প্রতিস্থাপন করে, MapsActivity.java এর শীর্ষে এই লাইনগুলি যুক্ত করুন৷

তারা বিদ্যমান আমদানি অন্তর্ভুক্ত করে এবং এই কোডল্যাবে কোডে ব্যবহৃত আরও অনেক কিছু যুক্ত করে।

MapsActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.model.PlaceLikelihood;
import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest;
import com.google.android.libraries.places.api.net.FindCurrentPlaceResponse;
import com.google.android.libraries.places.api.net.PlacesClient;

import java.util.Arrays;
import java.util.List;

ক্লাস স্বাক্ষর আপডেট করুন

Places API ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ সমর্থনের জন্য AndroidX উপাদান ব্যবহার করে, তাই আপনাকে AppCompatActivity প্রসারিত করতে এটি সংজ্ঞায়িত করতে হবে। এটি FragmentActivity এক্সটেনশনকে প্রতিস্থাপন করে যা একটি মানচিত্র কার্যকলাপের জন্য ডিফল্টরূপে সংজ্ঞায়িত করা হয়।

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

ক্লাস ভেরিয়েবল যোগ করুন

এর পরে, বিভিন্ন ক্লাস পদ্ধতিতে ব্যবহৃত বিভিন্ন ক্লাস ভেরিয়েবল ঘোষণা করুন। এর মধ্যে UI উপাদান এবং স্থিতি কোড অন্তর্ভুক্ত। এগুলি GoogleMap mMap এর জন্য পরিবর্তনশীল ঘোষণার ঠিক নীচে থাকা উচিত।

    // New variables for Current Place picker
    private static final String TAG = "MapsActivity";
    ListView lstPlaces;
    private PlacesClient mPlacesClient;
    private FusedLocationProviderClient mFusedLocationProviderClient;

    // The geographical location where the device is currently located. That is, the last-known
    // location retrieved by the Fused Location Provider.
    private Location mLastKnownLocation;

    // A default location (Sydney, Australia) and default zoom to use when location permission is
    // not granted.
    private final LatLng mDefaultLocation = new LatLng(-33.8523341, 151.2106085);
    private static final int DEFAULT_ZOOM = 15;
    private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
    private boolean mLocationPermissionGranted;

    // Used for selecting the Current Place.
    private static final int M_MAX_ENTRIES = 5;
    private String[] mLikelyPlaceNames;
    private String[] mLikelyPlaceAddresses;
    private String[] mLikelyPlaceAttributions;
    private LatLng[] mLikelyPlaceLatLngs;

onCreate পদ্ধতি আপডেট করুন

অবস্থান পরিষেবাগুলির জন্য রানটাইম ব্যবহারকারীর অনুমতিগুলি পরিচালনা করতে, UI উপাদানগুলি সেট আপ করতে এবং Places API ক্লায়েন্ট তৈরি করতে আপনাকে onCreate পদ্ধতিটি আপডেট করতে হবে৷

বিদ্যমান onCreate() পদ্ধতির শেষে অ্যাকশন টুলবার, ভিউ সেটআপ এবং প্লেস ক্লায়েন্ট সম্পর্কিত কোডের নিম্নলিখিত লাইন যোগ করুন।

MapsActivity.java onCreate()

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //
        
        // Set up the action toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Set up the views
        lstPlaces = (ListView) findViewById(R.id.listPlaces);

        // Initialize the Places client
        String apiKey = getString(R.string.google_maps_key);
        Places.initialize(getApplicationContext(), apiKey);
        mPlacesClient = Places.createClient(this);
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    }

আপনার অ্যাপ বার মেনুর জন্য কোড যোগ করুন

এই দুটি পদ্ধতি অ্যাপ বার মেনু যোগ করে (একটি আইটেম, পিক প্লেস আইকন সহ) এবং আইকনে ব্যবহারকারীর ক্লিক পরিচালনা করে।

onCreate পদ্ধতির পরে এই দুটি পদ্ধতি আপনার ফাইলে অনুলিপি করুন।

MapsActivity.java onCreateOptionsMenu() এবং onOptionsItemSelected()

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
           case R.id.action_geolocate:
                
                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the current place picker
                // pickCurrentPlace();
                return true;

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }

এটা পরীক্ষা করো

  1. অ্যান্ড্রয়েড স্টুডিও থেকে, রান বা রান মেনু > রান 'অ্যাপ' এ ক্লিক করুন।

28bea91c68c36fb2.png

  1. আপনাকে আপনার স্থাপনার লক্ষ্য নির্বাচন করতে বলা হয়েছে। চলমান এমুলেটর এই তালিকায় উপস্থিত হওয়া উচিত। এটি নির্বাচন করুন এবং অ্যান্ড্রয়েড স্টুডিও আপনার জন্য এমুলেটরে অ্যাপটি স্থাপন করে।

f44658ca91f6f41a.png

কিছুক্ষণ পর অ্যাপটি চালু হয়। আপনি সিডনি, অস্ট্রেলিয়া কেন্দ্রিক মানচিত্রটি একক বোতাম এবং জনবসতিহীন স্থানের তালিকা সহ দেখতে পান।

68eb8c70f4748350.png

আপনি ডিভাইসের অবস্থান অ্যাক্সেস করার অনুমতির অনুরোধ না করা পর্যন্ত মানচিত্রের ফোকাস ব্যবহারকারীর অবস্থানে স্থানান্তরিত হয় না।

10. অবস্থান অনুমতি অনুরোধ এবং পরিচালনা করুন

মানচিত্র প্রস্তুত হওয়ার পরে অবস্থানের অনুমতির জন্য অনুরোধ করুন

  1. getLocationPermission নামে একটি পদ্ধতি সংজ্ঞায়িত করুন যা ব্যবহারকারীর অনুমতির জন্য অনুরোধ করে।

আপনার তৈরি করা onOptionsSelected পদ্ধতির নিচে এই কোডটি পেস্ট করুন।

MapsActivity.java getLocationPermission()

    private void getLocationPermission() {
        /*
         * Request location permission, so that we can get the location of the
         * device. The result of the permission request is handled by a callback,
         * onRequestPermissionsResult.
         */
        mLocationPermissionGranted = false;
        if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted = true;
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        }
    }
  1. জুম নিয়ন্ত্রণ সক্ষম করতে এবং ব্যবহারকারীর কাছ থেকে অবস্থানের অনুমতির অনুরোধ করতে বিদ্যমান onMapReady পদ্ধতির শেষে দুটি লাইন যুক্ত করুন৷

MapsActivity.java onMapReady()

   @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //

        // Enable the zoom controls for the map
        mMap.getUiSettings().setZoomControlsEnabled(true);

        // Prompt the user for permission.
        getLocationPermission();

    }

অনুরোধ করা অনুমতি থেকে ফলাফল পরিচালনা করুন

যখন ব্যবহারকারী অনুরোধের অনুমতি ডায়ালগে সাড়া দেয়, তখন এই কলব্যাকটি Android দ্বারা ডাকা হয়।

getLocationPermission() পদ্ধতির পরে এই কোডটি আটকান:

MapsActivity.java onRequestPermissionsResult()

   /**
     * Handles the result of the request for location permissions
     */
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        mLocationPermissionGranted = false;
        switch (requestCode) {
            case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLocationPermissionGranted = true;
                }
            }
        }
    }

11. বর্তমান অবস্থান পান এবং সম্ভাব্য স্থানগুলি আনুন৷

যখন ব্যবহারকারী অ্যাপ বারে Pick Place-এ ক্লিক করেন, অ্যাপটি পদ্ধতিটিকে কল করে pickCurrentPlace() , যা আপনার আগে সংজ্ঞায়িত getDeviceLocation() পদ্ধতিটিকে কল করে। সর্বশেষ ডিভাইসের অবস্থান পুনরুদ্ধার করার পরে getDeviceLocation পদ্ধতি আরেকটি পদ্ধতি, getCurrentPlaceLikelihoods, কল করে।

FindCurrentPlace API কল করুন এবং প্রতিক্রিয়া পরিচালনা করুন

getCurrentPlaceLikelihoods একটি findCurrentPlaceRequest করে এবং Places API findCurrentPlace কল করে। যদি টাস্কটি সফল হয়, এটি একটি findCurrentPlaceResponse , যাতে placeLikelihood বস্তুর একটি তালিকা থাকে। স্থানের নাম এবং ঠিকানা এবং আপনি সেই জায়গায় থাকার সম্ভাবনা সহ এর প্রত্যেকটির বেশ কয়েকটি বৈশিষ্ট্য রয়েছে (0 থেকে 1 পর্যন্ত দ্বিগুণ মান)। এই পদ্ধতিটি placeLikelihoods থেকে স্থানের বিবরণের তালিকা তৈরি করে প্রতিক্রিয়া পরিচালনা করে।

এই কোডটি সবচেয়ে বেশি সম্ভাব্য পাঁচটি স্থানের মাধ্যমে পুনরাবৃত্তি করে এবং 0 এর চেয়ে সম্ভাব্য গ্রাটার সহ একটি তালিকায় যোগ করে যা এটি রেন্ডার করে। আপনি যদি পাঁচটির বেশি বা কম প্রদর্শন করতে চান, M_MAX_ENTRIES ধ্রুবক সম্পাদনা করুন।

onMapReady পদ্ধতির পরে এই কোডটি আটকান।

MapsActivity.java getCurrentPlaceLikelihoods()

   private void getCurrentPlaceLikelihoods() {
        // Use fields to define the data types to return.
        List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS,
                Place.Field.LAT_LNG);

        // Get the likely places - that is, the businesses and other points of interest that
        // are the best match for the device's current location.
        @SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
                FindCurrentPlaceRequest.builder(placeFields).build();
        Task<FindCurrentPlaceResponse> placeResponse = mPlacesClient.findCurrentPlace(request);
        placeResponse.addOnCompleteListener(this,
                new OnCompleteListener<FindCurrentPlaceResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<FindCurrentPlaceResponse> task) {
                        if (task.isSuccessful()) {
                            FindCurrentPlaceResponse response = task.getResult();
                            // Set the count, handling cases where less than 5 entries are returned.
                            int count;
                            if (response.getPlaceLikelihoods().size() < M_MAX_ENTRIES) {
                                count = response.getPlaceLikelihoods().size();
                            } else {
                                count = M_MAX_ENTRIES;
                            }

                            int i = 0;
                            mLikelyPlaceNames = new String[count];
                            mLikelyPlaceAddresses = new String[count];
                            mLikelyPlaceAttributions = new String[count];
                            mLikelyPlaceLatLngs = new LatLng[count];

                            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                                Place currPlace = placeLikelihood.getPlace();
                                mLikelyPlaceNames[i] = currPlace.getName();
                                mLikelyPlaceAddresses[i] = currPlace.getAddress();
                                mLikelyPlaceAttributions[i] = (currPlace.getAttributions() == null) ?
                                        null : TextUtils.join(" ", currPlace.getAttributions());
                                mLikelyPlaceLatLngs[i] = currPlace.getLatLng();

                                String currLatLng = (mLikelyPlaceLatLngs[i] == null) ?
                                        "" : mLikelyPlaceLatLngs[i].toString();

                                Log.i(TAG, String.format("Place " + currPlace.getName()
                                        + " has likelihood: " + placeLikelihood.getLikelihood()
                                        + " at " + currLatLng));

                                i++;
                                if (i > (count - 1)) {
                                    break;
                                }
                            }


                            // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                            // Populate the ListView
                            // fillPlacesList();
                        } else {
                            Exception exception = task.getException();
                            if (exception instanceof ApiException) {
                                ApiException apiException = (ApiException) exception;
                                Log.e(TAG, "Place not found: " + apiException.getStatusCode());
                            }
                        }
                    }
                });
    }

ম্যাপ ক্যামেরাটিকে ডিভাইসের বর্তমান অবস্থানে নিয়ে যান

যদি ব্যবহারকারী অনুমতি দেয়, অ্যাপটি ব্যবহারকারীর সর্বশেষ অবস্থান নিয়ে আসে এবং ক্যামেরাটিকে সেই অবস্থানের চারপাশে কেন্দ্রে নিয়ে যায়।

যদি ব্যবহারকারী অনুমতি অস্বীকার করেন, অ্যাপটি কেবল ক্যামেরাটিকে এই পৃষ্ঠার শুরুতে ধ্রুবকগুলির মধ্যে সংজ্ঞায়িত ডিফল্ট অবস্থানে নিয়ে যায় (নমুনা কোডে, এটি সিডনি, অস্ট্রেলিয়া)।

getPlaceLikelihoods() পদ্ধতির পরে এই কোডটি আটকান:

MapsActivity.java getDeviceLocation()

    private void getDeviceLocation() {
        /*
         * Get the best and most recent location of the device, which may be null in rare
         * cases when a location is not available.
         */
        try {
            if (mLocationPermissionGranted) {
                Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            // Set the map's camera position to the current location of the device.
                            mLastKnownLocation = task.getResult();
                            Log.d(TAG, "Latitude: " + mLastKnownLocation.getLatitude());
                            Log.d(TAG, "Longitude: " + mLastKnownLocation.getLongitude());
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                    new LatLng(mLastKnownLocation.getLatitude(),
                                            mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
                        } else {
                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                            mMap.moveCamera(CameraUpdateFactory
                                    .newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                        }

                       getCurrentPlaceLikelihoods();
                    }
                });
            }
        } catch (SecurityException e)  {
            Log.e("Exception: %s", e.getMessage());
        }
    }

ব্যবহারকারী যখন Pick Place-এ ক্লিক করেন তখন লোকেশন পারমিশন চেক করুন

ব্যবহারকারী যখন Pick Place এ ট্যাপ করে, তখন এই পদ্ধতিটি লোকেশনের অনুমতি পরীক্ষা করে এবং ব্যবহারকারীকে অনুমতি না দিলে অনুমতির জন্য অনুরোধ করে।

ব্যবহারকারী যদি অনুমতি দিয়ে থাকেন, তাহলে পদ্ধতিটি বর্তমান সম্ভাব্য স্থানগুলি পাওয়ার প্রক্রিয়া শুরু করতে getDeviceLocation কে কল করে।

  1. getDeviceLocation() পরে এই পদ্ধতিটি যুক্ত করুন:

MapsActivity.java pickCurrentPlace()

   private void pickCurrentPlace() {
        if (mMap == null) {
            return;
        }

        if (mLocationPermissionGranted) {
            getDeviceLocation();
        } else {
            // The user has not granted permission.
            Log.i(TAG, "The user did not grant location permission.");

            // Add a default marker, because the user hasn't selected a place.
            mMap.addMarker(new MarkerOptions()
                    .title(getString(R.string.default_info_title))
                    .position(mDefaultLocation)
                    .snippet(getString(R.string.default_info_snippet)));

            // Prompt the user for permission.
            getLocationPermission();
        }
    }
  1. এখন যেহেতু pickCurrentPlace সংজ্ঞায়িত করা হয়েছে, onOptionsItemSelected() এ যে লাইনটি pickCurrentPlace কল করে সেটি খুঁজুন এবং এটিকে মন্তব্য করুন।

MapsActivity.java onOptionItemSelected()

           case R.id.action_geolocate:

                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the Current Place picker
                pickCurrentPlace();
                return true;

এটা পরীক্ষা করো

আপনি যদি এখন অ্যাপটি চালান এবং Pick Place এ আলতো চাপুন, তাহলে এটি অবস্থানের অনুমতির জন্য অনুরোধ করবে।

  • আপনি অনুমতি দিলে, সেই পছন্দটি সংরক্ষণ করা হয় এবং আপনাকে অনুরোধ করা হবে না। আপনি যদি অনুমতি অস্বীকার করেন, পরের বার আপনি বোতামটি আলতো চাপলে আপনাকে অনুরোধ করা হবে।
  • যদিও getPlaceLikelihoods সম্ভাব্য বর্তমান স্থানগুলি নিয়ে এসেছে, ListView এখনও সেগুলি প্রদর্শন করে না। অ্যান্ড্রয়েড স্টুডিওতে, আপনার নতুন পদ্ধতিগুলি সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে MapsActivity ট্যাগ করা স্টেটমেন্টের জন্য Logcat-এ লগগুলি পরীক্ষা করতে আপনি ⌘6 ক্লিক করতে পারেন।
  • আপনি যদি অনুমতি দেন, লগগুলিতে অক্ষাংশের জন্য একটি বিবৃতি অন্তর্ভুক্ত থাকে Latitude: এবং Longitude: ডিভাইসের সনাক্ত করা অবস্থান দেখায়৷ আপনি যদি আগে এমুলেটরের জন্য একটি অবস্থান নির্দিষ্ট করতে Google মানচিত্র এবং এমুলেটরের বর্ধিত মেনু ব্যবহার করেন, তাহলে এই বিবৃতিগুলি সেই অবস্থানটি দেখায়।
  • যদি findCurrentPlace করার কলটি সফল হয়, তাহলে লগগুলিতে পাঁচটি বিবৃতি অন্তর্ভুক্ত রয়েছে যা পাঁচটি সম্ভাব্য স্থানের নাম এবং অবস্থানগুলি মুদ্রণ করে৷

d9896a245b81bf3.png

12. বর্তমান স্থান চয়নকারী পপুলেট করুন

বাছাই করা জায়গাগুলির জন্য একটি হ্যান্ডলার সেট আপ করুন

ব্যবহারকারী ListView এ কোনো আইটেম ক্লিক করলে আমরা কী ঘটতে চাই তা নিয়ে চিন্তা করা যাক। ব্যবহারকারীর পছন্দ নিশ্চিত করার জন্য যে তারা বর্তমানে কোন স্থানে আছে, আপনি সেই স্থানে মানচিত্রে একটি মার্কার যোগ করতে পারেন। ব্যবহারকারী যদি সেই মার্কারটি ক্লিক করে, একটি তথ্য উইন্ডো পপ আপ হয় যা স্থানের নাম এবং ঠিকানা প্রদর্শন করে।

pickCurrentPlace পদ্ধতির পরে এই ক্লিক হ্যান্ডলারটি আটকান।

MapsActivity.java listClickedHandler

    private AdapterView.OnItemClickListener listClickedHandler = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            // position will give us the index of which place was selected in the array
            LatLng markerLatLng = mLikelyPlaceLatLngs[position];
            String markerSnippet = mLikelyPlaceAddresses[position];
            if (mLikelyPlaceAttributions[position] != null) {
                markerSnippet = markerSnippet + "\n" + mLikelyPlaceAttributions[position];
            }

            // Add a marker for the selected place, with an info window
            // showing information about that place.
            mMap.addMarker(new MarkerOptions()
                    .title(mLikelyPlaceNames[position])
                    .position(markerLatLng)
                    .snippet(markerSnippet));

           // Position the map's camera at the location of the marker.
            mMap.moveCamera(CameraUpdateFactory.newLatLng(markerLatLng));
        }
    };

লিস্টভিউ পপুলেট করুন

এখন যেহেতু ব্যবহারকারী বর্তমানে পরিদর্শন করছেন এমন সম্ভাব্য স্থানগুলির তালিকা আপনার কাছে রয়েছে, আপনি তালিকা ভিউ-এ ব্যবহারকারীর কাছে সেই ListView উপস্থাপন করতে পারেন। আপনি এইমাত্র সংজ্ঞায়িত ক্লিক হ্যান্ডলার ব্যবহার করতে ListView ক্লিক শ্রোতা সেট করতে পারেন।

ক্লিক হ্যান্ডলারের পরে এই পদ্ধতিটি আটকান:

MapsActivity.java fillPlacesList()

    private void fillPlacesList() {
        // Set up an ArrayAdapter to convert likely places into TextViews to populate the ListView
        ArrayAdapter<String> placesAdapter =
                new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mLikelyPlaceNames);
        lstPlaces.setAdapter(placesAdapter);
        lstPlaces.setOnItemClickListener(listClickedHandler);
    }

এখন যেহেতু fillPlacesList সংজ্ঞায়িত করা হয়েছে, FindPlaceLikelihoods-এর শেষের দিকের লাইনটি খুঁজুন যেটি findPlaceLikelihoods কল fillPlacesList এবং এটিকে আনকমেন্ট করুন।

MapsActivity.java fillPlaceLikelihoods()

               // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Populate the ListView
                fillPlacesList();

বর্তমান স্থান চয়নকারীর জন্য প্রয়োজনীয় সমস্ত কোডই এটি!

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

একটি জায়গা বাছাই পরীক্ষা

  1. অ্যাপটি আবার চালান।

এইবার আপনি যখন Pick Place এ আলতো চাপুন, অ্যাপটি অবস্থানের কাছাকাছি নামযুক্ত স্থানগুলির সাথে তালিকাটি পূরণ করে। মাউয়ের এই অবস্থানের কাছাকাছি উলুলানির হাওয়াইয়ান শেভ আইস এবং সুগার বিচ বেক শপের মতো জায়গা রয়েছে। যেহেতু বেশ কয়েকটি স্থান অবস্থান স্থানাঙ্কের খুব কাছাকাছি, এটি সম্ভবত এমন জায়গাগুলির একটি তালিকা যেখানে আপনি থাকতে পারেন৷

  1. ListView এ একটি জায়গার নামের উপর ক্লিক করুন।

আপনি মানচিত্রে যোগ করা একটি মার্কার দেখতে হবে.

  1. মার্কারটি আলতো চাপুন।

আপনি স্থান বিবরণ দেখতে পারেন.

e52303cc0de6a513.png864c74342fb52a01.png

একটি ভিন্ন অবস্থান পরীক্ষা করুন

আপনি যদি আপনার অবস্থান পরিবর্তন করতে চান এবং এমুলেটর ব্যবহার করছেন, আপনি যখন এমুলেটরের বর্ধিত মেনুতে অবস্থান স্থানাঙ্ক আপডেট করেন তখন ডিভাইসের অবস্থান স্বয়ংক্রিয়ভাবে আপডেট হয় না।

এটির কাছাকাছি পেতে, এমুলেটরের অবস্থানে জোর করে আপডেটগুলি করতে নেটিভ গুগল ম্যাপ অ্যাপ ব্যবহার করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. গুগল ম্যাপ খুলুন।
  2. আলতো চাপুন ... > নতুন স্থানাঙ্কে অক্ষাংশ এবং দ্রাঘিমাংশ পরিবর্তন করতে, তারপরে পাঠান এ আলতো চাপুন।
  3. উদাহরণস্বরূপ, আপনি অক্ষাংশ ব্যবহার করতে পারেন: 49.2768 এবং দ্রাঘিমাংশ: -123.1142 ভ্যাঙ্কুভার, কানাডার ডাউনটাউনে অবস্থান সেট করতে।
  4. যাচাই করুন যে Google Maps আপনার নতুন স্থানাঙ্কে রিসেন্টার করেছে। পুনঃস্থাপনের অনুরোধ করতে আপনাকে Google মানচিত্র অ্যাপে আমার অবস্থান বোতামে ট্যাপ করতে হতে পারে।
  5. আপনার বর্তমান স্থান অ্যাপে ফিরে যান এবং নতুন স্থানাঙ্কে মানচিত্র পেতে এবং সম্ভাব্য বর্তমান স্থানগুলির একটি নতুন তালিকা দেখতে স্থান চয়ন করুন আলতো চাপুন৷

9adb99d1ce25c184.png

এবং এটাই! আপনি একটি সাধারণ অ্যাপ তৈরি করেছেন যা বর্তমান অবস্থানের স্থানগুলি পরীক্ষা করে এবং আপনি কোনটিতে আছেন তার একটি সম্ভাবনা দেয়৷ উপভোগ করুন!

এখন এগিয়ে যান এবং এই বোনাস ধাপটি সম্পূর্ণ করার জন্য আপনি যে পরিবর্তনগুলি করেছেন তার সাথে অ্যাপটি চালান!

14. পরবর্তী পদক্ষেপ

আপনার API কী চুরি রোধ করতে, আপনাকে এটি সুরক্ষিত করতে হবে যাতে শুধুমাত্র আপনার Android অ্যাপই কী ব্যবহার করতে পারে। যদি অনিয়ন্ত্রিত রাখা হয়, আপনার কী আছে যে কেউ এটি ব্যবহার করে Google মানচিত্র প্ল্যাটফর্ম API কল করতে পারে এবং আপনাকে বিল পেতে হতে পারে।

আপনার SHA-1 শংসাপত্র পান

আপনি যখন আপনার API কীগুলিকে সীমাবদ্ধ করবেন তখন আপনার এটির প্রয়োজন হবে৷ আপনার ডিবাগ শংসাপত্র পাওয়ার জন্য নিম্নলিখিত নির্দেশাবলীর একটি সেট।

লিনাক্স বা ম্যাকোএসের জন্য, একটি টার্মিনাল উইন্ডো খুলুন এবং নিম্নলিখিতটি লিখুন:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

Windows Vista এবং Windows 7 এর জন্য, নিম্নলিখিত কমান্ডটি চালান:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

আপনি এই অনুরূপ আউটপুট দেখতে হবে:

Alias name: androiddebugkey
Creation date: Jan 01, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 4aa9b300
Valid from: Mon Jan 01 08:04:04 UTC 2013 until: Mon Jan 01 18:04:04 PST 2033
Certificate fingerprints:
     MD5:  AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:F9
     SHA1: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75
     Signature algorithm name: SHA1withRSA
     Version: 3

যে লাইনটি SHA1 শুরু হয় তাতে শংসাপত্রের SHA-1 ফিঙ্গারপ্রিন্ট থাকে৷ আঙ্গুলের ছাপ হল কোলন দ্বারা পৃথক করা 20টি দ্বি-সংখ্যার হেক্সাডেসিমেল সংখ্যার ক্রম।

আপনি যখন একটি অ্যাপ রিলিজ করতে প্রস্তুত হন, তখন আপনার রিলিজ সার্টিফিকেট পুনরুদ্ধার করতে এই ডকুমেন্টেশনের নির্দেশাবলী ব্যবহার করুন।

আপনার API কী সীমাবদ্ধতা যোগ করুন

  1. ক্লাউড কনসোলে, APIs এবং পরিষেবাগুলি > শংসাপত্রগুলিতে নেভিগেট করুন।

আপনি এই অ্যাপের জন্য যে কী ব্যবহার করেছেন তা API কী-এর অধীনে তালিকাভুক্ত করা উচিত।

  1. ক্লিক 6454a04865d551e6.png মূল সেটিংস সম্পাদনা করতে।

316b052c621ee91c.png

  1. API কী পৃষ্ঠায়, কী সীমাবদ্ধতার পরে, নিম্নলিখিতগুলি করে অ্যাপ্লিকেশন সীমাবদ্ধতা সেট করুন:
  2. অ্যান্ড্রয়েড অ্যাপ নির্বাচন করুন এবং নির্দেশাবলী অনুসরণ করুন।
  3. একটি আইটেম যোগ করুন ক্লিক করুন.
  4. আপনার প্যাকেজের নাম এবং SHA-1 শংসাপত্রের ফিঙ্গারপ্রিন্ট লিখুন (আগের বিভাগে পুনরুদ্ধার করা হয়েছে)।

উদাহরণ স্বরূপ:

com.google.codelab.currentplace
BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75s
  1. আরও সুরক্ষার জন্য, নিম্নলিখিতগুলি করে API সীমাবদ্ধতা সেট করুন৷
  2. API সীমাবদ্ধতার পরে, Restrict key নির্বাচন করুন।
  3. Android এবং Places API-এর জন্য Maps SDK নির্বাচন করুন।
  4. সম্পন্ন ক্লিক করুন এবং সংরক্ষণ করুন।

15. অভিনন্দন

আপনি একটি সাধারণ অ্যাপ তৈরি করেছেন যা বর্তমান অবস্থানে সবচেয়ে সম্ভাব্য স্থানগুলি পরীক্ষা করে এবং ব্যবহারকারীর নির্বাচিত স্থানের জন্য মানচিত্রে একটি মার্কার যুক্ত করে৷

আরও জানুন