با Places SDK برای Android (Kotlin) شروع کنید

1. قبل از شروع

این کد لبه به شما می آموزد که چگونه Places SDK برای اندروید را با برنامه خود ادغام کنید و از هر یک از ویژگی های Places SDK استفاده کنید.

برنامه نمایشی مکان ها

پیش نیازها

  • دانش اولیه کاتلین و توسعه اندروید

چیزی که یاد خواهید گرفت

  • نحوه نصب Places SDK برای اندروید با برنامه های افزودنی Kotlin.
  • نحوه بارگیری جزئیات مکان برای یک مکان خاص.
  • چگونه یک ویجت تکمیل خودکار مکان را به برنامه خود اضافه کنید.
  • نحوه بارگیری مکان فعلی بر اساس مکان گزارش شده فعلی دستگاه.

آنچه شما نیاز دارید

برای تکمیل این کد لبه، به حساب‌ها، خدمات و ابزارهای زیر نیاز دارید:

2. راه اندازی شوید

برای مرحله فعال سازی زیر، Places API را فعال کنید.

پلتفرم نقشه های گوگل را راه اندازی کنید

اگر قبلاً حساب Google Cloud Platform و پروژه‌ای با صورت‌حساب فعال ندارید، لطفاً راهنمای شروع به کار با Google Maps Platform را برای ایجاد یک حساب صورت‌حساب و یک پروژه ببینید.

  1. در Cloud Console ، روی منوی کشویی پروژه کلیک کنید و پروژه ای را که می خواهید برای این کد لبه استفاده کنید انتخاب کنید.

  1. APIها و SDKهای پلتفرم Google Maps مورد نیاز برای این لبه کد را در Google Cloud Marketplace فعال کنید. برای انجام این کار، مراحل این ویدئو یا این مستند را دنبال کنید.
  2. یک کلید API در صفحه Credentials در Cloud Console ایجاد کنید. می توانید مراحل این ویدئو یا این مستند را دنبال کنید. همه درخواست‌ها به پلتفرم نقشه‌های Google به یک کلید API نیاز دارند.

3. شروع سریع

برای شروع هر چه سریع‌تر، کد شروع را دانلود کنید تا به شما کمک کند تا این نرم‌افزار را دنبال کنید. شما می توانید به سراغ راه حل بروید، اما اگر می خواهید تمام مراحل ساخت آن را خودتان دنبال کنید، به خواندن ادامه دهید.

  1. اگر git را نصب کرده اید، مخزن را کلون کنید.
git clone https://github.com/googlemaps/codelab-places-101-android.git

یا برای دانلود کد منبع روی این دکمه کلیک کنید.

  1. پس از دانلود کد، پروژه ای را که در دایرکتوری /starter در اندروید استودیو یافت می شود، باز کنید. این پروژه شامل ساختار فایل اصلی است که برای تکمیل کد لبه نیاز دارید. هر چیزی که برای کار با آن نیاز دارید در پوشه /starter قرار دارد.

اگر می خواهید کد راه حل کامل را در حال اجرا ببینید، می توانید کد تکمیل شده را در پوشه /solution مشاهده کنید.

4. Places SDK را برای اندروید نصب کنید

در این بخش، Places SDK برای اندروید را به وابستگی های برنامه خود اضافه می کنید.

کلید API خود را اضافه کنید

کلید API را که قبلاً ایجاد کردید در اختیار برنامه قرار دهید تا Places SDK برای Android بتواند کلید شما را با برنامه شما مرتبط کند.

  1. فایلی به نام local.properties را در دایرکتوری اصلی پروژه خود باز کنید (همان سطحی که gradle.properties و settings.gradle هستند).
  2. یک کلید جدید تعریف کنید GOOGLE_MAPS_API_KEY ، مقدار آن را روی کلید API که ایجاد کردید تنظیم کنید.

محلی.ملاک

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

توجه داشته باشید که local.properties در فایل local.properties در مخزن Git فهرست شده است .gitignore این به این دلیل است که کلید API شما اطلاعات حساسی محسوب می‌شود و در صورت امکان نباید در کنترل منبع بررسی شود.

  1. در مرحله بعد، برای اینکه کلید API خود را در معرض دید قرار دهید تا بتوان از آن در سراسر برنامه استفاده کرد، افزونه Secrets Gradle برای Android را در فایل build.gradle برنامه خود که در دایرکتوری app/ قرار دارد قرار دهید و خط زیر را در بلوک plugins اضافه کنید:

build.gradle سطح برنامه

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. فایل 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 را اضافه کنید

  1. اکنون که کلید 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'
}
  1. برنامه را اجرا کنید.

اکنون باید یک برنامه با صفحه خالی را ببینید. به پر کردن این صفحه با سه نسخه نمایشی ادامه دهید.

5. Places Android KTX را نصب کنید

برای برنامه‌های Kotlin که از یک یا چند SDK Android پلتفرم نقشه‌های Google استفاده می‌کنند، کتابخانه‌های برنامه افزودنی Kotlin (KTX) به شما امکان می‌دهند از ویژگی‌های زبان Kotlin مانند برنامه‌های مشترک، ویژگی‌ها/توابع برنامه افزودنی و غیره استفاده کنید. هر Google Maps SDK دارای یک کتابخانه KTX مربوطه است که در زیر نشان داده شده است:

