অ্যাডভান্সড অ্যান্ড্রয়েড 09.1: গুগল ম্যাপ

১. স্বাগতম

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

কোর্সটি সম্পর্কে সম্পূর্ণ বিস্তারিত জানতে, অ্যাডভান্সড অ্যান্ড্রয়েড ডেভেলপমেন্ট ওভারভিউ দেখুন

ভূমিকা

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

এই ব্যবহারিকে, আপনি Wander নামের একটি গুগল ম্যাপস অ্যাপ তৈরি করবেন।

যা আপনার ইতিমধ্যেই জানা উচিত

আপনার নিম্নলিখিত বিষয়গুলির সাথে পরিচিত থাকা উচিত:

  • গুগল ম্যাপসের মৌলিক কার্যকারিতা।
  • রানটাইম অনুমতি।
  • অ্যান্ড্রয়েড স্টুডিওতে অ্যাপ তৈরি, নির্মাণ এবং চালানো।
  • আপনার build.gradle ফাইলে বাহ্যিক লাইব্রেরি অন্তর্ভুক্ত করা।

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

  • আপনার অ্যাপে গুগল ম্যাপ যুক্ত করুন।
  • বিভিন্ন ধরনের মানচিত্র প্রদর্শন করুন।
  • গুগল ম্যাপটি স্টাইল করুন।
  • আপনার মানচিত্রে মার্কার যোগ করুন।
  • ব্যবহারকারীকে আগ্রহের কোনো স্থানে (POI) একটি মার্কার স্থাপন করার সুবিধা দিন।
  • অবস্থান ট্র্যাকিং সক্রিয় করুন।
  • গুগল স্ট্রিট ভিউ সক্রিয় করুন।

আপনি যা করবেন

  • গুগল এপিআই কনসোল থেকে একটি এপিআই কী সংগ্রহ করুন এবং আপনার অ্যাপে কী-টি নিবন্ধন করুন।
  • Wander অ্যাপটি তৈরি করুন, যেটিতে একটি অন্তর্নির্মিত গুগল ম্যাপ রয়েছে।
  • আপনার অ্যাপে মার্কার, স্টাইলিং এবং লোকেশন ট্র্যাকিংয়ের মতো কাস্টম ফিচার যোগ করুন।
  • আপনার অ্যাপে লোকেশন ট্র্যাকিং এবং স্ট্রিট ভিউ চালু করুন।

২. অ্যাপের সংক্ষিপ্ত বিবরণ

এই ব্যবহারিকে আপনি Wander অ্যাপ তৈরি করবেন, যা একটি গুগল ম্যাপের আদলে তৈরি। Wander অ্যাপটি আপনাকে বিভিন্ন স্থানে মার্কার স্থাপন করতে, রিয়েল টাইমে আপনার অবস্থান দেখতে এবং স্ট্রিট ভিউ প্যানোরামা দেখার সুযোগ দেয়।

একটি শৈলীযুক্ত গুগল ম্যাপ

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

৩. কাজ ১. প্রজেক্টটি সেট আপ করুন এবং একটি এপিআই কী (API Key) সংগ্রহ করুন।

প্লেসেস এপিআই-এর মতোই গুগল ম্যাপস এপিআই-এর জন্যও একটি এপিআই কী প্রয়োজন। এপিআই কী পেতে হলে, আপনাকে গুগল এপিআই কনসোলে আপনার প্রজেক্টটি রেজিস্টার করতে হবে। এপিআই কী-টি একটি ডিজিটাল সার্টিফিকেটের সাথে সংযুক্ত থাকে, যা অ্যাপটিকে এর নির্মাতার সাথে যুক্ত করে। ডিজিটাল সার্টিফিকেট ব্যবহার এবং আপনার অ্যাপে স্বাক্ষর করা সম্পর্কে আরও জানতে, ‘আপনার অ্যাপে স্বাক্ষর করুন’ দেখুন।

এই ব্যবহারিকে, আপনি ডিবাগ সার্টিফিকেটের জন্য এপিআই কী ব্যবহার করবেন। ডিবাগ সার্টিফিকেটটি নকশাগতভাবেই অসুরক্ষিত, যেমনটি 'আপনার ডিবাগ বিল্ড সাইন করুন' অংশে বর্ণনা করা হয়েছে। গুগল ম্যাপস এপিআই ব্যবহারকারী প্রকাশিত অ্যান্ড্রয়েড অ্যাপগুলোর জন্য একটি দ্বিতীয় এপিআই কী প্রয়োজন: সেটি হলো রিলিজ সার্টিফিকেটের জন্য ব্যবহৃত কী। রিলিজ সার্টিফিকেট কীভাবে পেতে হয় সে সম্পর্কে আরও তথ্যের জন্য, 'এপিআই কী পান' দেখুন।

অ্যান্ড্রয়েড স্টুডিওতে একটি গুগল ম্যাপস অ্যাক্টিভিটি টেমপ্লেট অন্তর্ভুক্ত রয়েছে, যা সহায়ক টেমপ্লেট কোড তৈরি করে। এই টেমপ্লেট কোডে একটি google_maps_api.xml ফাইল থাকে, যাতে এমন একটি লিঙ্ক থাকে যা এপিআই কী (API key) পাওয়াকে সহজ করে তোলে।

১.১ ম্যাপস টেমপ্লেট ব্যবহার করে ওয়ান্ডার প্রজেক্টটি তৈরি করুন।

  1. একটি নতুন অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট তৈরি করুন।
  2. নতুন অ্যাপটির নাম 'Wander' দিন। 'Add an Activity' পৃষ্ঠা পর্যন্ত ডিফল্টগুলো গ্রহণ করুন।
  3. গুগল ম্যাপস অ্যাক্টিভিটি টেমপ্লেটটি নির্বাচন করুন।
  4. ডিফল্ট অ্যাক্টিভিটি নেম এবং লেআউট নেম অপরিবর্তিত রাখুন।
  5. শিরোনামটি পরিবর্তন করে 'Wander' করুন এবং Finish-এ ক্লিক করুন।

অ্যান্ড্রয়েড স্টুডিও মানচিত্র-সম্পর্কিত বেশ কয়েকটি অতিরিক্ত ফাইল তৈরি করে:

google_maps_api.xml

আপনার এপিআই কী (API key) রাখার জন্য আপনি এই কনফিগারেশন ফাইলটি ব্যবহার করেন। টেমপ্লেটটি দুটি google_maps_api.xml ফাইল তৈরি করে: একটি ডিবাগের জন্য এবং অন্যটি রিলিজের জন্য। ডিবাগ সার্টিফিকেটের এপিআই কী-এর ফাইলটি src/debug/res/values এ অবস্থিত। রিলিজ সার্টিফিকেটের এপিআই কী-এর ফাইলটি src/release/res/values এ অবস্থিত। এই ব্যবহারিকে আমরা শুধুমাত্র ডিবাগ সার্টিফিকেটটি ব্যবহার করব।

activity_maps.xml

এই লেআউট ফাইলটিতে একটিমাত্র ফ্র্যাগমেন্ট রয়েছে যা পুরো স্ক্রিনটি জুড়ে থাকে। SupportMapFragment ক্লাসটি Fragment ক্লাসের একটি সাবক্লাস। আপনি যেকোনো ViewGroup এর মধ্যে একটি <fragment> ট্যাগ ব্যবহার করে, একটি অতিরিক্ত অ্যাট্রিবিউটসহ, লেআউট ফাইলে SupportMapFragment অন্তর্ভুক্ত করতে পারেন:

