Android এর জন্য নেভিগেশন SDK ব্যবহার করে আপনার অ্যাপের মধ্যে একাধিক গন্তব্যে যাওয়ার জন্য একটি রুট প্লট করতে এই নির্দেশিকা অনুসরণ করুন, যাকে ওয়েপয়েন্টও বলা হয়।
আপনার অ্যাপে একটি SupportNavigationFragment বা NavigationView যোগ করুন। এই UI উপাদানটি আপনার কার্যকলাপে ইন্টারেক্টিভ মানচিত্র এবং পালাক্রমে নেভিগেশন UI যোগ করে।
আপনার অ্যাপ পরীক্ষা, ডিবাগিং এবং প্রদর্শনের জন্য রুট বরাবর গাড়ির অগ্রগতি অনুকরণ করতে getSimulator() ব্যবহার করুন।
আপনার অ্যাপ তৈরি করুন এবং চালান।
কোড দেখুন
নেভিগেশন কার্যকলাপের জন্য জাভা কোড দেখান/লুকান।
packagecom.example.navsdkmultidestination;importandroid.content.pm.PackageManager;importandroid.location.Location;importandroid.os.Bundle;importandroid.util.Log;importandroid.widget.Toast;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.app.ActivityCompat;importandroidx.core.content.ContextCompat;importcom.google.android.gms.maps.GoogleMap.CameraPerspective;importcom.google.android.libraries.navigation.ArrivalEvent;importcom.google.android.libraries.navigation.ListenableResultFuture;importcom.google.android.libraries.navigation.NavigationApi;importcom.google.android.libraries.navigation.Navigator;importcom.google.android.libraries.navigation.RoadSnappedLocationProvider;importcom.google.android.libraries.navigation.SimulationOptions;importcom.google.android.libraries.navigation.SupportNavigationFragment;importcom.google.android.libraries.navigation.TimeAndDistance;importcom.google.android.libraries.navigation.Waypoint;importjava.util.ArrayList;importjava.util.List;/***AnactivitythatdisplaysamapandanavigationUI,guidingtheuserfromtheircurrentlocation*tomultipledestinations,alsoknownaswaypoints.*/publicclassNavigationActivityMultiDestinationextendsAppCompatActivity{privatestaticfinalStringTAG=NavigationActivityMultiDestination.class.getSimpleName();privatestaticfinalStringDISPLAY_BOTH="both";privatestaticfinalStringDISPLAY_TOAST="toast";privatestaticfinalStringDISPLAY_LOG="log";privateNavigatormNavigator;privateRoadSnappedLocationProvidermRoadSnappedLocationProvider;privateSupportNavigationFragmentmNavFragment;privatefinalList<Waypoint>mWaypoints=newArrayList<>();privateNavigator.ArrivalListenermArrivalListener;privateNavigator.RouteChangedListenermRouteChangedListener;privateNavigator.RemainingTimeOrDistanceChangedListenermRemainingTimeOrDistanceChangedListener;privateRoadSnappedLocationProvider.LocationListenermLocationListener;privateBundlemSavedInstanceState;privatestaticfinalStringKEY_JOURNEY_IN_PROGRESS="journey_in_progress";privatebooleanmJourneyInProgress=false;//Setfieldsforrequestinglocationpermission.privatestaticfinalintPERMISSIONS_REQUEST_ACCESS_FINE_LOCATION=1;privatebooleanmLocationPermissionGranted;/***Setsupthenavigatorwhentheactivityiscreated.**@paramsavedInstanceStateTheactivitystatebundle.*/@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//Savethenavigatorstate,usedtodeterminewhetherajourneyisinprogress.mSavedInstanceState=savedInstanceState;if(mSavedInstanceState!=null && mSavedInstanceState.containsKey(KEY_JOURNEY_IN_PROGRESS)){mJourneyInProgress=(mSavedInstanceState.getInt(KEY_JOURNEY_IN_PROGRESS)!=0);}setContentView(R.layout.activity_main);//InitializetheNavigationSDK.initializeNavigationSdk();}/**Releasesnavigationlistenerswhentheactivityisdestroyed.*/@OverrideprotectedvoidonDestroy(){super.onDestroy();if((mJourneyInProgress) && (this.isFinishing())){mNavigator.removeArrivalListener(mArrivalListener);mNavigator.removeRouteChangedListener(mRouteChangedListener);mNavigator.removeRemainingTimeOrDistanceChangedListener(mRemainingTimeOrDistanceChangedListener);if(mRoadSnappedLocationProvider!=null){mRoadSnappedLocationProvider.removeLocationListener(mLocationListener);}displayMessage("OnDestroy: Released navigation listeners.",DISPLAY_LOG);}}/**Savesthestateoftheappwhentheactivityispaused.*/@OverrideprotectedvoidonSaveInstanceState(BundleoutState){super.onSaveInstanceState(outState);if(mJourneyInProgress){outState.putInt(KEY_JOURNEY_IN_PROGRESS,1);}else{outState.putInt(KEY_JOURNEY_IN_PROGRESS,0);}}/***StartstheNavigationSDKandsetsthecameratofollowthedevice's location. Calls the*navigateToPlaces()methodwhenthenavigatorisready.*/privatevoidinitializeNavigationSdk(){/**Requestlocationpermission,sothatwecangetthelocationofthe*device.Theresultofthepermissionrequestishandledbyacallback,*onRequestPermissionsResult.*/if(ContextCompat.checkSelfPermission(this.getApplicationContext(),android.Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED){mLocationPermissionGranted=true;}else{ActivityCompat.requestPermissions(this,newString[]{android.Manifest.permission.ACCESS_FINE_LOCATION},PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);}if(!mLocationPermissionGranted){displayMessage("Error loading Navigation SDK: "+"The user has not granted location permission.",DISPLAY_BOTH);return;}//Getanavigator.NavigationApi.getNavigator(this,newNavigationApi.NavigatorListener(){/**SetsupthenavigationUIwhenthenavigatorisreadyforuse.*/@OverridepublicvoidonNavigatorReady(Navigatornavigator){displayMessage("Navigator ready.",DISPLAY_BOTH);mNavigator=navigator;mNavFragment=(SupportNavigationFragment)getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);//Setthecameratofollowthedevicelocationwith'TILTED'drivingview.mNavFragment.getMapAsync(googleMap-> googleMap.followMyLocation(CameraPerspective.TILTED));//Navigatetothespecifiedplaces.navigateToPlaces();}/***HandleserrorsfromtheNavigationSDK.**@paramerrorCodeTheerrorcodereturnedbythenavigator.*/@OverridepublicvoidonError(@NavigationApi.ErrorCodeinterrorCode){switch(errorCode){caseNavigationApi.ErrorCode.NOT_AUTHORIZED:displayMessage("Error loading Navigation SDK: Your API key is "+"invalid or not authorized to use the Navigation SDK.",DISPLAY_BOTH);break;caseNavigationApi.ErrorCode.TERMS_NOT_ACCEPTED:displayMessage("Error loading Navigation SDK: User did not accept "+"the Navigation Terms of Use.",DISPLAY_BOTH);break;caseNavigationApi.ErrorCode.NETWORK_ERROR:displayMessage("Error loading Navigation SDK: Network error.",DISPLAY_BOTH);break;caseNavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING:displayMessage("Error loading Navigation SDK: Location permission "+"is missing.",DISPLAY_BOTH);break;default:displayMessage("Error loading Navigation SDK: "+errorCode,DISPLAY_BOTH);}}});}/**Requestsdirectionsfromtheuser's current location to a list of waypoints. */privatevoidnavigateToPlaces(){//Setupawaypointforeachplacethatwewanttogoto.createWaypoint("ChIJq6qq6jauEmsRJAf7FjrKnXI","Sydney Star");createWaypoint("ChIJ3S-JXmauEmsRUcIaWtf4MzE","Sydney Opera House");createWaypoint("ChIJLwgLFGmuEmsRzpDhHQuyyoU","Sydney Conservatorium of Music");//Ifthisjourneyisalreadyinprogress,noneedtorestartnavigation.//Thiscanhappenwhentheuserrotatesthedevice,orsendstheapptothebackground.if(mSavedInstanceState!=null
&& mSavedInstanceState.containsKey(KEY_JOURNEY_IN_PROGRESS)
&& mSavedInstanceState.getInt(KEY_JOURNEY_IN_PROGRESS)==1){return;}//Createafuturetoawaittheresultoftheasynchronousnavigatortask.ListenableResultFuture<Navigator.RouteStatus> pendingRoute=mNavigator.setDestinations(mWaypoints);//DefinetheactiontoperformwhentheSDKhasdeterminedtheroute.pendingRoute.setOnResultListener(newListenableResultFuture.OnResultListener<Navigator.RouteStatus>(){@OverridepublicvoidonResult(Navigator.RouteStatuscode){switch(code){caseOK:mJourneyInProgress=true;//HidethetoolbartomaximizethenavigationUI.if(getActionBar()!=null){getActionBar().hide();}//Registersomelistenersfornavigationevents.registerNavigationListeners();//Displaythetimeanddistancetoeachwaypoint.displayTimesAndDistances();//Enablevoiceaudioguidance(throughthedevicespeaker).mNavigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE);//Simulatevehicleprogressalongtheroutefordemo/debugbuilds.if(BuildConfig.DEBUG){mNavigator.getSimulator().simulateLocationsAlongExistingRoute(newSimulationOptions().speedMultiplier(5));}//Startturn-by-turnguidancealongthecurrentroute.mNavigator.startGuidance();break;//Handleerrorconditionsreturnedbythenavigator.caseNO_ROUTE_FOUND:displayMessage("Error starting navigation: No route found.",DISPLAY_BOTH);break;caseNETWORK_ERROR:displayMessage("Error starting navigation: Network error.",DISPLAY_BOTH);break;caseROUTE_CANCELED:displayMessage("Error starting navigation: Route canceled.",DISPLAY_BOTH);break;default:displayMessage("Error starting navigation: "+String.valueOf(code),DISPLAY_BOTH);}}});}/***CreatesawaypointfromagivenplaceIDandtitle.**@paramplaceIdTheIDoftheplacetobeconvertedtoawaypoint.*@paramtitleAdescriptivetitleforthewaypoint.*/privatevoidcreateWaypoint(StringplaceId,Stringtitle){try{mWaypoints.add(Waypoint.builder().setPlaceIdString(placeId).setTitle(title).build());}catch(Waypoint.UnsupportedPlaceIdExceptione){displayMessage("Error starting navigation: Place ID is not supported: "+placeId,DISPLAY_BOTH);}}/**Displaysthecalculatedtraveltimeanddistancetoeachwaypoint.*/privatevoiddisplayTimesAndDistances(){List<TimeAndDistance>timesAndDistances=mNavigator.getTimeAndDistanceList();intleg=1;Stringmessage="You're on your way!";for(TimeAndDistancetimeAndDistance:timesAndDistances){message=message+"\nRoute leg: "+leg+++": Travel time (seconds): "+timeAndDistance.getSeconds()+". Distance (meters): "+timeAndDistance.getMeters();}displayMessage(message,DISPLAY_BOTH);}/***Registerssomeeventlistenerstoshowamessageandtakeothernecessarystepswhenspecific*navigationeventsoccur.*/privatevoidregisterNavigationListeners(){mArrivalListener=newNavigator.ArrivalListener(){@OverridepublicvoidonArrival(ArrivalEventarrivalEvent){displayMessage("onArrival: You've arrived at a waypoint: "+mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),DISPLAY_BOTH);//Startturn-by-turnguidanceforthenextlegoftheroute.if(arrivalEvent.isFinalDestination()){displayMessage("onArrival: You've arrived at the final destination.",DISPLAY_BOTH);}else{mNavigator.continueToNextDestination();mNavigator.startGuidance();}}};//Listensforarrivalatawaypoint.mNavigator.addArrivalListener(mArrivalListener);mRouteChangedListener=newNavigator.RouteChangedListener(){@OverridepublicvoidonRouteChanged(){displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "+mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),DISPLAY_LOG);}};//Listensforchangesintheroute.mNavigator.addRouteChangedListener(mRouteChangedListener);//Listensforroad-snappedlocationupdates.mRoadSnappedLocationProvider=NavigationApi.getRoadSnappedLocationProvider(getApplication());mLocationListener=newRoadSnappedLocationProvider.LocationListener(){@OverridepublicvoidonLocationChanged(Locationlocation){displayMessage("onLocationUpdated: Navigation engine has provided a new"+" road-snapped location: "+location.toString(),DISPLAY_LOG);}@OverridepublicvoidonRawLocationUpdate(Locationlocation){displayMessage("onLocationUpdated: Navigation engine has provided a new"+" raw location: "+location.toString(),DISPLAY_LOG);}};if(mRoadSnappedLocationProvider!=null){mRoadSnappedLocationProvider.addLocationListener(mLocationListener);}else{displayMessage("ERROR: Failed to get a location provider",DISPLAY_LOG);}mRemainingTimeOrDistanceChangedListener=newNavigator.RemainingTimeOrDistanceChangedListener(){@OverridepublicvoidonRemainingTimeOrDistanceChanged(){displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"+" has changed.",DISPLAY_LOG);}};//Listensforchangesintimeordistance.mNavigator.addRemainingTimeOrDistanceChangedListener(60,100,mRemainingTimeOrDistanceChangedListener);}/**Handlestheresultoftherequestforlocationpermissions.*/@OverridepublicvoidonRequestPermissionsResult(intrequestCode,@NonNullString[]permissions,@NonNullint[]grantResults){mLocationPermissionGranted=false;switch(requestCode){casePERMISSIONS_REQUEST_ACCESS_FINE_LOCATION:{//Ifrequestiscanceled,theresultarraysareempty.if(grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){mLocationPermissionGranted=true;}}}}/***Showsamessageonscreenandinthelog.Usedwhensomethinggoeswrong.**@paramerrorMessageThemessagetodisplay.*/privatevoiddisplayMessage(StringerrorMessage,StringdisplayMedium){if(displayMedium.equals(DISPLAY_BOTH)||displayMedium.equals(DISPLAY_TOAST)){Toast.makeText(this,errorMessage,Toast.LENGTH_LONG).show();}if(displayMedium.equals(DISPLAY_BOTH)||displayMedium.equals(DISPLAY_LOG)){Log.d(TAG,errorMessage);}}}
একটি নেভিগেশন খণ্ড যোগ করুন
SupportNavigationFragment হল UI উপাদান যা নেভিগেশনের ভিজ্যুয়াল আউটপুট প্রদর্শন করে, যার মধ্যে একটি ইন্টারেক্টিভ মানচিত্র এবং টার্ন-বাই-টার্ন দিকনির্দেশ রয়েছে। আপনি নীচে দেখানো হিসাবে আপনার XML লেআউট ফাইলে খণ্ডটি ঘোষণা করতে পারেন:
ডিভাইসের অবস্থান নির্ধারণ করার জন্য আপনার অ্যাপটিকে অবশ্যই অবস্থানের অনুমতির অনুরোধ করতে হবে।
এই টিউটোরিয়ালটি আপনাকে সূক্ষ্ম অবস্থানের অনুমতির অনুরোধ করার জন্য প্রয়োজনীয় কোড প্রদান করে। আরও বিশদ বিবরণের জন্য, Android অনুমতিগুলির নির্দেশিকা দেখুন।
আপনার Android ম্যানিফেস্টে <manifest> উপাদানের সন্তান হিসেবে অনুমতি যোগ করুন:
আপনার অ্যাপে রানটাইম অনুমতির জন্য অনুরোধ করুন, ব্যবহারকারীকে লোকেশনের অনুমতি দেওয়ার বা অস্বীকার করার সুযোগ দেয়। নিম্নলিখিত কোড ব্যবহারকারী সূক্ষ্ম অবস্থানের অনুমতি প্রদান করেছে কিনা তা পরীক্ষা করে। যদি না হয়, এটি অনুমতির অনুরোধ করে:
if(ContextCompat.checkSelfPermission(this.getApplicationContext(),android.Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED){mLocationPermissionGranted=true;}else{ActivityCompat.requestPermissions(this,newString[]{android.Manifest.permission.ACCESS_FINE_LOCATION},PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);}if(!mLocationPermissionGranted){displayMessage("Error loading Navigation SDK: "+"The user has not granted location permission.",DISPLAY_BOTH);return;}
অনুমতি অনুরোধের ফলাফল পরিচালনা করতে onRequestPermissionsResult() কলব্যাক ওভাররাইড করুন:
নেভিগেশন SDK শুরু করুন এবং একটি যাত্রা কনফিগার করুন
NavigationApi ক্লাস ইনিশিয়ালাইজেশন লজিক প্রদান করে যা আপনার অ্যাপকে Google নেভিগেশন ব্যবহার করার অনুমোদন দেয়। Navigator ক্লাস একটি নেভিগেশন যাত্রা কনফিগার এবং শুরু/বন্ধ করার উপর নিয়ন্ত্রণ প্রদান করে।
স্ক্রিনে এবং লগে একটি বার্তা দেখানোর জন্য একটি সহায়ক পদ্ধতি তৈরি করুন।
নেভিগেশন SDK শুরু করুন এবং নেভিগেটর প্রস্তুত হলে নেভিগেশন শুরু করতে onNavigatorReady() কলব্যাক ওভাররাইড করুন:
NavigationApi.getNavigator(this,newNavigationApi.NavigatorListener(){/***SetsupthenavigationUIwhenthenavigatorisreadyforuse.*/@OverridepublicvoidonNavigatorReady(Navigatornavigator){displayMessage("Navigator ready.",DISPLAY_BOTH);mNavigator=navigator;mNavFragment=(SupportNavigationFragment)getFragmentManager().findFragmentById(R.id.navigation_fragment);//Setthecameratofollowthedevicelocationwith'TILTED'drivingview.mNavFragment.getCamera().followMyLocation(Camera.Perspective.TILTED);//Navigatetothespecifiedplaces.navigateToPlaces();}/***HandleserrorsfromtheNavigationSDK.*@paramerrorCodeTheerrorcodereturnedbythenavigator.*/@OverridepublicvoidonError(@NavigationApi.ErrorCodeinterrorCode){switch(errorCode){caseNavigationApi.ErrorCode.NOT_AUTHORIZED:displayMessage("Error loading Navigation SDK: Your API key is "+"invalid or not authorized to use the Navigation SDK.",DISPLAY_BOTH);break;caseNavigationApi.ErrorCode.TERMS_NOT_ACCEPTED:displayMessage("Error loading Navigation SDK: User did not accept "+"the Navigation Terms of Use.",DISPLAY_BOTH);break;caseNavigationApi.ErrorCode.NETWORK_ERROR:displayMessage("Error loading Navigation SDK: Network error.",DISPLAY_BOTH);break;caseNavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING:displayMessage("Error loading Navigation SDK: Location permission "+"is missing.",DISPLAY_BOTH);break;default:displayMessage("Error loading Navigation SDK: "+errorCode,DISPLAY_BOTH);}}});
একটি প্রদত্ত স্থান আইডি এবং শিরোনাম থেকে একটি Waypoint অবজেক্ট তৈরি করার জন্য একটি পদ্ধতি যোগ করুন।
প্রতিটি ওয়েপয়েন্টে গণনা করা ভ্রমণের সময় এবং দূরত্ব প্রদর্শন করার জন্য একটি পদ্ধতি যোগ করুন।
privatevoiddisplayTimesAndDistances(){List<TimeAndDistance>timesAndDistances=mNavigator.getTimeAndDistanceList();intleg=1;Stringmessage="You'reonyourway!";for(TimeAndDistancetimeAndDistance:timesAndDistances){message=message+"\nRoute leg: "+leg+++": Travel time (seconds): "+timeAndDistance.getSeconds()+". Distance (meters): "+timeAndDistance.getMeters();}displayMessage(message,DISPLAY_BOTH);}
এই যাত্রার জন্য সমস্ত পথপয়েন্ট সেট করুন। (মনে রাখবেন যে আপনি যদি এমন জায়গার আইডি ব্যবহার করেন যার জন্য ন্যাভিগেটর একটি রুট প্লট করতে পারে না তবে আপনি একটি ত্রুটি পেতে পারেন। এই টিউটোরিয়ালের নমুনা অ্যাপটি অস্ট্রেলিয়ার ওয়েপয়েন্টের জন্য প্লেস আইডি ব্যবহার করে। বিভিন্ন স্থানের আইডি পাওয়ার বিষয়ে নীচের নোটগুলি দেখুন।) নির্দেশাবলী গণনা করার পরে , SupportNavigationFragment প্রতিটি ওয়েপয়েন্টে একটি মার্কার সহ মানচিত্রের রুট প্রতিনিধিত্বকারী একটি পলিলাইন প্রদর্শন করে।
privatevoidnavigateToPlaces(){//Setupawaypointforeachplacethatwewanttogoto.createWaypoint("ChIJq6qq6jauEmsRJAf7FjrKnXI","Sydney Star");createWaypoint("ChIJ3S-JXmauEmsRUcIaWtf4MzE","Sydney Opera House");createWaypoint("ChIJLwgLFGmuEmsRzpDhHQuyyoU","Sydney Conservatorium of Music");//Ifthisjourneyisalreadyinprogress,noneedtorestartnavigation.//Thiscanhappenwhentheuserrotatesthedevice,orsendstheapptothebackground.if(mSavedInstanceState!=null && mSavedInstanceState.containsKey(KEY_JOURNEY_IN_PROGRESS) && mSavedInstanceState.getInt(KEY_JOURNEY_IN_PROGRESS)==1){return;}//Createafuturetoawaittheresultoftheasynchronousnavigatortask.ListenableResultFuture<Navigator.RouteStatus>pendingRoute=mNavigator.setDestinations(mWaypoints);//DefinetheactiontoperformwhentheSDKhasdeterminedtheroute.pendingRoute.setOnResultListener(newListenableResultFuture.OnResultListener<Navigator.RouteStatus>(){@OverridepublicvoidonResult(Navigator.RouteStatuscode){switch(code){caseOK:mJourneyInProgress=true;//HidethetoolbartomaximizethenavigationUI.if(getActionBar()!=null){getActionBar().hide();}//Registersomelistenersfornavigationevents.registerNavigationListeners();//Displaythetimeanddistancetoeachwaypoint.displayTimesAndDistances();//Enablevoiceaudioguidance(throughthedevicespeaker).mNavigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE);//Simulatevehicleprogressalongtheroutefordemo/debugbuilds.if(BuildConfig.DEBUG){mNavigator.getSimulator().simulateLocationsAlongExistingRoute(newSimulationOptions().speedMultiplier(5));}//Startturn-by-turnguidancealongthecurrentroute.mNavigator.startGuidance();break;//Handleerrorconditionsreturnedbythenavigator.caseNO_ROUTE_FOUND:displayMessage("Error starting navigation: No route found.",DISPLAY_BOTH);break;caseNETWORK_ERROR:displayMessage("Error starting navigation: Network error.",DISPLAY_BOTH);break;caseROUTE_CANCELED:displayMessage("Error starting navigation: Route canceled.",DISPLAY_BOTH);break;default:displayMessage("Error starting navigation: "+String.valueOf(code),DISPLAY_BOTH);}}});}
আপনার অ্যাপ তৈরি করুন এবং চালান
আপনার কম্পিউটারে একটি অ্যান্ড্রয়েড ডিভাইস সংযুক্ত করুন। আপনার Android ডিভাইসে বিকাশকারী বিকল্পগুলি সক্ষম করতে নির্দেশাবলী অনুসরণ করুন এবং ডিভাইসটি সনাক্ত করতে আপনার সিস্টেম কনফিগার করুন৷ (বিকল্পভাবে, আপনি একটি ভার্চুয়াল ডিভাইস কনফিগার করতে অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস (AVD) ম্যানেজার ব্যবহার করতে পারেন। একটি এমুলেটর নির্বাচন করার সময়, নিশ্চিত করুন যে আপনি Google API গুলি অন্তর্ভুক্ত করে এমন একটি ছবি বেছে নিয়েছেন।)
অ্যান্ড্রয়েড স্টুডিওতে, রান মেনু বিকল্পে ক্লিক করুন (বা প্লে বোতাম আইকন)। অনুরোধ হিসাবে একটি ডিভাইস চয়ন করুন.
উন্নত ব্যবহারকারীর অভিজ্ঞতার জন্য ইঙ্গিত
নেভিগেশন উপলব্ধ হওয়ার আগে ব্যবহারকারীকে অবশ্যই Google নেভিগেশন পরিষেবার শর্তাবলী মেনে নিতে হবে৷ এই স্বীকৃতি শুধুমাত্র একবার প্রয়োজন. ডিফল্টরূপে, ন্যাভিগেটরকে প্রথমবার আহ্বান করার সময় SDK গ্রহণের জন্য অনুরোধ করে। আপনি যদি পছন্দ করেন, আপনি showTermsAndConditionsDialog() ব্যবহার করে আপনার অ্যাপের UX প্রবাহের প্রথম দিকে, যেমন সাইনআপ বা লগইন করার সময় নেভিগেশন শর্তাবলী ডায়ালগ ট্রিগার করতে পারেন।
ন্যাভিগেশন গুণমান এবং ETA নির্ভুলতা উল্লেখযোগ্যভাবে উন্নত হয় যদি আপনি একটি অক্ষাংশ/দ্রাঘিমাংশের গন্তব্যের পরিবর্তে একটি ওয়েপয়েন্ট শুরু করতে স্থান আইডি ব্যবহার করেন।
এই নমুনাটি নির্দিষ্ট স্থানের আইডি থেকে ওয়েপয়েন্ট প্রাপ্ত করে। একটি স্থান আইডি পাওয়ার অন্যান্য উপায়গুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
একটি প্রদত্ত ঠিকানার জন্য স্থান আইডি খুঁজে পেতে জিওকোডিং API ব্যবহার করুন৷ আপনার কাছে ওয়েপয়েন্টের জন্য সম্পূর্ণ, দ্ব্যর্থহীন ঠিকানা থাকলে জিওকোডিং API ভাল কাজ করে। জিওকোডিং সেরা অনুশীলন নির্দেশিকা দেখুন।