نمودار 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 ایجاد کنید

  1. یک فایل 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)

    }
}
  1. یک Places Client برای استفاده در این فعالیت ایجاد کنید. این کد را بعد از تنظیم شی view در تابع onCreate قرار دهید.
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. پس از راه‌اندازی 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 را با جزئیات درخواستی پر می کند.

  1. با تعریف تابع پسوند 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. برنامه را اجرا کنید. این بار باید یک مورد را در لیستی که نسخه نمایشی جزئیات مکان را ارائه می دهد، مشاهده کنید.
  2. روی متن جزئیات مکان ضربه بزنید. شما باید نمای ایجاد شده توسط یک فیلد ورودی و دکمه را ببینید.
  3. روی دکمه «دریافت جزئیات» ضربه بزنید. اگر از شناسه مکان پیش‌فرض استفاده کرده‌اید، باید نام مکان، آدرس و مختصات نقشه را ببینید، همانطور که در شکل 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 تعریف شده اند.

یک فعالیت تکمیل خودکار ایجاد کنید

  1. یک فایل 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 که در فایل طرح بندی تعریف کرده اید مرتبط می کند.

  1. در مرحله بعد، مشخص کنید وقتی کاربر یکی از پیش بینی های ارائه شده توسط 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 تعریف شده اند.

برنامه را اجرا کنید

  1. برنامه را اجرا کنید. این بار باید دو مورد را در لیست صفحه اصلی مشاهده کنید.
  2. روی ردیف تکمیل خودکار مکان ضربه بزنید. همانطور که در شکل 2 نشان داده شده است، باید یک ورودی تکمیل خودکار مکان ظاهر شود.
  3. شروع به تایپ نام یک مکان کنید. این می تواند نام مؤسسه، آدرس یا منطقه جغرافیایی باشد. پیش‌بینی‌ها باید همانطور که تایپ می‌کنید ارائه شوند.
  4. یکی از پیش بینی ها را انتخاب کنید. پیش بینی ها باید ناپدید شوند و TextView اکنون باید جزئیات مکان انتخاب شده را همانطور که در شکل 3 نشان داده شده است نشان دهد.

تکمیل خودکار فعالیت پس از ضربه زدن کاربر به قسمت ورودی

شکل 2. تکمیل خودکار فعالیت پس از ضربه زدن کاربر به قسمت ورودی.

تکمیل خودکار فعالیت پس از تایپ و انتخاب &ldquo;آبشار نیاگارا&rdquo;

شکل 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" />

یک فعالیت مکان فعلی ایجاد کنید

  1. یک فایل 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 را فراخوانی کند.

  1. 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
    }
  1. هنگامی که شاخه else تابع checkPermissionThenFindCurrentPlace درخواست مجوز را فرا می requestPermissions ، برنامه یک گفتگوی درخواست مجوز را به کاربر ارائه می دهد. اگر کاربر از دستگاهی استفاده می‌کند که دارای سیستم‌عامل پایین‌تر از Android 12 است، کاربر فقط می‌تواند مجوز مکان دقیق (خوب) بدهد. اگر کاربر از دستگاهی با اندروید 12 یا بالاتر استفاده می کند، همانطور که در شکل 4 نشان داده شده است، این گزینه به او داده می شود که مکان تقریبی (درشت) را به جای مکان دقیق (دقیق) ارائه دهد.

درخواست مجوز کاربر در دستگاهی که دارای Android 12 یا بالاتر است

شکل 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()
    }
  1. پس از اعطای مجوز، تابع 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 را با جزئیات درخواستی پر می‌کند.

  1. با تعریف تابع افزونه، 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 تعریف شده اند.

برنامه را اجرا کنید

  1. برنامه را اجرا کنید. این بار باید سه مورد را در لیست صفحه اصلی مشاهده کنید.
  2. روی ردیف مکان فعلی ضربه بزنید. باید دکمه ای را روی صفحه ببینید.
  3. روی دکمه ضربه بزنید. اگر قبلاً مجوز مکان را به این برنامه نداده‌اید، یک درخواست مجوز باید ظاهر شود.
  4. به برنامه اجازه دسترسی به موقعیت مکانی دستگاه بدهید.
  5. دوباره روی دکمه ضربه بزنید. این بار، همانطور که در شکل 5 نشان داده شده است، فهرستی از حداکثر 20 مکان نزدیک و احتمالات آنها باید ظاهر شود.

ارائه منطبقات احتمالی مکان فعلی برای مکان گزارش شده دستگاه

شکل 5. ارائه منطبقات احتمالی مکان فعلی برای مکان گزارش شده دستگاه.

10. تبریک می گویم

شما با موفقیت یک برنامه Android با Places SDK برای Android ساخته اید.

چیزی که یاد گرفتی

بعدش چی؟

  • برای الهام بیشتر، مخزن android-places-demos GitHub از نمونه‌ها و دموها را کاوش یا جدا کنید.
  • از کدهای Kotlin بیشتر برای ساخت برنامه های اندروید با پلتفرم نقشه های گوگل بیاموزید.
  • با پاسخ دادن به سوال زیر به ما در ایجاد محتوایی که برای شما مفیدتر است کمک کنید:

دوست دارید چه کدهای دیگری را ببینید؟

تجسم داده ها بر روی نقشه ها بیشتر در مورد سفارشی کردن سبک نقشه های من ساختمان برای تعاملات سه بعدی در نقشه ها

آیا کد لبه مورد نظر شما در لیست نیست؟ آن را با یک شماره جدید در اینجا درخواست کنید .