android:name="com.google.android.gms.maps.SupportMapFragment"

MapsActivity.java

MapsActivity.java ফাইলটি SupportMapFragment ক্লাসটি ইনস্ট্যানশিয়েট করে এবং গুগল ম্যাপ প্রস্তুত করার জন্য ক্লাসটির getMapAsync() মেথড ব্যবহার করে। যে অ্যাক্টিভিটিতে SupportMapFragment রয়েছে, সেটিকে অবশ্যই OnMapReadyCallback ইন্টারফেস এবং সেই ইন্টারফেসের onMapReady() মেথডটি ইমপ্লিমেন্ট করতে হবে। getMapAsync() মেথডটি একটি GoogleMap অবজেক্ট রিটার্ন করে, যা নির্দেশ করে যে ম্যাপটি লোড হয়েছে।

১.২ এপিআই কী সংগ্রহ করুন

  1. google_maps_api.xml ফাইলটির ডিবাগ সংস্করণটি খুলুন।

ফাইলটিতে একটি দীর্ঘ ইউআরএল সহ একটি মন্তব্য রয়েছে। ইউআরএলটির প্যারামিটারগুলোতে আপনার অ্যাপ সম্পর্কে নির্দিষ্ট তথ্য অন্তর্ভুক্ত আছে।

  1. URL-টি কপি করে ব্রাউজারে পেস্ট করুন।
  2. গুগল এপিআই কনসোলে একটি প্রজেক্ট তৈরি করতে নির্দেশাবলী অনুসরণ করুন। প্রদত্ত URL-এ থাকা প্যারামিটারগুলোর কারণে, এপিআই কনসোল স্বয়ংক্রিয়ভাবে গুগল ম্যাপস অ্যান্ড্রয়েড এপিআই সক্রিয় করে দেয়।
  3. একটি API কী তৈরি করুন এবং কী-টির ব্যবহার শুধু অ্যান্ড্রয়েড অ্যাপে সীমাবদ্ধ করতে ‘Restrict Key’-তে ক্লিক করুন। তৈরি হওয়া API কী-টি AIza দিয়ে শুরু হওয়া উচিত।
  4. google_maps_api.xml ফাইলে, যেখানে YOUR_KEY_HERE লেখা আছে, সেই google_maps_key স্ট্রিং-এর মধ্যে কী-টি পেস্ট করুন।
  5. আপনার অ্যাপটি চালান। আপনার অ্যাক্টিভিটিতে একটি এমবেডেড ম্যাপ আছে, যেখানে অস্ট্রেলিয়ার সিডনিতে একটি মার্কার সেট করা আছে। (সিডনি মার্কারটি টেমপ্লেটের একটি অংশ, এবং আপনি এটি পরে পরিবর্তন করবেন।)

৪. কাজ ২. মানচিত্রের প্রকার এবং চিহ্নিতকারী যোগ করুন

গুগল ম্যাপসে বিভিন্ন ধরনের ম্যাপ রয়েছে: নরমাল, হাইব্রিড, স্যাটেলাইট, টেরেইন এবং "নন"। এই টাস্কে আপনি একটি অপশনস মেনুসহ একটি অ্যাপ বার যোগ করবেন, যা ব্যবহারকারীকে ম্যাপের ধরন পরিবর্তন করার সুযোগ দেবে। আপনি ম্যাপের শুরুর অবস্থানটি আপনার নিজের বাড়ির অবস্থানে নিয়ে আসবেন। এরপর আপনি মার্কারের জন্য সাপোর্ট যোগ করবেন, যা ম্যাপের উপর একক অবস্থান নির্দেশ করে এবং এতে একটি লেবেলও অন্তর্ভুক্ত থাকতে পারে।

২.১ মানচিত্রের প্রকার যোগ করুন

আপনার ব্যবহারকারী কোন ধরনের মানচিত্র চান, তা নির্ভর করে তাদের কী ধরনের তথ্য প্রয়োজন তার উপর। গাড়িতে পথ খুঁজে বের করার জন্য মানচিত্র ব্যবহার করার সময়, রাস্তার নামগুলো স্পষ্টভাবে দেখতে পাওয়াটা সহায়ক হয়। যখন আপনি হাইকিং করেন, তখন সম্ভবত পাহাড়ের চূড়ায় পৌঁছানোর জন্য আপনাকে কতটা চড়তে হবে, সেদিকেই আপনার বেশি মনোযোগ থাকে। এই ধাপে, আপনি একটি অপশন মেনুসহ একটি অ্যাপ বার যোগ করবেন, যা ব্যবহারকারীকে মানচিত্রের ধরন পরিবর্তন করার সুযোগ দেবে।

  1. নতুন মেনু XML ফাইল তৈরি করতে, আপনার res ডিরেক্টরিতে রাইট-ক্লিক করুন এবং New > Android Resource File নির্বাচন করুন।
  2. ডায়ালগ বক্সে, ফাইলটির নাম map_options দিন। রিসোর্স টাইপের জন্য Menu নির্বাচন করুন। OK- তে ক্লিক করুন।
  3. ম্যাপ অপশনগুলো তৈরি করতে নতুন ফাইলের কোডটি নিচের কোড দিয়ে প্রতিস্থাপন করুন। 'none' ম্যাপ টাইপটি বাদ দেওয়া হয়েছে, কারণ 'none' নির্বাচন করলে কোনো ম্যাপই থাকে না।
<?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">
   <item android:id="@+id/normal_map"
       android:title="@string/normal_map"
       app:showAsAction="never"/>
   <item android:id="@+id/hybrid_map"
       android:title="@string/hybrid_map"
       app:showAsAction="never"/>
   <item android:id="@+id/satellite_map"
       android:title="@string/satellite_map"
       app:showAsAction="never"/>
   <item android:id="@+id/terrain_map"
       android:title="@string/terrain_map"
       app:showAsAction="never"/>
</menu>
  1. title অ্যাট্রিবিউটগুলোর জন্য স্ট্রিং রিসোর্স তৈরি করুন।
  2. MapsActivity ফাইলে, FragmentActivity ক্লাস এক্সটেন্ড করার পরিবর্তে AppCompatActivity ক্লাসটি এক্সটেন্ড করুন। AppCompatActivity ব্যবহার করলে অ্যাপ বারটি দেখা যাবে এবং এর ফলে মেনুটিও প্রদর্শিত হবে।
  3. MapsActivity তে, onCreateOptionsMenu() মেথডটি ওভাররাইড করুন এবং map_options ফাইলটি ইনফ্লেট করুন:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.map_options, menu);
   return true;
}
  1. ম্যাপের ধরন পরিবর্তন করতে, GoogleMap অবজেক্টের setMapType () মেথডটি ব্যবহার করুন এবং ম্যাপ-টাইপ কনস্ট্যান্টগুলোর মধ্যে একটি পাস করুন।

