این راهنما را دنبال کنید تا با استفاده از Navigation SDK برای Android مسیری را در برنامه خود ترسیم کنید. این راهنما فرض میکند که شما قبلاً Navigation SDK را در برنامه خود ادغام کردهاید، همانطور که در راهاندازی پروژه توضیح داده شده است.
خلاصه
- یک عنصر UI به برنامه خود اضافه کنید، چه به عنوان یک قطعه پیمایش یا به عنوان نمای ناوبری. این عنصر رابط کاربری، رابط کاربری نقشه تعاملی و ناوبری گام به گام را به فعالیت شما اضافه می کند.
- درخواست مجوزهای مکان برای تعیین مکان دستگاه، برنامه شما باید مجوز مکان را درخواست کند.
- SDK را با استفاده از کلاس
NavigationApi
راه اندازی کنید. با استفاده از کلاس
Navigator
یک مقصد تنظیم کنید و ناوبری گام به گام را کنترل کنید. این شامل سه مرحله است:- با استفاده از
setDestination()
مقصد را تنظیم کنید. - ناوبری را با
startGuidance()
شروع کنید. - از
getSimulator()
برای شبیه سازی پیشرفت وسیله نقلیه در طول مسیر، برای آزمایش، اشکال زدایی و نمایش برنامه خود استفاده کنید.
- با استفاده از
اپلیکیشن خود را بسازید و اجرا کنید.
کد را ببینید
یک عنصر UI به برنامه خود اضافه کنید
این بخش دو روش را پوشش می دهد که می توانید نقشه تعاملی و رابط کاربری را برای نمایش ناوبری گام به گام اضافه کنید. در بیشتر موارد، به جای تعامل مستقیم با NavigationView
، توصیه می کنیم از SupportNavigationFragment
استفاده کنید، که پوششی برای NavigationView
است. برای اطلاعات بیشتر، بهترین شیوههای تعامل نقشه پیمایش را ببینید.
از یک قطعه ناوبری استفاده کنید
SupportNavigationFragment
جزء رابط کاربری است که خروجی بصری ناوبری، از جمله یک نقشه تعاملی و جهت های گام به گام را نمایش می دهد. همانطور که در اینجا نشان داده شده است می توانید قطعه را در فایل طرح بندی XML خود اعلام کنید:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
android:id="@+id/navigation_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
از طرف دیگر، میتوانید قطعه را به صورت برنامهنویسی، همانطور که در مستندات Android توضیح داده شده، با استفاده از FragmentActivity.getSupportFragmentManager()
بسازید.
از نمای ناوبری استفاده کنید
به عنوان جایگزینی برای یک قطعه، مؤلفه UI برای نمایش نقشه برای پیمایش نیز به عنوان NavigationView
موجود است.
درخواست مجوز مکان
این بخش نحوه درخواست مجوز مکان دقیق را نشان می دهد. برای جزئیات بیشتر، به راهنمای مجوزهای Android مراجعه کنید.
مجوز را به عنوان فرزند عنصر
<manifest>
در مانیفست Android خود اضافه کنید:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.navsdksingledestination"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>
مجوزهای زمان اجرا را در برنامه خود درخواست کنید، به کاربر این فرصت را می دهد که مجوز مکان را اعطا یا رد کند. کد زیر بررسی می کند که آیا کاربر مجوز موقعیت مکانی خوب را داده است یا خیر. اگر نه، اجازه درخواست می کند:
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); } if (!mLocationPermissionGranted) { displayMessage("Error loading Navigation SDK: " + "The user has not granted location permission."); return; }
برای رسیدگی به نتیجه درخواست مجوز، فراخوانی
onRequestPermissionsResult()
لغو کنید:@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 canceled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { mLocationPermissionGranted = true; } } } }
Navigation SDK را راه اندازی کنید
کلاس NavigationApi
منطق اولیه سازی را ارائه می دهد که به برنامه شما اجازه می دهد از ناوبری Google استفاده کند. این بخش نحوه تنظیم اولیه ناوبر را به همراه برخی تنظیمات دیگر که می توانید برای برنامه خود فعال کنید، پوشش می دهد:
Navigation SDK را راهاندازی کنید و فراخوانی
onNavigatorReady()
را لغو کنید تا وقتی ناوبر آماده است، ناوبری شروع شود.اختیاری. برنامه را طوری پیکربندی کنید که وقتی کاربر برنامه را از دستگاه خود رد می کند، اعلان های راهنمایی و خدمات پس زمینه خاموش شوند. این انتخاب به مدل کسب و کار شما بستگی دارد. ممکن است بخواهید از رفتار پیشفرض ناوبر استفاده کنید، که به نمایش راهنمای چرخش و بهروزرسانیهای موقعیت مکانی ادامه میدهد، حتی زمانی که برنامه حذف میشود. اگر در عوض بخواهید بهروزرسانیهای ناوبری و موقعیت مکانی را زمانی که کاربر نهایی برنامه را رد کرد، خاموش کنید، از این پیکربندی استفاده میکنید.
اختیاری. محدودیتهای جادهای را در کشورهای پشتیبانیشده فعال کنید. آخرین رقم پلاک را تنظیم کنید. این تماس فقط باید یک بار انجام شود: درخواستهای مسیرهای بعدی همچنان از آن استفاده میکنند. این تماس فقط در مناطق پشتیبانی شده کار می کند. به کشورهای پشتیبانی شده از Navigation SDK مراجعه کنید.
NavigationApi.getNavigator(this, new NavigationApi.NavigatorListener() { /** * Sets up the navigation UI when the navigator is ready for use. */ @Override public void onNavigatorReady(Navigator navigator) { displayMessage("Navigator ready."); mNavigator = navigator; mNavFragment = (NavigationFragment) getFragmentManager() .findFragmentById(R.id.navigation_fragment); // Optional. Disable the guidance notifications and shut down the app // and background service when the user closes the app. // mNavigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE) // Optional. Set the last digit of the car's license plate to get // route restrictions for supported countries. // mNavigator.setLicensePlateRestrictionInfo(getLastDigit(), "BZ"); // Set the camera to follow the device location with 'TILTED' driving view. mNavFragment.getCamera().followMyLocation(Camera.Perspective.TILTED); // Set the travel mode (DRIVING, WALKING, CYCLING, TWO_WHEELER, or TAXI). mRoutingOptions = new RoutingOptions(); mRoutingOptions.travelMode(RoutingOptions.TravelMode.DRIVING); // Navigate to a place, specified by Place ID. navigateToPlace(SYDNEY_OPERA_HOUSE, mRoutingOptions); } /** * Handles errors from the Navigation SDK. * @param errorCode The error code returned by the navigator. */ @Override public void onError(@NavigationApi.ErrorCode int errorCode) { switch (errorCode) { case NavigationApi.ErrorCode.NOT_AUTHORIZED: displayMessage("Error loading Navigation SDK: Your API key is " + "invalid or not authorized to use the Navigation SDK."); break; case NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED: displayMessage("Error loading Navigation SDK: User did not accept " + "the Navigation Terms of Use."); break; case NavigationApi.ErrorCode.NETWORK_ERROR: displayMessage("Error loading Navigation SDK: Network error."); break; case NavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING: displayMessage("Error loading Navigation SDK: Location permission " + "is missing."); break; default: displayMessage("Error loading Navigation SDK: " + errorCode); } } });
یک مقصد تعیین کنید
کلاس Navigator
کنترل بر پیکربندی، شروع و توقف یک سفر ناوبری را فراهم می کند.
با استفاده از Navigator
به دست آمده در بخش قبل، یک Waypoint
برای این سفر تعیین کنید. پس از محاسبه جهتها، SupportNavigationFragment
یک خط چند خطی که مسیر را بر روی نقشه نشان میدهد و یک نشانگر در مقصد نمایش میدهد.
private void navigateToPlace(String placeId, RoutingOptions travelMode) {
Waypoint destination;
try {
destination = Waypoint.builder().setPlaceIdString(placeId).build();
} catch (Waypoint.UnsupportedPlaceIdException e) {
displayMessage("Error starting navigation: Place ID is not supported.");
return;
}
// Create a future to await the result of the asynchronous navigator task.
ListenableResultFuture<Navigator.RouteStatus> pendingRoute =
mNavigator.setDestination(destination, travelMode);
// Define the action to perform when the SDK has determined the route.
pendingRoute.setOnResultListener(
new ListenableResultFuture.OnResultListener<Navigator.RouteStatus>() {
@Override
public void onResult(Navigator.RouteStatus code) {
switch (code) {
case OK:
// Hide the toolbar to maximize the navigation UI.
if (getActionBar() != null) {
getActionBar().hide();
}
// Enable voice audio guidance (through the device speaker).
mNavigator.setAudioGuidance(
Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE);
// Simulate vehicle progress along the route for demo/debug builds.
if (BuildConfig.DEBUG) {
mNavigator.getSimulator().simulateLocationsAlongExistingRoute(
new SimulationOptions().speedMultiplier(5));
}
// Start turn-by-turn guidance along the current route.
mNavigator.startGuidance();
break;
// Handle error conditions returned by the navigator.
case NO_ROUTE_FOUND:
displayMessage("Error starting navigation: No route found.");
break;
case NETWORK_ERROR:
displayMessage("Error starting navigation: Network error.");
break;
case ROUTE_CANCELED:
displayMessage("Error starting navigation: Route canceled.");
break;
default:
displayMessage("Error starting navigation: "
+ String.valueOf(code));
}
}
});
}
اپلیکیشن خود را بسازید و اجرا کنید
- یک دستگاه اندرویدی را به رایانه خود وصل کنید. دستورالعملهای Android Studio را در مورد نحوه اجرای برنامهها در یک دستگاه سختافزاری دنبال کنید یا میتوانید یک دستگاه مجازی را با استفاده از مدیر دستگاه مجازی Android (AVD) پیکربندی کنید. هنگام انتخاب یک شبیه ساز، مطمئن شوید که تصویری را انتخاب کرده اید که شامل API های Google باشد.
- در اندروید استودیو، روی گزینه منوی Run یا نماد دکمه پخش کلیک کنید. همانطور که از شما خواسته شده یک دستگاه را انتخاب کنید.
نکاتی برای بهبود تجربه کاربری
- کاربر باید قبل از اینکه ناوبری در دسترس قرار گیرد، شرایط خدمات Google Navigation را بپذیرد. این پذیرش فقط یک بار لازم است. به طور پیشفرض، SDK برای اولین باری که ناوبر فراخوانی میشود، درخواست پذیرش میکند. اگر ترجیح میدهید، میتوانید گفتگوی «شرایط خدمات ناوبری» را در یک نقطه اولیه در جریان UX برنامهتان، مانند هنگام ثبتنام یا ورود به سیستم، با استفاده از
TermsAndConditionsCheckOption
فعال کنید. - برای بهبود قابل توجه کیفیت ناوبری و دقت ETA، از شناسه مکان برای مقداردهی اولیه یک نقطه راه به جای مختصات طول و عرض جغرافیایی استفاده کنید.
- این نمونه نقطه راه مقصد را از شناسه مکان خاصی برای خانه اپرای سیدنی استخراج می کند. می توانید از شناسه مکان یاب برای دریافت شناسه مکان برای مکان های خاص دیگر استفاده کنید.