درباره این codelab
1. قبل از اینکه شروع کنی
این کد لبه به شما می آموزد که چگونه Places SDK برای اندروید را با برنامه خود ادغام کنید و از هر یک از ویژگی های Places SDK استفاده کنید.
پیش نیازها
- دانش اولیه کاتلین و توسعه اندروید
چیزی که یاد خواهید گرفت
- نحوه نصب Places SDK برای اندروید با برنامه های افزودنی Kotlin.
- نحوه بارگیری جزئیات مکان برای یک مکان خاص.
- چگونه یک ویجت تکمیل خودکار مکان را به برنامه خود اضافه کنید.
- نحوه بارگیری مکان فعلی بر اساس مکان گزارش شده فعلی دستگاه.
آنچه شما نیاز دارید
برای تکمیل این کد لبه، به حسابها، خدمات و ابزارهای زیر نیاز دارید:
- یک حساب Google با فعال بودن صورتحساب.
- Android Studio Bumblebee یا بالاتر.
- خدمات Google Play در Android Studio نصب شده است.
- یک دستگاه Android یا یک شبیهساز Android که پلتفرم Google APIs مبتنی بر Android 8 یا بالاتر را اجرا میکند (برای مراحل نصب به اجرای برنامهها در شبیهساز Android مراجعه کنید).
2. راه اندازی شود
برای مرحله فعال سازی زیر، Places API را فعال کنید.
پلتفرم نقشه های گوگل را راه اندازی کنید
اگر قبلاً حساب Google Cloud Platform و پروژهای با صورتحساب فعال ندارید، لطفاً راهنمای شروع به کار با Google Maps Platform را برای ایجاد یک حساب صورتحساب و یک پروژه ببینید.
- در Cloud Console ، روی منوی کشویی پروژه کلیک کنید و پروژه ای را که می خواهید برای این کد لبه استفاده کنید انتخاب کنید.
- APIها و SDKهای پلتفرم Google Maps مورد نیاز برای این لبه کد را در Google Cloud Marketplace فعال کنید. برای انجام این کار، مراحل این ویدئو یا این مستند را دنبال کنید.
- یک کلید API در صفحه Credentials در Cloud Console ایجاد کنید. می توانید مراحل این ویدئو یا این مستند را دنبال کنید. همه درخواستها به پلتفرم نقشههای Google به یک کلید API نیاز دارند.
3. شروع سریع
برای شروع هر چه سریعتر، کد شروع را دانلود کنید تا به شما کمک کند تا این نرمافزار را دنبال کنید. شما می توانید به سراغ راه حل بروید، اما اگر می خواهید تمام مراحل ساخت آن را خودتان دنبال کنید، به خواندن ادامه دهید.
- اگر
git
را نصب کرده اید، مخزن را کلون کنید.
git clone https://github.com/googlemaps/codelab-places-101-android.git
یا برای دانلود کد منبع روی این دکمه کلیک کنید.
- پس از دانلود کد، پروژه ای را که در دایرکتوری
/starter
در اندروید استودیو یافت می شود، باز کنید. این پروژه شامل ساختار فایل اصلی است که برای تکمیل کد لبه نیاز دارید. هر چیزی که برای کار با آن نیاز دارید در پوشه/starter
قرار دارد.
اگر می خواهید کد راه حل کامل را در حال اجرا ببینید، می توانید کد تکمیل شده را در پوشه /solution
مشاهده کنید.
4. Places SDK را برای اندروید نصب کنید
در این بخش، Places SDK برای اندروید را به وابستگی های برنامه خود اضافه می کنید.
کلید API خود را اضافه کنید
کلید API را که قبلاً ایجاد کردید در اختیار برنامه قرار دهید تا Places SDK برای Android بتواند کلید شما را با برنامه شما مرتبط کند.
- فایلی به نام
local.properties
را در دایرکتوری اصلی پروژه خود باز کنید (همان سطحی کهgradle.properties
وsettings.gradle
هستند). - یک کلید جدید تعریف کنید
GOOGLE_MAPS_API_KEY
، مقدار آن را روی کلید API که ایجاد کردید تنظیم کنید.
محلی.ملاک
GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE
توجه داشته باشید که local.properties در فایل local.properties
در مخزن Git فهرست شده است .gitignore
این به این دلیل است که کلید API شما اطلاعات حساسی محسوب میشود و در صورت امکان نباید در کنترل منبع بررسی شود.
- در مرحله بعد، برای اینکه کلید API خود را در معرض دید قرار دهید تا بتوان از آن در سراسر برنامه استفاده کرد، افزونه Secrets Gradle برای Android را در فایل
build.gradle
برنامه خود که در دایرکتوریapp/
قرار دارد قرار دهید و خط زیر را در بلوکplugins
اضافه کنید:
build.gradle سطح برنامه
plugins {
// ...
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
- فایل
build.gradle
در سطح پروژه خود را تغییر دهید تا مسیر کلاس زیر را شامل شود:
build.gradle در سطح پروژه
buildscript {
dependencies {
// ...
classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
}
}
این افزونه کلیدهایی را که در فایل local.properties
خود تعریف کرده اید به عنوان متغیرهای ساخت در فایل مانیفست اندروید و به عنوان متغیر در کلاس BuildConfig
تولید شده توسط Gradle در زمان ساخت در دسترس قرار می دهد. با استفاده از این افزونه، کد boilerplate که در غیر این صورت برای خواندن ویژگیها از local.properties
بود، حذف میشود تا بتوان به آن در سراسر برنامه دسترسی داشت.
Places SDK برای وابستگی Android را اضافه کنید
- اکنون که کلید API شما در داخل برنامه قابل دسترسی است، وابستگی Places SDK for Android را به فایل
build.gradle
برنامه خود اضافه کنید.
در پروژه شروع که با این کد لبه ارائه می شود، این وابستگی قبلاً برای شما اضافه شده است.
build.gradle سطح برنامه
dependencies {
// Dependency to include Places SDK for Android
implementation 'com.google.android.libraries.places:places:2.6.0'
}
- برنامه را اجرا کنید.
اکنون باید یک برنامه با صفحه خالی را ببینید. به پر کردن این صفحه با سه نسخه نمایشی ادامه دهید.
5. Places Android KTX را نصب کنید
برای برنامههای Kotlin که از یک یا چند SDK Android پلتفرم نقشههای Google استفاده میکنند، کتابخانههای برنامه افزودنی Kotlin (KTX) به شما امکان میدهند از ویژگیهای زبان Kotlin مانند برنامههای مشترک، ویژگیها/توابع برنامه افزودنی و غیره استفاده کنید. هر Google Maps SDK دارای یک کتابخانه KTX مربوطه است که در زیر نشان داده شده است:
در این کار، از کتابخانه Places Android KTX برای استفاده از ویژگیهای زبان مخصوص Kotlin در برنامه خود استفاده کنید.
وابستگی Places Android KTX را اضافه کنید
برای استفاده از ویژگیهای خاص Kotlin، کتابخانه KTX مربوطه را برای این SDK در فایل build.gradle
در سطح برنامه خود قرار دهید.
build.gradle
dependencies {
// ...
// Places SDK for Android KTX Library
implementation 'com.google.maps.android:places-ktx:2.0.0'
}
6. Places Client را راه اندازی کنید
Places SDK را برای دامنه برنامه راه اندازی کنید
در فایل DemoApplication.kt
پوشه app/src/main/java/com/google/codelabs/maps/placesdemo
، Places SDK را برای اندروید مقداردهی اولیه کنید. خطوط زیر را در انتهای تابع onCreate
قرار دهید:
// Initialize the SDK with the Google Maps Platform API key
Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)
هنگامی که برنامه خود را میسازید، افزونه Secrets Gradle برای Android ، کلید API را در فایل local.properties بهعنوان local.properties
در دسترس قرار BuildConfig.GOOGLE_MAPS_API_KEY
.
فایل برنامه را به مانیفست اضافه کنید
از آنجایی که Application
را با DemoApplication
گسترش داده اید، باید مانیفست را به روز کنید. ویژگی android:name
را به عنصر application
در فایل AndroidManifest.xml
، واقع در app/src/main
اضافه کنید:
<application
android:name=".DemoApplication"
...
</application>
این کد مانیفست برنامه را به کلاس DemoApplication
در پوشه src/main/java/com/google/codelabs/maps/placesdemo/
.
7. واکشی جزئیات مکان
یک صفحه جزئیات ایجاد کنید
یک طرحبندی activity_details.xml
با یک LinearLayout
خالی در پوشه app/src/main/res/layout/
موجود است. طرح خطی را با اضافه کردن کد زیر بین براکت های <LinearLayout>
کنید.
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/details_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/details_input_hint"
android:text="@string/details_input_default" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/details_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_details" />
<TextView
android:id="@+id/details_response_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:textIsSelectable="true" />
این کد یک فیلد ورودی متن اضافه می کند که در آن کاربر می تواند هر شناسه مکان را وارد کند یا از پیش فرض ارائه شده استفاده کند، یک دکمه برای شروع درخواست جزئیات مکان، و یک TextView برای نمایش اطلاعات از پاسخ. رشته های مرتبط برای شما در فایل src/main/res/values/strings.xml
تعریف شده است.
یک فعالیت Details ایجاد کنید
- یک فایل
DetailsActivity.kt
در پوشهsrc/main/java/com/google/codelabs/maps/placesdemo/
کنید و آن را با طرحبندی که ایجاد کردهاید مرتبط کنید. این کد را در فایل قرار دهید:
class DetailsActivity : AppCompatActivity() {
private lateinit var placesClient: PlacesClient
private lateinit var detailsButton: Button
private lateinit var detailsInput: TextInputEditText
private lateinit var responseView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_details)
// Set up view objects
detailsInput = findViewById(R.id.details_input)
detailsButton = findViewById(R.id.details_button)
responseView = findViewById(R.id.details_response_content)
}
}
- یک Places Client برای استفاده در این فعالیت ایجاد کنید. این کد را بعد از تنظیم شی view در تابع
onCreate
قرار دهید.
// Retrieve a PlacesClient (previously initialized - see DemoApplication)
placesClient = Places.createClient(this)
- پس از راهاندازی Places Client، یک کلیک شنونده را به دکمه متصل کنید. این کد را بعد از ایجاد Places Client در تابع
onCreate
قرار دهید.
// Upon button click, fetch and display the Place Details
detailsButton.setOnClickListener {
val placeId = detailsInput.text.toString()
val placeFields = listOf(
Place.Field.NAME,
Place.Field.ID,
Place.Field.LAT_LNG,
Place.Field.ADDRESS
)
lifecycleScope.launch {
try {
val response = placesClient.awaitFetchPlace(placeId, placeFields)
responseView.text = response.prettyPrint()
} catch (e: Exception) {
e.printStackTrace()
responseView.text = e.message
}
}
}
این کد شناسه مکان را که در فیلد ورودی وارد شده است بازیابی میکند، تعیین میکند کدام فیلد برای مکان درخواست شود، یک FetchPlaceRequest
ایجاد میکند، کار را آغاز میکند و برای موفقیت یا شکست گوش میدهد. اگر درخواست موفقیت آمیز باشد، تابع TextView را با جزئیات درخواستی پر می کند.
- با تعریف تابع پسوند
FetchPlaceResponse
را به متن تبدیل کنید. یک فایلStringUtil.kt
برای ساده سازی تبدیل پاسخ های Places SDK به رشته های قابل خواندن توسط انسان ارائه شده است.
در انتهای فایل DetailsActivity.kt
، تابعی را برای تبدیل شی پاسخ Fetch Place به رشته تعریف کنید.
fun FetchPlaceResponse.prettyPrint(): String {
return StringUtil.stringify(this, false)
}
فعالیت Details را به مانیفست اضافه کنید
یک عنصر <activity>
برای DetailsActivity
به عنوان فرزند عنصر <application>
در فایل AndroidManifest.xml
، واقع در app/src/main
اضافه کنید:
<activity android:name=".DetailsActivity" />
فعالیت جزئیات را به منوی نمایشی اضافه کنید
یک ماژول Demo
خالی برای فهرست کردن دموهای موجود در صفحه اصلی ارائه شده است. اکنون که یک فعالیت جزئیات مکان ایجاد کرده اید، آن را با این کد به فایل Demo.kt
در پوشه src/main/java/com/google/codelabs/maps/placesdemo/
کنید:
DETAILS_FRAGMENT_DEMO(
R.string.details_demo_title,
R.string.details_demo_description,
DetailsActivity::class.java
),
رشته های مرتبط در فایل src/main/res/values/strings.xml
تعریف شده اند.
MainActivity.kt
را بررسی کنید و مشاهده کنید که یک ListView ایجاد می کند که با تکرار در محتویات ماژول Demo
پر می شود. اگر کاربر روی یک مورد در لیست ضربه بزند، شنونده کلیک فعالیت مرتبط را باز می کند.
برنامه را اجرا کنید
- برنامه را اجرا کنید. این بار باید یک مورد را در لیستی که نسخه نمایشی جزئیات مکان را ارائه می دهد، مشاهده کنید.
- روی متن جزئیات مکان ضربه بزنید. شما باید نمای ایجاد شده توسط یک فیلد ورودی و دکمه را ببینید.
- روی دکمه «دریافت جزئیات» ضربه بزنید. اگر از شناسه مکان پیشفرض استفاده کردهاید، باید نام مکان، آدرس و مختصات نقشه را ببینید، همانطور که در شکل 1 نشان داده شده است.
شکل 1. فعالیت جزئیات مکان با نمایش پاسخ.
8. تکمیل خودکار مکان را اضافه کنید
یک صفحه تکمیل خودکار ایجاد کنید
یک طرحبندی activity_autocomplete.xml
با یک LinearLayout
خالی در پوشه app/src/main/res/layout/
ارائه شده است. طرح خطی را با اضافه کردن این کد بین براکت های <LinearLayout>
کنید.
<androidx.fragment.app.FragmentContainerView
android:id="@+id/autocomplete_fragment"
android:background="@android:color/white"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/autocomplete_response_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:textIsSelectable="true" />
این کد یک ویجت AutocompleteSupportFragment
و یک TextView را برای نمایش اطلاعات از پاسخ اضافه می کند. رشته های مرتبط در فایل src/main/res/values/strings.xml
تعریف شده اند.
یک فعالیت تکمیل خودکار ایجاد کنید
- یک فایل
AutocompleteActivity.kt
در پوشهsrc/main/java/com/google/codelabs/maps/placesdemo/
کنید و آن را با این کد تعریف کنید:
class AutocompleteActivity : AppCompatActivity() {
private lateinit var responseView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_autocomplete)
// Set up view objects
responseView = findViewById(R.id.autocomplete_response_content)
val autocompleteFragment =
supportFragmentManager.findFragmentById(R.id.autocomplete_fragment)
as AutocompleteSupportFragment
}
}
این کد فعالیت را با view ها و AutocompleteSupportFramgent
که در فایل طرح بندی تعریف کرده اید مرتبط می کند.
- در مرحله بعد، مشخص کنید وقتی کاربر یکی از پیش بینی های ارائه شده توسط Place Autocomplete را انتخاب می کند چه اتفاقی می افتد. این کد را به انتهای تابع
onCreate
اضافه کنید:
// Specify the types of place data to return.
autocompleteFragment.setPlaceFields(listOf(Place.Field.NAME, Place.Field.ID, Place.Field.LAT_LNG, Place.Field.ADDRESS))
// Listen to place selection events
lifecycleScope.launchWhenCreated {
autocompleteFragment.placeSelectionEvents().collect { event ->
when (event) {
is PlaceSelectionSuccess -> {
val place = event.place
responseView.text = StringUtil.stringifyAutocompleteWidget(place, false)
}
is PlaceSelectionError -> Toast.makeText(
this@AutocompleteActivity,
"Failed to get place '${event.status.statusMessage}'",
Toast.LENGTH_SHORT
).show()
}
}
این کد تعیین می کند که کدام فیلدها را برای مکان درخواست کند، به رویداد انتخاب مکان گوش می دهد و برای موفقیت یا شکست گوش می دهد. اگر درخواست موفقیت آمیز باشد، تابع TextView را با جزئیات مکان پر می کند. توجه داشته باشید که Place Autocomplete یک شی Place را برمی گرداند. هنگام استفاده از ویجت تکمیل خودکار مکان، نیازی به درخواست جداگانه جزئیات مکان نیست.
فعالیت تکمیل خودکار را به مانیفست اضافه کنید
یک عنصر <activity>
برای AutocompleteActivity
به عنوان فرزند عنصر <application>
در فایل AndroidManifest.xml
، واقع در app/src/main
اضافه کنید:
<activity android:name=".AutocompleteActivity" />
فعالیت تکمیل خودکار را به منوی نمایشی اضافه کنید
مانند قبل، نسخه ی Demo
Place Autocomplete را با اضافه کردن آن به لیست در ماژول نمایش، به صفحه اصلی اضافه کنید. اکنون که یک فعالیت تکمیل خودکار مکان ایجاد کرده اید، آن را به فایل Demo.kt
در پوشه src/main/java/com/google/codelabs/maps/placesdemo/
کنید. این کد را بلافاصله بعد از مورد DETAILS_FRAGMENT_DEMO
کنید:
AUTOCOMPLETE_FRAGMENT_DEMO(
R.string.autocomplete_fragment_demo_title,
R.string.autocomplete_fragment_demo_description,
AutocompleteActivity::class.java
),
رشته های مرتبط در فایل src/main/res/values/strings.xml
تعریف شده اند.
برنامه را اجرا کنید
- برنامه را اجرا کنید. این بار باید دو مورد را در لیست صفحه اصلی مشاهده کنید.
- روی ردیف تکمیل خودکار مکان ضربه بزنید. همانطور که در شکل 2 نشان داده شده است، باید یک ورودی تکمیل خودکار مکان ظاهر شود.
- شروع به تایپ نام یک مکان کنید. این می تواند نام مؤسسه، آدرس یا منطقه جغرافیایی باشد. پیشبینیها باید همانطور که تایپ میکنید ارائه شوند.
- یکی از پیش بینی ها را انتخاب کنید. پیش بینی ها باید ناپدید شوند و TextView اکنون باید جزئیات مکان انتخاب شده را همانطور که در شکل 3 نشان داده شده است نشان دهد.
شکل 2. تکمیل خودکار فعالیت پس از ضربه زدن کاربر به قسمت ورودی.
شکل 3. تکمیل خودکار فعالیت برای نمایش جزئیات مکان پس از تایپ و انتخاب "آبشار نیاگارا" توسط کاربر.
9. مکان فعلی دستگاه را دریافت کنید
یک صفحه مکان فعلی ایجاد کنید
یک طرحبندی activity_current.xml
با یک LinearLayout
خالی در پوشه app/src/main/res/layout/
ارائه شده است. طرح خطی را با اضافه کردن کد زیر در بین براکت های <LinearLayout>
کنید.
<Button
android:id="@+id/current_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/current_button" />
<TextView
android:id="@+id/current_response_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:scrollbars = "vertical"
android:textIsSelectable="true" />
یک فعالیت مکان فعلی ایجاد کنید
- یک فایل
CurrentActivity.kt
در پوشهsrc/main/java/com/google/codelabs/maps/placesdemo/
کنید و آن را با این کد تعریف کنید:
class CurrentPlaceActivity : AppCompatActivity() {
private lateinit var placesClient: PlacesClient
private lateinit var currentButton: Button
private lateinit var responseView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_current)
// Retrieve a PlacesClient (previously initialized - see DemoApplication)
placesClient = Places.createClient(this)
// Set view objects
currentButton = findViewById(R.id.current_button)
responseView = findViewById(R.id.current_response_content)
// Set listener for initiating Current Place
currentButton.setOnClickListener {
checkPermissionThenFindCurrentPlace()
}
}
}
این کد فعالیت را با نماهایی که در فایل layout تعریف کرده اید مرتبط می کند. همچنین یک کلیک شنونده به دکمه اضافه می کند تا با کلیک روی دکمه، تابع checkPermissionThenFindCurrentPlace
را فراخوانی کند.
-
checkPermissionThenFindCurrentPlace()
را برای بررسی مجوز مکان دقیق و درخواست مجوز در صورتی که هنوز اعطا نشده است را تعریف کنید. این کد را بعد از تابعonCreate
قرار دهید.
/**
* Checks that the user has granted permission for fine or coarse location.
* If granted, finds current Place.
* If not yet granted, launches the permission request.
* See https://developer.android.com/training/permissions/requesting
*/
private fun checkPermissionThenFindCurrentPlace() {
when {
(ContextCompat.checkSelfPermission(
this,
ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED) -> {
// You can use the API that requires the permission.
findCurrentPlace()
}
shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)
-> {
Log.d(TAG, "Showing permission rationale dialog")
// TODO: In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
}
else -> {
// Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
),
PERMISSION_REQUEST_CODE
)
}
}
}
companion object {
private val TAG = "CurrentPlaceActivity"
private const val PERMISSION_REQUEST_CODE = 9
}
- هنگامی که شاخه
else
تابعcheckPermissionThenFindCurrentPlace
درخواست مجوز را فرا میrequestPermissions
، برنامه یک گفتگوی درخواست مجوز را به کاربر ارائه می دهد. اگر کاربر از دستگاهی استفاده میکند که دارای سیستمعامل پایینتر از Android 12 است، کاربر فقط میتواند مجوز مکان دقیق (خوب) بدهد. اگر کاربر از دستگاهی با اندروید 12 یا بالاتر استفاده می کند، همانطور که در شکل 4 نشان داده شده است، این گزینه به او داده می شود که مکان تقریبی (درشت) را به جای مکان دقیق (دقیق) ارائه دهد.
شکل 4. درخواست مجوز کاربر در دستگاهی که دارای Android 12 یا بالاتر است، گزینه اعطای مکان دقیق یا تقریبی را ارائه می دهد.
پس از اینکه کاربر به گفتگوی مجوزهای سیستم پاسخ داد، سیستم اجرای برنامه شما را از onRequestPermissionsResult
فراخوانی می کند. سیستم در پاسخ کاربر به گفتگوی مجوز و همچنین کد درخواستی که شما تعریف کرده اید ارسال می کند. روی RequestPermissionResult را نادیده بگیرید تا با قرار دادن کد زیر در زیر onRequestPermissionResult
، کد درخواست مجوزهای مکان مربوط به این فعالیت مکان فعلی checkPermissionThenFindCurrentPlace
کنترل کنید.
@SuppressLint("MissingPermission")
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>, grantResults: IntArray
) {
if (requestCode != PERMISSION_REQUEST_CODE) {
super.onRequestPermissionsResult(
requestCode,
permissions,
grantResults
)
return
} else if (permissions.toList().zip(grantResults.toList())
.firstOrNull { (permission, grantResult) ->
grantResult == PackageManager.PERMISSION_GRANTED && (permission == ACCESS_FINE_LOCATION || permission == ACCESS_COARSE_LOCATION)
} != null
)
// At least one location permission has been granted, so proceed with Find Current Place
findCurrentPlace()
}
- پس از اعطای مجوز، تابع
findCurrentPlace
اجرا خواهد شد. تابع را با این کد بعد از تابعonRequestPermissionsResult
تعریف کنید.
/**
* Fetches a list of [PlaceLikelihood] instances that represent the Places the user is
* most
* likely to be at currently.
*/
@RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
private fun findCurrentPlace() {
// Use fields to define the data types to return.
val placeFields: List<Place.Field> =
listOf(Place.Field.NAME, Place.Field.ID, Place.Field.ADDRESS, Place.Field.LAT_LNG)
// Use the builder to create a FindCurrentPlaceRequest.
val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)
// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
) {
// Retrieve likely places based on the device's current location
lifecycleScope.launch {
try {
val response = placesClient.awaitFindCurrentPlace(placeFields)
responseView.text = response.prettyPrint()
// Enable scrolling on the long list of likely places
val movementMethod = ScrollingMovementMethod()
responseView.movementMethod = movementMethod
} catch (e: Exception) {
e.printStackTrace()
responseView.text = e.message
}
}
} else {
Log.d(TAG, "LOCATION permission not granted")
checkPermissionThenFindCurrentPlace()
}
}
این کد فیلدهایی را برای مکانهای احتمالی درخواست میکند، یک FindCurrentPlaceRequest
ایجاد میکند، کار را آغاز میکند، و TextView را با جزئیات درخواستی پر میکند.
- با تعریف تابع افزونه،
FindCurrentPlaceResponse
را به متن تبدیل کنید. یک فایلStringUtil.kt
برای ساده سازی تبدیل پاسخ های Places SDK به رشته های قابل خواندن توسط انسان ارائه شده است.
در انتهای فایل CurrentPlaceActivity.kt
، تابعی را برای تبدیل شی پاسخ Current Place به رشته تعریف کنید.
fun FindCurrentPlaceResponse.prettyPrint(): String {
return StringUtil.stringify(this, false)
}
فعالیت مکان فعلی را به مانیفست اضافه کنید
یک عنصر <activity>
برای CurrentPlaceActivity
به عنوان فرزند عنصر <application>
در فایل AndroidManifest.xml
، واقع در app/src/main
اضافه کنید:
<activity android:name=".CurrentPlaceActivity" />
فعالیت Current Place را به منوی نمایشی اضافه کنید
مانند قبل، نسخه نمایشی مکان فعلی را با اضافه کردن آن به لیست در ماژول Demo
به صفحه اصلی اضافه کنید. اکنون که یک فعالیت Current Place ایجاد کرده اید، آن را به فایل Demo.kt
در پوشه src/main/java/com/google/codelabs/maps/placesdemo/
کنید. این کد را بلافاصله بعد از مورد AUTOCOMPLETE_FRAGMENT_DEMO
کنید:
CURRENT_FRAGMENT_DEMO(
R.string.current_demo_title,
R.string.current_demo_description,
CurrentPlaceActivity::class.java
),
رشته های مرتبط در فایل src/main/res/values/strings.xml
تعریف شده اند.
برنامه را اجرا کنید
- برنامه را اجرا کنید. این بار باید سه مورد را در لیست صفحه اصلی مشاهده کنید.
- روی ردیف مکان فعلی ضربه بزنید. باید دکمه ای را روی صفحه ببینید.
- روی دکمه ضربه بزنید. اگر قبلاً مجوز مکان را به این برنامه ندادهاید، یک درخواست مجوز باید ظاهر شود.
- به برنامه اجازه دسترسی به موقعیت مکانی دستگاه بدهید.
- دوباره روی دکمه ضربه بزنید. این بار، همانطور که در شکل 5 نشان داده شده است، فهرستی از حداکثر 20 مکان نزدیک و احتمالات آنها باید ظاهر شود.
شکل 5. ارائه منطبقات احتمالی مکان فعلی برای مکان گزارش شده دستگاه.
10. تبریک می گویم
شما با موفقیت یک برنامه Android با Places SDK برای Android ساخته اید.
چیزی که یاد گرفتی
- نصب و پیکربندی Places SDK برای اندروید.
- نصب برنامه های افزودنی Kotlin برای Places SDK برای اندروید.
- در حال بارگیری جزئیات مکان
- افزودن تکمیل خودکار مکان
- بدست آوردن مکان فعلی
بعدش چی؟
- برای الهام بیشتر، مخزن
android-places-demos
GitHub از نمونهها و دموها را کاوش یا جدا کنید. - از کدهای Kotlin بیشتر برای ساخت برنامه های اندروید با پلتفرم نقشه های گوگل بیاموزید.
- با پاسخ دادن به سوال زیر به ما در ایجاد محتوایی که برای شما مفیدتر است کمک کنید:
دوست دارید چه کدهای دیگری را ببینید؟
آیا کد لبه مورد نظر شما در لیست نیست؟ آن را با یک شماره جدید در اینجا درخواست کنید .