onOptionsItemSelected() মেথডটি ওভাররাইড করুন। ব্যবহারকারী মেনু অপশনগুলোর মধ্যে একটি নির্বাচন করলে ম্যাপের ধরন পরিবর্তন করার জন্য নিম্নলিখিত কোডটি পেস্ট করুন:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       // Change the map type based on the user's selection.
       switch (item.getItemId()) {
           case R.id.normal_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
               return true;
           case R.id.hybrid_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
               return true;
           case R.id.satellite_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
               return true;
           case R.id.terrain_map:
               mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
               return true;
           default:
               return super.onOptionsItemSelected(item);
       }
    }
  1. অ্যাপটি চালান। অ্যাপ বারের মেনু ব্যবহার করে ম্যাপের ধরন পরিবর্তন করুন। লক্ষ্য করুন কীভাবে ম্যাপের চেহারা বদলে যায়।

২.২ ডিফল্ট মানচিত্রের অবস্থান সরান

ডিফল্টরূপে, onMapReady() কলব্যাকে এমন কোড অন্তর্ভুক্ত থাকে যা অস্ট্রেলিয়ার সিডনিতে একটি মার্কার স্থাপন করে, যেখানে গুগল ম্যাপস তৈরি করা হয়েছিল। ডিফল্ট কলব্যাকটি ম্যাপটিকে সিডনিতে প্যান করার জন্য অ্যানিমেটও করে। এই ধাপে, আপনি কোনো মার্কার স্থাপন না করেই ম্যাপটিকে আপনার বাড়ির অবস্থানে প্যান করাবেন, তারপর আপনার নির্দিষ্ট করা একটি লেভেলে জুম করবেন।

  1. onMapReady() মেথড থেকে সিডনিতে মার্কার স্থাপন এবং ক্যামেরা সরানোর কোডটি সরিয়ে দিন।
  2. আপনার ব্রাউজারে www.google.com/maps- এ যান এবং আপনার বাড়িটি খুঁজে বের করুন।
  3. অবস্থানটির উপর রাইট-ক্লিক করুন এবং 'এখানে কী আছে?' নির্বাচন করুন।

স্ক্রিনের নিচের দিকে অক্ষাংশ ও দ্রাঘিমাংশসহ অবস্থানের তথ্য সম্বলিত একটি ছোট উইন্ডো ভেসে ওঠে।

  1. home নামে একটি নতুন LatLng অবজেক্ট তৈরি করুন। এই LatLng অবজেক্টের মধ্যে, ব্রাউজারে Google Maps থেকে পাওয়া স্থানাঙ্কগুলো ব্যবহার করুন।
  2. zoom নামে একটি float ভেরিয়েবল তৈরি করুন এবং ভেরিয়েবলটিকে আপনার পছন্দসই প্রাথমিক জুম লেভেলে সেট করুন। নিচের তালিকাটি আপনাকে একটি ধারণা দেবে যে, জুমের প্রতিটি লেভেল কী পরিমাণ বিস্তারিত তথ্য দেখায়:
  • 1 : বিশ্ব
  • 5 : ভূখণ্ড/মহাদেশ
  • 10 : শহর
  • 15 : রাস্তা
  • 20 : ভবন
  1. আপনার LatLng অবজেক্ট এবং zoom ভেরিয়েবল পাস করে CameraUpdateFactory.newLatLngZoom() ব্যবহার করে একটি CameraUpdate অবজেক্ট তৈরি করুন। নতুন CameraUpdate অবজেক্টটি পাস করে GoogleMap অবজেক্টের উপর moveCamera() কল করে ক্যামেরা প্যান এবং জুম করুন:
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(home, zoom));
  1. অ্যাপটি চালান। ম্যাপটি আপনার বাড়ির দিকে প্যান করবে এবং কাঙ্ক্ষিত লেভেলে জুম হবে।

২.৩ মানচিত্রে চিহ্নিতকারী যোগ করুন

গুগল ম্যাপস একটি মার্কার ব্যবহার করে কোনো একটি স্থানকে চিহ্নিত করতে পারে, যা আপনি Marker ক্লাস ব্যবহার করে তৈরি করেন। ডিফল্ট মার্কারটি গুগল ম্যাপসের স্ট্যান্ডার্ড আইকন ব্যবহার করে: গুগল ম্যাপস মার্কার

তথ্য উইন্ডোতে প্রাসঙ্গিক তথ্য দেখানোর জন্য আপনি মার্কারগুলোকে সম্প্রসারিত করতে পারেন।

এই ধাপে, ব্যবহারকারী যখন মানচিত্রের কোনো স্থানে স্পর্শ করে ধরে রাখে, তখন একটি মার্কার যুক্ত করা হয়। এরপর, মার্কারটিতে ট্যাপ করা হলে তার স্থানাঙ্ক প্রদর্শন করার জন্য একটি InfoWindow যুক্ত করা হয়।

হারিয়ে যাওয়া পিনের জন্য একটি তথ্য উইন্ডো

  1. MapsActivity তে setMapLongClick() নামে একটি মেথড স্টাব তৈরি করুন যা আর্গুমেন্ট হিসেবে একটি final GoogleMap গ্রহণ করে এবং void রিটার্ন করে।
private void setMapLongClick(final GoogleMap map) {}
  1. ব্যবহারকারী যেখানে স্পর্শ করে ধরে রাখে, সেখানে একটি মার্কার স্থাপন করতে GoogleMap অবজেক্টের setOnMapLongClickListener() মেথডটি ব্যবহার করুন। OnMapLongClickListener এর একটি নতুন ইনস্ট্যান্স পাস করুন যা onMapLongClick() মেথডটিকে ওভাররাইড করে। আগত আর্গুমেন্টটি হলো একটি LatLng অবজেক্ট, যাতে ব্যবহারকারীর চাপ দেওয়া স্থানের স্থানাঙ্ক থাকে:
private void setMapLongClick(final GoogleMap map) {
   map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
       @Override
       public void onMapLongClick(LatLng latLng) {
       }
   });
}
  1. onMapLongClick() ভিতরে, addMarker() মেথডটি কল করুন। একটি নতুন MarkerOptions অবজেক্ট পাস করুন এবং এর পজিশনটি পাস করা LatLng এর সমান সেট করুন:
map.addMarker(new MarkerOptions().position(latLng));
  1. onMapReady() মেথডের শেষে setMapLongClick() কল করুন। mMap পাস করুন।
  2. অ্যাপটি চালু করুন। কোনো স্থানে মার্কার স্থাপন করতে ম্যাপের উপর স্পর্শ করে ধরে রাখুন।
  3. মার্কারটিতে ট্যাপ করুন, যা এটিকে স্ক্রিনের কেন্দ্রে নিয়ে আসবে।

স্ক্রিনের নিচের-বাম দিকে নেভিগেশন বাটনগুলো দেখা যায়, যা ব্যবহারকারীকে গুগল ম্যাপস অ্যাপ ব্যবহার করে চিহ্নিত অবস্থানে যেতে সাহায্য করে।

মার্কারের জন্য একটি তথ্য উইন্ডো যোগ করতে:

  1. MarkerOptions অবজেক্টে title ফিল্ড এবং snippet ফিল্ড সেট করুন।
  2. onMapLongClick() ফাংশনে title ফিল্ডের মান "Dropped Pin" সেট করুন। addMarker() মেথডের ভিতরে snippet ফিল্ডে অবস্থানের স্থানাঙ্ক সেট করুন।
map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
   @Override
   public void onMapLongClick(LatLng latLng) {
       String snippet = String.format(Locale.getDefault(),
               "Lat: %1$.5f, Long: %2$.5f",
               latLng.latitude,
               latLng.longitude);

       map.addMarker(new MarkerOptions()
               .position(latLng)
               .title(getString(R.string.dropped_pin))
               .snippet(snippet));
   }
});
  1. অ্যাপটি চালান। একটি অবস্থান চিহ্নিতকারী স্থাপন করতে মানচিত্রের উপর স্পর্শ করে ধরে রাখুন। তথ্য উইন্ডোটি দেখতে চিহ্নিতকারীটিতে ট্যাপ করুন।

২.৪ POI লিসেনার যোগ করুন

ডিফল্টরূপে, আগ্রহের স্থানগুলো (POI) তাদের সংশ্লিষ্ট আইকনসহ মানচিত্রে প্রদর্শিত হয়। POI-গুলোর মধ্যে পার্ক, স্কুল, সরকারি ভবন এবং আরও অনেক কিছু অন্তর্ভুক্ত। যখন মানচিত্রের ধরন normal হিসেবে সেট করা থাকে, তখন ব্যবসায়িক POI-গুলোও মানচিত্রে প্রদর্শিত হয়। ব্যবসায়িক POI-গুলো দোকান, রেস্তোরাঁ এবং হোটেলের মতো ব্যবসা প্রতিষ্ঠানকে বোঝায়।

এই ধাপে, আপনি ম্যাপে একটি GoogleMap.OnPoiClickListener যোগ করবেন। এই ক্লিক-লিসেনারটি টাচ ও হোল্ডের জন্য অপেক্ষা না করে, সাথে সাথেই ম্যাপে একটি মার্কার স্থাপন করে। ক্লিক-লিসেনারটি তথ্য উইন্ডোটিও প্রদর্শন করে, যেটিতে POI-এর নামটি থাকে।

আগ্রহের স্থান চিহ্নিতকারী

  1. MapsActivity তে setPoiClick() নামে একটি মেথড স্টাব তৈরি করুন যা আর্গুমেন্ট হিসেবে একটি final GoogleMap গ্রহণ করে এবং void রিটার্ন করে।
private void setPoiClick(final GoogleMap map) {}
  1. setPoiClick() মেথডে, পাস-ইন করা GoogleMap এর উপর একটি OnPoiClickListener সেট করুন:
map.setOnPoiClickListener(new GoogleMap.OnPoiClickListener() {
   @Override
   public void onPoiClick(PointOfInterest poi) {
   }
});
  1. onPoiClick() মেথডে, POI-এর অবস্থানে একটি মার্কার স্থাপন করুন। টাইটেল হিসেবে POI-এর নামটি সেট করুন। ফলাফলটি poiMarker নামক একটি ভেরিয়েবলে সংরক্ষণ করুন।
public void onPoiClick(PointOfInterest poi) {
   Marker poiMarker = mMap.addMarker(new MarkerOptions()
       .position(poi.latLng)
       .title(poi.name);
}
  1. তথ্য উইন্ডোটি অবিলম্বে দেখানোর জন্য poiMarkershowInfoWindow() কল করুন।
poiMarker.showInfoWindow();
  1. onMapReady() এর শেষে setPoiClick() কল করুন। mMap পাস করুন।
  2. আপনার অ্যাপটি চালান এবং পার্কের মতো একটি গুরুত্বপূর্ণ স্থান (POI) খুঁজুন। সেটির উপর একটি মার্কার স্থাপন করতে এবং একটি তথ্য উইন্ডোতে POI-টির নাম প্রদর্শন করতে সেটির উপর ট্যাপ করুন।

৫. কাজ ৩. আপনার মানচিত্রটি শৈলীমণ্ডিত করুন।

আপনি গুগল ম্যাপসকে নানাভাবে কাস্টমাইজ করতে পারেন, যা আপনার ম্যাপকে একটি অনন্য রূপ ও অনুভূতি দেবে।

অন্যান্য ফ্র্যাগমেন্টের মতোই, আপনি উপলব্ধ XML অ্যাট্রিবিউট ব্যবহার করে একটি MapFragment অবজেক্ট কাস্টমাইজ করতে পারেন। তবে, এই ধাপে আপনি GoogleMap অবজেক্টের মেথড ব্যবহার করে MapFragment এর কন্টেন্টের চেহারা ও অনুভূতি কাস্টমাইজ করবেন। আপনার ম্যাপে একটি স্টাইল যোগ করতে এবং আপনার মার্কারগুলো কাস্টমাইজ করতে আপনি অনলাইন স্টাইলিং উইজার্ড ব্যবহার করবেন। এছাড়াও আপনি আপনার হোম লোকেশনে একটি GroundOverlay যোগ করবেন যা ম্যাপের সাথে স্কেল ও রোটেট করে।

৩.১ আপনার মানচিত্রে একটি শৈলী যোগ করুন

আপনার ম্যাপের জন্য একটি কাস্টমাইজড স্টাইল তৈরি করতে, আপনাকে একটি JSON ফাইল জেনারেট করতে হবে যা নির্দিষ্ট করে দেয় ম্যাপের ফিচারগুলো কীভাবে প্রদর্শিত হবে। আপনাকে এই JSON ফাইলটি ম্যানুয়ালি তৈরি করতে হবে না: গুগল স্টাইলিং উইজার্ড সরবরাহ করে, যা আপনার ম্যাপকে দৃশ্যত স্টাইল করার পরে আপনার জন্য JSON ফাইলটি তৈরি করে দেয়। এই প্র্যাকটিক্যালে, আপনি ম্যাপটিকে 'নাইট মোড'-এর জন্য স্টাইল করবেন, যার অর্থ হলো রাতে ব্যবহারের জন্য ম্যাপটি অনুজ্জ্বল রঙ এবং কম কনট্রাস্ট ব্যবহার করবে।

  1. আপনার ব্রাউজারে https://mapstyle.withgoogle.com/ -এ যান।
  2. স্টাইল তৈরি করুন নির্বাচন করুন।
  3. রাত্রি থিমটি নির্বাচন করুন।
  4. মেনুর নিচের দিকে থাকা ‘More Options’- এ ক্লিক করুন।
  5. ফিচার টাইপ তালিকার একেবারে নিচে, ওয়াটার > ফিল নির্বাচন করুন। পানির রঙ পরিবর্তন করে গাঢ় নীল করুন (উদাহরণস্বরূপ, #160064)।
  6. Finish-এ ক্লিক করুন। প্রদর্শিত পপ-আপ উইন্ডো থেকে JSON কোডটি কপি করুন।
  7. অ্যান্ড্রয়েড স্টুডিওতে, res ডিরেক্টরির ভিতরে raw নামে একটি রিসোর্স ডিরেক্টরি তৈরি করুন। res/raw ভিতরে map_style.json নামে একটি ফাইল তৈরি করুন।
  8. JSON কোডটি নতুন রিসোর্স ফাইলে পেস্ট করুন।
  9. ম্যাপে JSON স্টাইল সেট করতে, GoogleMap অবজেক্টের উপর setMapStyle() কল করুন। একটি MapStyleOptions অবজেক্ট পাস করুন, যা JSON ফাইলটি লোড করে। setMapStyle() মেথডটি স্টাইলিং সফল হয়েছে কিনা তা নির্দেশ করে একটি বুলিয়ান রিটার্ন করে। যদি ফাইলটি লোড করা না যায়, তাহলে মেথডটি একটি Resources.NotFoundException থ্রো করে।

ম্যাপটি স্টাইল করার জন্য নিচের কোডটি onMapReady() মেথডে কপি করুন। আপনার লগ স্টেটমেন্টগুলোর জন্য একটি TAG স্ট্রিং তৈরি করার প্রয়োজন হতে পারে:

     try {
        // Customize the styling of the base map using a JSON object defined
        // in a raw resource file.
        boolean success = googleMap.setMapStyle(
           MapStyleOptions.loadRawResourceStyle(
                   this, R.raw.map_style));

        if (!success) {
            Log.e(TAG, "Style parsing failed.");
        }
     } catch (Resources.NotFoundException e) {
        Log.e(TAG, "Can't find style. Error: ", e);
     }
  1. আপনার অ্যাপটি চালান। ম্যাপটি normal মোডে থাকলে নতুন স্টাইলিংটি দেখা যাবে।

গুগল ম্যাপ নাইট মোড স্টাইলে

৩.২ আপনার মার্কারটি স্টাইল করুন

আপনি ম্যাপ মার্কারগুলোকে স্টাইল করার মাধ্যমে আপনার ম্যাপকে আরও ব্যক্তিগত রূপ দিতে পারেন। এই ধাপে, আপনি ডিফল্ট লাল মার্কারগুলোকে নাইট মোডের কালার স্কিমের সাথে মিলিয়ে পরিবর্তন করবেন।

  1. ডিফল্ট মার্কার ব্যবহার করার পাশাপাশি রঙ নীল করার জন্য, onMapLongClick() মেথডের MarkerOptions() কনস্ট্রাক্টরে নিম্নলিখিত কোড লাইনটি যোগ করুন:
.icon(BitmapDescriptorFactory.defaultMarker
       (BitmapDescriptorFactory.HUE_BLUE))
  1. অ্যাপটি চালান। আপনার বসানো মার্কারগুলো এখন নীল রঙে ছায়াচ্ছন্ন হবে, যা অ্যাপটির নাইট-মোড থিমের সাথে আরও বেশি সামঞ্জস্যপূর্ণ।

লক্ষ্য করুন যে POI মার্কারগুলো এখনও লাল রয়েছে, কারণ আপনি onPoiClick() মেথডটিতে স্টাইলিং যোগ করেননি।

৩.৩ একটি ওভারলে যোগ করুন

গুগল ম্যাপ কাস্টমাইজ করার একটি উপায় হলো এর উপরে আঁকাআঁকি করা। এই কৌশলটি তখন কাজে আসে যখন আপনি কোনো বিশেষ ধরনের স্থান, যেমন জনপ্রিয় মাছ ধরার জায়গা, হাইলাইট করতে চান। তিন ধরনের ওভারলে সমর্থিত:

  • আকৃতি: আপনি মানচিত্রে পলিলাইন , বহুভুজ এবং বৃত্ত যোগ করতে পারেন।
  • TileOverlay অবজেক্ট: টাইল ওভারলে হলো একগুচ্ছ ছবি, যা মূল ম্যাপের টাইলগুলোর উপরে যুক্ত করা হয়। ম্যাপে বিস্তৃত চিত্রাবলী যোগ করতে চাইলে টাইল ওভারলে বেশ কার্যকর। একটি সাধারণ টাইল ওভারলে একটি বিশাল ভৌগোলিক এলাকা জুড়ে থাকে।
  • GroundOverlay অবজেক্ট: গ্রাউন্ডওভারলে হলো একটি ছবি যা একটি মানচিত্রে স্থির থাকে। মার্কারের মতো নয়, গ্রাউন্ডওভারলে স্ক্রিনের পরিবর্তে পৃথিবীর পৃষ্ঠের দিকে অভিমুখী থাকে। মানচিত্র ঘোরানো, কাত করা বা জুম করলে ছবিটির অভিমুখ পরিবর্তিত হয়। যখন আপনি মানচিত্রের কোনো একটি নির্দিষ্ট স্থানে একটিমাত্র ছবি স্থির রাখতে চান, তখন গ্রাউন্ডওভারলে বেশ কার্যকর।

এই ধাপে, আপনি আপনার হোম লোকেশনে একটি অ্যান্ড্রয়েড আকৃতির গ্রাউন্ড ওভারলে যোগ করবেন।

  1. এই অ্যান্ড্রয়েড ছবিটি ডাউনলোড করে আপনার res/drawable ফোল্ডারে সংরক্ষণ করুন।
  2. onMapReady() ফাংশনে, ক্যামেরাকে হোম পজিশনে নিয়ে যাওয়ার কলের পরে, একটি GroundOverlayOptions অবজেক্ট তৈরি করুন। অবজেক্টটিকে homeOverlay নামক একটি ভেরিয়েবলে অ্যাসাইন করুন:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions();
  1. উপরের ছবিটি থেকে একটি BitmapDescriptor অবজেক্ট তৈরি করতে BitmapDescriptorFactory.fromResource() মেথডটি ব্যবহার করুন। এই অবজেক্টটি GroundOverlayOptions অবজেক্টের image() মেথডে পাস করুন:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.android));
  1. GroundOverlayOptions অবজেক্টের position প্রপার্টি সেট করতে position() মেথডটি কল করুন। এর সাথে home LatLng অবজেক্ট এবং কাঙ্ক্ষিত ওভারলে-র প্রস্থের জন্য একটি float (মিটারে) পাস করুন। এই উদাহরণের জন্য, ১০০ মিটার প্রস্থ ভালোভাবে কাজ করে:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions()
     .image(BitmapDescriptorFactory.fromResource(R.drawable.android))
       .position(home, 100);
  1. GoogleMap অবজেক্টে addGroundOverlay() কল করুন। আপনার GroundOverlayOptions অবজেক্টটি পাস করুন:
mMap.addGroundOverlay(homeOverlay);
  1. অ্যাপটি চালান। আপনার হোম লোকেশনে জুম ইন করলে, আপনি অ্যান্ড্রয়েড ছবিটি একটি ওভারলে হিসেবে দেখতে পাবেন।

৬. কাজ ৪. অবস্থান ট্র্যাকিং এবং স্ট্রিট ভিউ সক্রিয় করুন

ব্যবহারকারীরা প্রায়শই তাদের বর্তমান অবস্থান দেখতে গুগল ম্যাপস ব্যবহার করেন, এবং আপনি লোকেশন সার্ভিসেস এপিআই (Location Services API) ব্যবহার করে ডিভাইসের অবস্থান পেতে পারেন। Location ডেটার অতিরিক্ত ব্যবহার ছাড়াই আপনার ম্যাপে ডিভাইসের অবস্থান প্রদর্শন করতে, আপনি লোকেশন-ডেটা লেয়ার (location-data layer ) ব্যবহার করতে পারেন।

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

অবস্থান ট্র্যাকিং সহ একটি স্টাইলিশ গুগল ম্যাপ

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

এই টাস্কে, আপনি লোকেশন-ডেটা লেয়ার এবং স্ট্রিট ভিউ সক্রিয় করবেন, যাতে ব্যবহারকারী যখন POI মার্কারের তথ্য উইন্ডোতে ট্যাপ করেন, তখন ম্যাপটি স্ট্রিট ভিউ মোডে চলে যায়।

৪.১ অবস্থান ট্র্যাকিং সক্রিয় করুন

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

এই ধাপে, আপনি অবস্থানের অনুমতি চেয়ে লোকেশন ট্র্যাকিং চালু করবেন।

  1. AndroidManifest.xml ফাইলে, যাচাই করুন যে FINE_LOCATION পারমিশনটি আগে থেকেই উপস্থিত আছে। আপনি যখন গুগল ম্যাপস টেমপ্লেটটি নির্বাচন করেছিলেন, তখন অ্যান্ড্রয়েড স্টুডিও এই পারমিশনটি যুক্ত করে দিয়েছে।
  2. আপনার অ্যাপে লোকেশন ট্র্যাকিং চালু করতে, MapsActivity তে enableMyLocation() নামে একটি মেথড তৈরি করুন, যেটি কোনো আর্গুমেন্ট গ্রহণ করবে না এবং কিছু রিটার্ন করবে না।
  3. enableMyLocation() মেথডটি সংজ্ঞায়িত করুন। ACCESS_FINE_LOCATION পারমিশনটি আছে কিনা তা পরীক্ষা করুন। যদি পারমিশনটি দেওয়া থাকে, তাহলে লোকেশন লেয়ারটি সক্রিয় করুন। অন্যথায়, পারমিশনের জন্য অনুরোধ করুন:
private void enableMyLocation() {
   if (ContextCompat.checkSelfPermission(this,
           Manifest.permission.ACCESS_FINE_LOCATION)
           == PackageManager.PERMISSION_GRANTED) {
       mMap.setMyLocationEnabled(true);
   } else {
       ActivityCompat.requestPermissions(this, new String[]
                       {Manifest.permission.ACCESS_FINE_LOCATION},
               REQUEST_LOCATION_PERMISSION);
   }
}
  1. লোকেশন লেয়ারটি সক্রিয় করতে onMapReady() কলব্যাক থেকে enableMyLocation() কল করুন।
  2. onRequestPermissionsResult() মেথডটি ওভাররাইড করুন। যদি অনুমতি দেওয়া হয়, তাহলে enableMyLocation() কল করুন:
@Override
public void onRequestPermissionsResult(int requestCode,
       @NonNull String[] permissions,
       @NonNull int[] grantResults) {
   // Check if location permissions are granted and if so enable the
   // location data layer.
   switch (requestCode) {
       case REQUEST_LOCATION_PERMISSION:
           if (grantResults.length > 0
                   && grantResults[0]
                   == PackageManager.PERMISSION_GRANTED) {
               enableMyLocation();
               break;
           }
   }
}
  1. অ্যাপটি চালান। এখন উপরের ডান কোণায় ‘আমার অবস্থান’ (My Location) বাটনটি রয়েছে, যা ডিভাইসটির বর্তমান অবস্থান প্রদর্শন করে।

৪.২ স্ট্রিট ভিউ সক্রিয় করুন

গুগল ম্যাপস স্ট্রিট ভিউ প্রদান করে, যা কোনো একটি স্থানের একটি প্যানোরামিক দৃশ্য এবং এতে একটি নির্দিষ্ট পথ ধরে চলার জন্য নিয়ন্ত্রণ ব্যবস্থা থাকে। স্ট্রিট ভিউ বিশ্বব্যাপী উপলব্ধ নয়

এই ধাপে, আপনি একটি স্ট্রিট ভিউ প্যানোরামা সক্রিয় করবেন যা ব্যবহারকারী কোনো POI-এর তথ্য উইন্ডোতে ট্যাপ করলে চালু হয়। আপনাকে দুটি কাজ করতে হবে:

  1. POI মার্কারগুলোকে অন্যান্য মার্কার থেকে আলাদা করুন, কারণ আপনি চান আপনার অ্যাপের কার্যকারিতা যেন শুধুমাত্র POI মার্কারগুলোতেই কাজ করে। এইভাবে, ব্যবহারকারী যখন একটি POI তথ্য উইন্ডোতে ট্যাপ করবে তখন আপনি স্ট্রিট ভিউ চালু করতে পারবেন, কিন্তু অন্য কোনো ধরনের মার্কারে ট্যাপ করলে তা চালু হবে না।

Marker ক্লাসে একটি setTag() মেথড রয়েছে যা আপনাকে ডেটা সংযুক্ত করার সুযোগ দেয়। (ডেটা এমন যেকোনো কিছু হতে পারে যা Object থেকে এক্সটেন্ড করা হয়েছে)। ব্যবহারকারীরা POI-তে ক্লিক করলে যে মার্কারগুলো তৈরি হয়, সেগুলোতে আপনি একটি ট্যাগ সেট করবেন।

  1. যখন ব্যবহারকারী একটি OnInfoWindowClickListener এ কোনো ট্যাগ করা তথ্য উইন্ডোতে ট্যাপ করেন, তখন MapFragment একটি StreetViewPanoramaFragment দিয়ে প্রতিস্থাপন করুন। (নিচের কোডটিতে API 12-এর নিচের অ্যান্ড্রয়েড সংস্করণগুলোকে সমর্থন করার জন্য SupportMapFragment এবং SupportStreetViewPanoramaFragment ব্যবহার করা হয়েছে।)

যদি রানটাইমে কোনো ফ্র্যাগমেন্ট পরিবর্তিত হয়, তবে আপনাকে সেগুলি ধারণকারী Activity ক্লাসে যোগ করতে হবে, XML-এ স্থিরভাবে নয়।

POI চিহ্নিতকারীকে ট্যাগ করুন

  1. onPoiClick() কলব্যাকে, poiMarker এর উপর setTag() কল করুন। যেকোনো একটি স্ট্রিং পাস করুন:
poiMarker.setTag("poi");

স্ট্যাটিক SupportMapFragment-কে একটি রানটাইম ইনস্ট্যান্স দিয়ে প্রতিস্থাপন করুন।

  1. activity_maps.xml ফাইলটি খুলুন এবং এলিমেন্টটিকে একটি ফ্রেম লেআউটে পরিবর্তন করুন যা আপনার ফ্র্যাগমেন্টগুলির কন্টেইনার হিসেবে কাজ করবে:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/fragment_container"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />
  1. MapsActivity এর onCreate() ফাংশন থেকে ID দ্বারা SupportMapFragment খুঁজে বের করার কোডটি সরিয়ে ফেলুন, কারণ XML-এ এখন আর কোনো স্ট্যাটিক SupportMapFragment নেই। এর পরিবর্তে, SupportMapFragment.newInstance() কল করে SupportMapFragment এর একটি নতুন রানটাইম ইনস্ট্যান্স তৈরি করুন।
SupportMapFragment mapFragment = SupportMapFragment.newInstance();
  1. FragmentManager ব্যবহার করে একটি ফ্র্যাগমেন্ট ট্রানজ্যাকশনের মাধ্যমে ফ্র্যাগমেন্টটি FrameLayout এ যুক্ত করুন:
getSupportFragmentManager().beginTransaction()
       .add(R.id.fragment_container, mapFragment).commit();
  1. যে কোড লাইনটি ম্যাপের অ্যাসিঙ্ক্রোনাস লোডিং শুরু করে, সেটি রাখুন:
mapFragment.getMapAsync(this);

একটি OnInfoWindowClickListener সেট করুন এবং মার্কার ট্যাগটি পরীক্ষা করুন।

  1. MapsActivity তে setInfoWindowClickToPanorama() নামে একটি মেথড স্টাব তৈরি করুন যা আর্গুমেন্ট হিসেবে একটি GoogleMap গ্রহণ করে এবং void রিটার্ন করে।
private void setInfoWindowClickToPanorama(GoogleMap map) {}
  1. GoogleMap এ একটি OnInfoWindowClickListener সেট করুন:
map.setOnInfoWindowClickListener(
       new GoogleMap.OnInfoWindowClickListener() {
           @Override
           public void onInfoWindowClick(Marker marker) {
           }
       });
  1. onInfoWindowClick() মেথডে, onPoiClick() মেথডে সেট করা স্ট্রিং ট্যাগটি মার্কারটিতে আছে কিনা তা যাচাই করুন:
if (marker.getTag() == "poi") {}

SupportMapFragment-কে SupportStreetViewPanoramaFragment দিয়ে প্রতিস্থাপন করুন

  1. যে ক্ষেত্রে মার্কারটিতে ট্যাগ থাকে, সেক্ষেত্রে একটি StreetViewPanoramaOptions অবজেক্ট ব্যবহার করে স্ট্রিট ভিউ প্যানোরামার অবস্থান নির্দিষ্ট করুন। অবজেক্টটির position প্রপার্টিকে প্রদত্ত মার্কারের অবস্থানে সেট করুন:
StreetViewPanoramaOptions options =
       new StreetViewPanoramaOptions().position(
               marker.getPosition());
  1. আপনার তৈরি করা options অবজেক্টটি পাস করে SupportStreetViewPanoramaFragment এর একটি নতুন ইনস্ট্যান্স তৈরি করুন:
SupportStreetViewPanoramaFragment streetViewFragment
       = SupportStreetViewPanoramaFragment
       .newInstance(options);
  1. একটি ফ্র্যাগমেন্ট ট্রানজ্যাকশন শুরু করুন। ফ্র্যাগমেন্ট কন্টেইনারের বিষয়বস্তু নতুন ফ্র্যাগমেন্ট, streetViewFragment দিয়ে প্রতিস্থাপন করুন। ট্রানজ্যাকশনটি ব্যাক স্ট্যাকে যুক্ত করুন, যাতে ব্যাক চাপলে অ্যাপটি বন্ধ না হয়ে SupportMapFragment এ ফিরে যায়।
getSupportFragmentManager().beginTransaction()
       .replace(R.id.fragment_container,
               streetViewFragment)
       .addToBackStack(null).commit();
  1. setPoiClick() কল করার পরে onMapReady() ফাংশনে setInfoWindowClickToPanorama(mMap) কল করুন setPoiClick().
  2. অ্যাপটি চালু করুন। স্ট্রিট ভিউ কভারেজ আছে এমন কোনো শহরে, যেমন মাউন্টেন ভিউ (যেখানে গুগলের সদর দপ্তর অবস্থিত), জুম করুন এবং একটি POI (পয়েন্ট অফ ইন্টারেস্ট), যেমন একটি পার্ক, খুঁজুন। একটি মার্কার স্থাপন করতে এবং তথ্য উইন্ডোটি দেখাতে POI-টির উপর ট্যাপ করুন। মার্কারটির অবস্থানের জন্য স্ট্রিট ভিউ মোডে প্রবেশ করতে তথ্য উইন্ডোটিতে ট্যাপ করুন। ম্যাপের মূল অংশে ফিরে যেতে ব্যাক বাটনটি চাপুন।

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

৭. সমাধান কোড

Wander সলিউশন কোড।

৮. কোডিং চ্যালেঞ্জ

সমস্যা: এমন কোনো স্থানে যেখানে স্ট্রিট ভিউ কভারেজ নেই, সেখানকার কোনো POI-এর তথ্য উইন্ডোতে ট্যাপ করলে একটি কালো স্ক্রিন দেখা যায়।

  • কোনো এলাকায় স্ট্রিট ভিউ উপলব্ধ আছে কিনা তা পরীক্ষা করতে, StreetViewPanorama.OnStreetViewPanoramaChangeListener এর সাথে একত্রে OnStreetViewPanomaraReady কলব্যাকটি প্রয়োগ করুন।
  • যদি নির্বাচিত কোনো এলাকায় স্ট্রিট ভিউ উপলব্ধ না থাকে, তাহলে ম্যাপের নির্দিষ্ট অংশে ফিরে যান এবং একটি ত্রুটি দেখান।

৯. সারসংক্ষেপ

  • ম্যাপস এপিআই ব্যবহার করার জন্য গুগল এপিআই কনসোল থেকে একটি এপিআই কী প্রয়োজন।
  • অ্যান্ড্রয়েড স্টুডিওতে, গুগল ম্যাপস অ্যাক্টিভিটি টেমপ্লেট ব্যবহার করলে অ্যাপের লেআউটে একটিমাত্র SupportMapFragment সহ একটি Activity তৈরি হয়। এই টেমপ্লেটটি অ্যাপ ম্যানিফেস্টে ACCESS_FINE_PERMISSION যোগ করে, আপনার অ্যাক্টিভিটিতে OnMapReadyCallback ইমপ্লিমেন্ট করে এবং প্রয়োজনীয় onMapReady() মেথডটি ওভাররাইড করে।

রানটাইমে একটি GoogleMap ম্যাপ টাইপ পরিবর্তন করতে, GoogleMap.setMapType() মেথডটি ব্যবহার করুন। একটি গুগল ম্যাপ নিম্নলিখিত ম্যাপ টাইপগুলোর মধ্যে যেকোনো একটি হতে পারে:

  • সাধারণ : একটি সাধারণ সড়ক মানচিত্র। এতে রাস্তা, মানুষের তৈরি কিছু স্থাপনা এবং নদীর মতো গুরুত্বপূর্ণ প্রাকৃতিক বৈশিষ্ট্য দেখানো হয়। রাস্তা ও স্থাপনার নামগুলোও দেখা যায়।
  • হাইব্রিড : স্যাটেলাইট থেকে তোলা তথ্যের সাথে রাস্তার মানচিত্র যুক্ত করা হয়েছে। রাস্তা এবং অন্যান্য বৈশিষ্ট্যের নামও দেখা যায়।
  • স্যাটেলাইট : আলোকচিত্রের তথ্য। রাস্তা ও বৈশিষ্ট্যের লেবেল দেখা যাচ্ছে না।
  • ভূখণ্ড : ভূসংস্থানিক তথ্য। মানচিত্রটিতে রঙ, সমোচ্চ রেখা ও লেবেল এবং পরিপ্রেক্ষিত ছায়া অন্তর্ভুক্ত রয়েছে। কিছু রাস্তা ও লেবেলও দৃশ্যমান।
  • কোনোটিই নয় : কোনো মানচিত্র নেই।

গুগল ম্যাপস সম্পর্কে:

  • চিহ্নিতকারী হলো কোনো নির্দিষ্ট ভৌগোলিক অবস্থানের নির্দেশক।
  • মার্কারটিতে ট্যাপ করা হলে, এর ডিফল্ট আচরণ হলো অবস্থান সম্পর্কিত তথ্যসহ একটি ইনফো উইন্ডো প্রদর্শন করা।
  • ডিফল্টরূপে, মূল মানচিত্রে আগ্রহের স্থানগুলো (পিওআই) তাদের সংশ্লিষ্ট আইকনসহ প্রদর্শিত হয়। পিওআই-এর মধ্যে পার্ক, স্কুল, সরকারি ভবন এবং আরও অনেক কিছু অন্তর্ভুক্ত।
  • এছাড়াও, ম্যাপের ধরন ' normal হলে ব্যবসায়িক গুরুত্বপূর্ণ স্থানগুলো (দোকান, রেস্তোরাঁ, হোটেল এবং আরও অনেক কিছু) ম্যাপে ডিফল্টভাবে দেখা যায়।
  • আপনি OnPoiClickListener ব্যবহার করে POI-এর ক্লিকগুলো ক্যাপচার করতে পারেন।
  • স্টাইলিং উইজার্ড ব্যবহার করে আপনি একটি গুগল ম্যাপের প্রায় সমস্ত উপাদানের বাহ্যিক রূপ পরিবর্তন করতে পারেন। স্টাইলিং উইজার্ড একটি JSON ফাইল তৈরি করে, যা আপনি setMapStyle() মেথড ব্যবহার করে গুগল ম্যাপে পাঠান।
  • আপনি ডিফল্ট রঙ পরিবর্তন করে, অথবা ডিফল্ট মার্কার আইকনটিকে একটি কাস্টম ছবি দিয়ে প্রতিস্থাপন করে আপনার মার্কারগুলো কাস্টমাইজ করতে পারেন।

অন্যান্য গুরুত্বপূর্ণ তথ্য:

  • কোনো ছবিকে একটি ভৌগোলিক অবস্থানে স্থির করতে গ্রাউন্ড ওভারলে ব্যবহার করুন।
  • ইমেজ, ইমেজের আকার (মিটারে) এবং ইমেজের অবস্থান নির্দিষ্ট করতে একটি GroundOverlayOptions অবজেক্ট ব্যবহার করুন। ম্যাপে ওভারলে সেট করতে এই অবজেক্টটি GoogleMap.addGroundOverlay() মেথডে পাস করুন।
  • আপনার অ্যাপে ACCESS_FINE_LOCATION পারমিশন থাকলে, আপনি mMap.setMyLocationEnabled(true) মেথডটি ব্যবহার করে লোকেশন ট্র্যাকিং চালু করতে পারেন।
  • গুগল স্ট্রিট ভিউ তার পরিষেবা এলাকার নির্দিষ্ট রাস্তাগুলো থেকে ৩৬০-ডিগ্রি প্যানোরামিক দৃশ্য প্রদান করে।
  • নতুন স্ট্রিট ভিউ ফ্র্যাগমেন্ট তৈরি করতে StreetViewPanoramaFragment.newInstance() মেথডটি ব্যবহার করুন।
  • ভিউয়ের অপশনগুলো নির্দিষ্ট করতে, একটি StreetViewPanoramaOptions অবজেক্ট ব্যবহার করুন। অবজেক্টটি newInstance() মেথডে পাস করুন।

১০. আরও জানুন

সম্পর্কিত ধারণাটির ডকুমেন্টেশন ৯.১: গুগল ম্যাপস এপিআই (Google Maps API) -তে রয়েছে।

অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন:

রেফারেন্স ডকুমেন্টেশন:

১১. বাড়ির কাজ

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

  • প্রয়োজন হলে বাড়ির কাজ দিন।
  • বাড়ির কাজ কীভাবে জমা দিতে হবে, তা শিক্ষার্থীদের জানিয়ে দিন।
  • বাড়ির কাজগুলো মূল্যায়ন করুন।

শিক্ষকেরা তাঁদের ইচ্ছামত এই পরামর্শগুলো ব্যবহার করতে পারেন এবং তাঁদের উপযুক্ত মনে হলে অন্য যেকোনো বাড়ির কাজও দিতে পারেন।

আপনি যদি নিজে নিজে এই কোডল্যাবটি সমাধান করেন, তবে আপনার জ্ঞান যাচাই করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলো নির্দ্বিধায় ব্যবহার করতে পারেন।

একটি অ্যাপ তৈরি করুন এবং চালান

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

ইঙ্গিত: onMapReady (GoogleMap googleMap) ডকুমেন্টেশনটি দেখুন।

এই প্রশ্নের উত্তর দাও

প্রশ্ন ১

অ্যাপে ম্যাপ লোড হয়ে ব্যবহারের জন্য প্রস্তুত হলে কোন মেথডটি কল করা হয়?

প্রশ্ন ২

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

  • MapView এবং MapFragment
  • MapFragment এবং MapActivity
  • MapView এবং MapActivity
  • শুধুমাত্র MapFragment

প্রশ্ন ৩

গুগল ম্যাপস অ্যান্ড্রয়েড এপিআই কী কী ধরনের মানচিত্র প্রদান করে?

  • সাধারণ, হাইব্রিড, ভূখণ্ড, স্যাটেলাইট এবং রোডম্যাপ
  • সাধারণ, হাইব্রিড, ভূখণ্ড, স্যাটেলাইট, এবং 'কোনোটিই নয়'
  • হাইব্রিড, ভূখণ্ড, স্যাটেলাইট, রোডম্যাপ, এবং "কোনোটিই নয়"
  • সাধারণ, ভূখণ্ড, স্যাটেলাইট, ইমেজম্যাপ, এবং 'কোনোটিই নয়'

প্রশ্ন ৪

কোনো আগ্রহের স্থানে (POI) অন-ক্লিক কার্যকারিতা যোগ করার জন্য আপনি কোন ইন্টারফেস প্রয়োগ করেন?

  • GoogleMap.OnPoiListener
  • GoogleMap.OnPoiClickListener
  • GoogleMap.OnPoiClick
  • GoogleMap.OnPoiClicked

মূল্যায়নের জন্য আপনার অ্যাপটি জমা দিন।

মূল্যায়নকারীদের জন্য নির্দেশিকা

অ্যাপটিতে নিম্নলিখিত বৈশিষ্ট্যগুলো আছে কিনা তা যাচাই করুন:

  • অ্যাপটি চালু করলে গুগল ম্যাপটি সঠিকভাবে প্রদর্শিত হয়, যা নির্দেশ করে যে এপিআই কী (API key) যথাযথভাবে তৈরি হয়েছে।
  • গুগল ম্যাপ লোড হওয়ার পর, ক্যামেরাটি শিক্ষার্থীর বাড়ি বা স্কুলের অবস্থানে চলে যায়। কোডে, এই ধাপটি onMapReady (GoogleMap googleMap) কলব্যাক মেথডের মধ্যে সম্পন্ন হওয়া উচিত।
  • শিক্ষার্থীর শিক্ষাপ্রতিষ্ঠানে এবং তার বাড়ির মতো অন্য কোনো স্থানে চিহ্নিতকারী স্থাপন করা হয়।
  • মার্কার দুটি কাস্টমাইজ করা হয়েছে। উদাহরণস্বরূপ, মার্কারগুলোতে ডিফল্ট লাল রঙ ছাড়া অন্য কোনো রঙ ব্যবহার করা হয়েছে, অথবা একটি কাস্টম আইকন ব্যবহার করা হয়েছে।

১২. পরবর্তী কোডল্যাব

অ্যাডভান্সড অ্যান্ড্রয়েড ডেভেলপমেন্ট প্রশিক্ষণ কোর্সের সমস্ত কোডল্যাব দেখতে, অ্যাডভান্সড অ্যান্ড্রয়েড ডেভেলপমেন্ট কোডল্যাবস ল্যান্ডিং পেজে যান।