สร้างเครื่องมือเลือกสถานที่ปัจจุบันของคุณเองสำหรับ Android (Java)

1. ก่อนเริ่มต้น

ดูวิธีใช้ Google Maps Platform และ Places SDK สำหรับ Android เพื่อแสดงรายการสถานที่ต่อผู้ใช้เพื่อระบุตำแหน่งปัจจุบัน

bd07a9ad2cb27a06.png

ข้อกำหนดเบื้องต้น

  • ทักษะพื้นฐานด้าน Java

สิ่งที่คุณต้องดำเนินการ

  • เพิ่มแผนที่ลงในแอป Android
  • ใช้สิทธิ์เข้าถึงตำแหน่งเพื่อระบุตำแหน่งทางภูมิศาสตร์ของผู้ใช้
  • ดึงข้อมูลสถานที่ใกล้ตำแหน่งปัจจุบันของผู้ใช้
  • แสดงสถานที่ที่น่าจะเป็นไปได้ต่อผู้ใช้เพื่อระบุตำแหน่งปัจจุบัน

สิ่งที่คุณจะสร้าง

คุณสร้างแอป Android ตั้งแต่ต้น แต่สามารถดาวน์โหลดโค้ดตัวอย่างเพื่อเปรียบเทียบเมื่อทำการแก้ไขข้อบกพร่อง ดาวน์โหลดโค้ดตัวอย่างจาก GitHub หรือหากตั้งค่า Git สำหรับการใช้บรรทัดคำสั่งแล้ว ให้ป้อนข้อมูลต่อไปนี้

git clone https://github.com/googlecodelabs/current-place-picker-android.git

หากพบปัญหา (ข้อบกพร่องของโค้ด ข้อผิดพลาดทางไวยากรณ์ คำที่ไม่ชัดเจน หรือปัญหาอื่นๆ) ขณะทำตาม Codelab นี้ โปรดรายงานปัญหาผ่านลิงก์รายงานข้อผิดพลาดที่มุมซ้ายล่างของ Codelab

2. เริ่มต้นใช้งาน

ก่อนเริ่ม Codelab นี้ คุณต้องตั้งค่าสิ่งต่อไปนี้

Android Studio

ดาวน์โหลด Android Studio จาก https://developer.android.com/studio

หากมี Android Studio อยู่แล้ว โปรดตรวจสอบว่าคุณใช้เวอร์ชันล่าสุดโดยคลิก Android Studio > ตรวจหาข้อมูลอัปเดต...

1f36bae83b64e33.png

แล็บนี้เขียนขึ้นโดยใช้ Android Studio 3.4

Android SDK

ใน Android Studio คุณสามารถกำหนดค่า SDK ที่ต้องการได้โดยใช้ SDK Manager แล็บนี้ใช้ Android Q SDK

  1. จากหน้าจอต้อนรับของ Android Studio ให้คลิกกำหนดค่า > SDK Manager

d3fa03c269ec231c.png

  1. เลือกช่องทำเครื่องหมาย SDK ที่ต้องการ แล้วคลิกใช้

หากยังไม่มี SDK ระบบจะเริ่มดาวน์โหลด SDK ไปยังเครื่องของคุณ

884e0aa1314f70d.png

บริการ Google Play

นอกจากนี้ คุณยังต้องติดตั้งบริการ Google Play จาก SDK Manager ด้วย

  1. คลิกแท็บ SDK Tools แล้วเลือกช่องทําเครื่องหมายบริการ Google Play

อัปเดตหากสถานะระบุว่ามีการอัปเดตพร้อมใช้งาน

ad6211fd78f3b629.png

3. เตรียมโปรแกรมจำลอง

หากต้องการเรียกใช้แอป คุณสามารถเชื่อมต่ออุปกรณ์ของคุณเองหรือใช้โปรแกรมจำลอง Android

หากใช้อุปกรณ์ของคุณเอง ให้ข้ามไปที่วิธีการสำหรับอุปกรณ์จริง: อัปเดตบริการ Google Play ที่ส่วนท้ายของหน้านี้

เพิ่มโปรแกรมจำลอง

  1. จากหน้าจอต้อนรับของ Android Studio ให้คลิกกำหนดค่า > AVD Manager

5dd2d14c9c56d3f9.png

ซึ่งจะเปิดกล่องโต้ตอบตัวจัดการอุปกรณ์เสมือน Android

  1. คลิกสร้างอุปกรณ์เสมือน... เพื่อเปิดรายการอุปกรณ์ที่คุณเลือกได้

2d44eada384f8b35.png

  1. เลือกอุปกรณ์ที่มีไอคอน Play d5722488d80cd6be.png ในคอลัมน์ Play Store แล้วคลิกถัดไป

e0248f1c6e85ab7c.png

คุณจะเห็นชุดอิมเมจระบบที่ติดตั้งได้ หากการกำหนดเป้าหมาย Q Android 9 ขึ้นไป (Google Play) มีคำว่าดาวน์โหลดอยู่ข้างๆ ให้คลิกดาวน์โหลด

316d0d1efabd9f24.png

  1. คลิกถัดไปเพื่อตั้งชื่ออุปกรณ์เสมือน แล้วคลิกเสร็จสิ้น

คุณจะกลับไปที่รายการอุปกรณ์เสมือนของคุณ

  1. คลิกเริ่ม ba8adffe56d3b678.png ข้างอุปกรณ์เครื่องใหม่

7605864ed27f77ea.png

หลังจากผ่านไปสักครู่ โปรแกรมจำลองจะเปิดขึ้น

วิธีการสำหรับโปรแกรมจำลอง - อัปเดตบริการ Google Play

  1. เมื่อโปรแกรมจำลองเปิดขึ้น ให้คลิก ... ในแถบนำทางที่ปรากฏ**

2e1156e02643d018.png

ซึ่งจะเปิดกล่องโต้ตอบการควบคุมเพิ่มเติม

  1. คลิก Google Play ในเมนู

หากมีการอัปเดตพร้อมใช้งาน ให้คลิกอัปเดต

5afd2686c5cad0e5.png

  1. ลงชื่อเข้าใช้โปรแกรมจำลองด้วยบัญชี Google

คุณสามารถใช้บัญชีของตัวเองหรือสร้างบัญชีใหม่ได้ฟรีเพื่อแยกการทดสอบออกจากข้อมูลส่วนตัว

จากนั้น Google Play จะเปิดไปยังบริการ Google Play

  1. คลิกอัปเดตเพื่อรับบริการ Google Play เวอร์ชันล่าสุด

f4bc067e80630b9c.png

หากระบบขอให้สร้างบัญชีให้เสร็จสมบูรณ์และเพิ่มตัวเลือกการชำระเงิน ให้คลิกข้าม

ตั้งค่าตำแหน่งในโปรแกรมจำลอง

  1. เมื่อเปิดโปรแกรมจำลองแล้ว ให้พิมพ์ "maps" ในแถบค้นหาบนหน้าจอหลักเพื่อดึงไอคอนแอป Google Maps ขึ้นมา

2d996aadd53685a6.png

  1. คลิกไอคอนเพื่อเปิด

คุณจะเห็นแผนที่เริ่มต้น

  1. คลิกตำแหน่งของคุณ c5b4e2fda57a7e71.png ที่ด้านขวาล่างของแผนที่

ระบบจะขอให้คุณให้สิทธิ์โทรศัพท์ในการใช้ตำแหน่ง

f2b68044eabca151.png

  1. คลิก ... เพื่อเปิดเมนูการควบคุมเพิ่มเติม
  2. คลิกแท็บสถานที่
  3. ป้อนละติจูดและลองจิจูด

ป้อนอะไรก็ได้ที่ต้องการ แต่ต้องอยู่ในพื้นที่ที่มีสถานที่มากมาย

(ใช้ละติจูด 20.7818 และลองจิจูด -156.4624 สำหรับเมืองคิเฮบนเกาะเมาวีในฮาวายเพื่อจำลองผลลัพธ์จากโค้ดแล็บนี้)

  1. คลิกส่ง แล้วแผนที่จะอัปเดตตำแหน่งนี้

f9576b35218f4187.png

คุณพร้อมที่จะเรียกใช้แอปและทดสอบด้วยตำแหน่งแล้ว

วิธีการสำหรับอุปกรณ์จริง - อัปเดตบริการ Google Play

หากใช้อุปกรณ์ Android จริง ให้ทำดังนี้

  1. ใช้แถบค้นหาในหน้าจอหลักเพื่อค้นหาและเปิดบริการ Google Play
  2. คลิกรายละเอียดเพิ่มเติม

คลิกอัปเดต หากมี

ad16cdb975b5c3f7.png baf0379ef8a9c88c.png

4. สร้าง App Shell ด้วยกิจกรรม Google Maps

  1. ในหน้าจอต้อนรับของ Android Studio ให้เลือกเริ่มโปรเจ็กต์ Android Studio ใหม่
  2. ในแท็บโทรศัพท์และแท็บเล็ต ให้เลือกกิจกรรมใน Google Maps

c9c80aa8211a8761.png

กล่องโต้ตอบกำหนดค่าโปรเจ็กต์จะเปิดขึ้น คุณตั้งชื่อแอปและสร้างแพ็กเกจตามโดเมนได้ที่นี่

ต่อไปนี้คือการตั้งค่าสำหรับแอปชื่อ Current Place ซึ่งสอดคล้องกับแพ็กเกจ com.google.codelab.currentplace

37f5b93b94ee118c.png

  1. เลือก Java เป็นภาษา แล้วเลือกใช้สิ่งประดิษฐ์ androidx*

เก็บค่าเริ่มต้นสำหรับการตั้งค่าที่เหลือ

  1. คลิกเสร็จสิ้น

5. เพิ่มทรัพยากร Dependency ของบริการของ Google ลงในไฟล์บิลด์ Gradle

หากต้องการเข้าถึงสิทธิ์เข้าถึงตำแหน่งใน Android คุณต้องมี Google Location API และ Activity Recognition API จากบริการ Google Play ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม API นี้และ API อื่นๆ ของบริการ Google Play ได้ที่ตั้งค่าบริการ Google Play

โดยปกติแล้ว โปรเจ็กต์ Android Studio จะมีไฟล์ build.gradle อยู่ 2 ไฟล์ โดยไฟล์หนึ่งจะใช้กับโปรเจ็กต์โดยรวม และอีกไฟล์หนึ่งจะใช้กับแอป หากคุณมีโปรเจ็กต์ Android Studio Explorer ในมุมมอง Android คุณจะเห็นทั้ง 2 ไฟล์ในโฟลเดอร์ Gradle Scripts คุณต้องแก้ไขไฟล์ build.gradle (Module: app) เพื่อเพิ่มบริการของ Google

f3043429cf719c47.png

  1. เพิ่ม 2 บรรทัดลงในส่วน dependencies เพื่อเพิ่มบริการของ Google สำหรับตำแหน่งและ Places API ( ตัวอย่างโค้ดในบริบท)

build.gradle (Module: app)

plugins {
  id 'com.android.application'
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.google.codelab.currentplace"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.google.android.libraries.places:places:1.1.0'
}

6. เปิดใช้ Google Maps Platform APIs และรับคีย์ API

สำหรับขั้นตอนการเปิดใช้ต่อไปนี้ คุณต้องเปิดใช้ Maps SDK สำหรับ Android และ Places API

ตั้งค่า Google Maps Platform

หากยังไม่มีบัญชี Google Cloud Platform และโปรเจ็กต์ที่เปิดใช้การเรียกเก็บเงิน โปรดดูคู่มือเริ่มต้นใช้งาน Google Maps Platform เพื่อสร้างบัญชีสำหรับการเรียกเก็บเงินและโปรเจ็กต์

  1. ใน Cloud Console ให้คลิกเมนูแบบเลื่อนลงของโปรเจ็กต์ แล้วเลือกโปรเจ็กต์ที่ต้องการใช้สำหรับ Codelab นี้

  1. เปิดใช้ Google Maps Platform APIs และ SDK ที่จำเป็นสำหรับ Codelab นี้ใน Google Cloud Marketplace โดยทำตามขั้นตอนในวิดีโอนี้หรือเอกสารประกอบนี้
  2. สร้างคีย์ API ในหน้าข้อมูลเข้าสู่ระบบของ Cloud Console คุณสามารถทำตามขั้นตอนในวิดีโอนี้หรือเอกสารประกอบนี้ คำขอทั้งหมดไปยัง Google Maps Platform ต้องใช้คีย์ API

คัดลอกคีย์ API ที่คุณเพิ่งสร้าง กลับไปที่ Android Studio แล้วค้นหาไฟล์ google_maps_api.xml ใน Android > app > res > values

แทนที่ YOUR_KEY_HERE ด้วยคีย์ API ที่คุณคัดลอก

aa576e551a7a1009.png

ตอนนี้แอปของคุณได้รับการกำหนดค่าแล้ว

7. แก้ไขไฟล์เลย์เอาต์

  1. ในโปรเจ็กต์ Explorer ให้เปิดไฟล์ activity_maps.xml ใน Android > app > res > layout

4e0d986480c57efa.png

  1. คุณจะเห็น UI พื้นฐานเปิดขึ้นทางด้านขวาของหน้าจอ โดยมีแท็บที่ด้านล่างซึ่งให้คุณเลือกเครื่องมือแก้ไขการออกแบบหรือข้อความสำหรับเลย์เอาต์ เลือกข้อความ แล้วแทนที่เนื้อหาทั้งหมดของไฟล์เลย์เอาต์ด้วยข้อความต่อไปนี้

activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:titleTextColor="@android:color/white"
        android:background="@color/colorPrimary" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="349dp"
            tools:context=".MapsActivity" />

        <ListView
            android:id="@+id/listPlaces"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

ซึ่งจะทำให้คุณมีอินเทอร์เฟซผู้ใช้ที่มีลักษณะดังนี้

1bf786808a4697ce.png

8. ตั้งค่าแถบแอป

หากต้องการให้ผู้ใช้มีปุ่มคลิกเมื่อต้องการเลือกสถานที่ปัจจุบัน ให้เพิ่มแถบแอปที่มีไอคอนซึ่งค้นหาสถานที่ปัจจุบันของผู้ใช้และแสดงสถานที่ที่น่าจะเป็นไปได้ในบริเวณใกล้เคียง ซึ่งมีลักษณะดังนี้

3a17c92b613a26c5.png

ในโทรศัพท์ จะแสดงเฉพาะไอคอน ในแท็บเล็ตที่มีพื้นที่มากขึ้น ระบบจะแสดงข้อความด้วย

สร้างไอคอน

  1. ในโปรเจ็กต์ Explorer ให้คลิก Android > app จากนั้นคลิกขวาที่โฟลเดอร์ res แล้วเลือกใหม่ > ชิ้นงานรูปภาพ

สตูดิโอชิ้นงานจะเปิดขึ้น

  1. ในเมนูประเภทไอคอน ให้คลิกไอคอนแถบการทำงานและแท็บ
  2. ตั้งชื่อชิ้นงาน ic_geolocate
  3. เลือกภาพคลิปอาร์ตเป็นประเภทชิ้นงาน**
  4. คลิกกราฟิกข้างภาพคลิปอาร์ต

ซึ่งจะเปิดหน้าต่างเลือกไอคอน

  1. เลือกไอคอน

คุณใช้แถบค้นหาเพื่อค้นหาไอคอนที่เกี่ยวข้องกับความตั้งใจได้

  1. ค้นหา location แล้วเลือกไอคอนที่เกี่ยวข้องกับตำแหน่ง

ไอคอนตำแหน่งของฉันเหมือนกับไอคอนที่ใช้ในแอป Google Maps เมื่อผู้ใช้ต้องการเล็งกล้องไปยังตำแหน่งปัจจุบัน

  1. คลิก OK > Next > Finish แล้วตรวจสอบว่ามีโฟลเดอร์ใหม่ชื่อ drawable ซึ่งมีไฟล์ไอคอนใหม่

b9e0196137ed18ae.png

เพิ่มทรัพยากรสตริง

  1. ใน Project Explorer ให้คลิก Android > app > res > values แล้วเปิดไฟล์ strings.xml
  2. เพิ่มบรรทัดต่อไปนี้หลัง <string name="title_activity_maps">Map</string>

strings.xml

    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>

ระบบจะใช้บรรทัดแรกในแถบแอปเมื่อมีพื้นที่สำหรับใส่ป้ายกำกับข้อความข้างไอคอน ส่วนที่เหลือจะใช้สำหรับเครื่องหมายที่คุณเพิ่มลงในแผนที่

ตอนนี้โค้ดในไฟล์จะมีลักษณะดังนี้

<resources>
    <string name="app_name">Current Place</string>
    <string name="title_activity_maps">Map</string>
    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>
</resources>

เพิ่มแถบแอป

  1. ในโปรเจ็กต์ Explorer ให้คลิก Android > app จากนั้นคลิกขวาที่โฟลเดอร์ res แล้วเลือกใหม่ > ไดเรกทอรีเพื่อสร้างไดเรกทอรีย่อยใหม่ภายใต้ app/src/main/res
  2. ตั้งชื่อไดเรกทอรี menu
  3. คลิกขวาที่โฟลเดอร์ menu แล้วเลือกใหม่ > ไฟล์
  4. ตั้งชื่อไฟล์ menu.xml
  5. วางโค้ดนี้
<?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">

    <!-- "Locate me", should appear as action button if possible -->
    <item
        android:id="@+id/action_geolocate"
        android:icon="@drawable/ic_geolocate"
        android:title="@string/action_geolocate"
        app:showAsAction="always|withText" />

</menu>

อัปเดตสไตล์แถบแอป

  1. ใน Project Explorer ให้ขยาย Android > app > res > values แล้วเปิดไฟล์ styles.xml ด้านใน
  2. ในแท็ก <style> ให้แก้ไขพร็อพเพอร์ตี้ระดับบนเป็น "Theme.AppCompat.NoActionBar"
  3. จดพร็อพเพอร์ตี้ name ซึ่งคุณจะใช้ในขั้นตอนถัดไป

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

อัปเดตธีมแอปใน AndroidManifest.xml

  1. คลิก Android > app > manifests แล้วเปิดไฟล์ AndroidManifest.xml
  2. ค้นหาบรรทัด android:theme แล้วแก้ไขหรือยืนยันค่าเป็น @style/AppTheme

AndroidManifest.xml

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

ตอนนี้คุณก็พร้อมที่จะเริ่มเขียนโค้ดแล้ว

9. เริ่มต้นแอป

  1. ค้นหาไฟล์ MapsActivity.java ในโปรเจ็กต์เอ็กซ์พลอเรอร์

ซึ่งอยู่ในโฟลเดอร์ที่ตรงกับแพ็กเกจที่คุณสร้างไว้สำหรับแอปในขั้นตอนที่ 1

8b0fa27d417f5f55.png

  1. เปิดไฟล์ แล้วคุณจะอยู่ในโปรแกรมแก้ไขโค้ด Java

นำเข้า Places SDK และการอ้างอิงอื่นๆ

เพิ่มบรรทัดเหล่านี้ที่ด้านบนของ MapsActivity.java โดยแทนที่คำสั่งนำเข้าที่มีอยู่

ซึ่งรวมถึงการนำเข้าที่มีอยู่และเพิ่มการนำเข้าอื่นๆ อีกมากมายที่ใช้ในโค้ดในโค้ดแล็บนี้

MapsActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.model.PlaceLikelihood;
import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest;
import com.google.android.libraries.places.api.net.FindCurrentPlaceResponse;
import com.google.android.libraries.places.api.net.PlacesClient;

import java.util.Arrays;
import java.util.List;

อัปเดตลายเซ็นของชั้นเรียน

Places API ใช้คอมโพเนนต์ AndroidX เพื่อรองรับการทำงานร่วมกับเวอร์ชันก่อนหน้า ดังนั้นคุณจึงต้องกำหนดเพื่อขยาย AppCompatActivity โดยจะแทนที่ส่วนขยาย FragmentActivity ที่กำหนดไว้โดยค่าเริ่มต้นสำหรับกิจกรรมใน Maps

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

เพิ่มตัวแปรของคลาส

จากนั้นประกาศตัวแปรคลาสต่างๆ ที่ใช้ในเมธอดคลาสต่างๆ ซึ่งรวมถึงองค์ประกอบ UI และรหัสสถานะ โดยควรอยู่ใต้การประกาศตัวแปรสำหรับ GoogleMap mMap

    // New variables for Current Place picker
    private static final String TAG = "MapsActivity";
    ListView lstPlaces;
    private PlacesClient mPlacesClient;
    private FusedLocationProviderClient mFusedLocationProviderClient;

    // The geographical location where the device is currently located. That is, the last-known
    // location retrieved by the Fused Location Provider.
    private Location mLastKnownLocation;

    // A default location (Sydney, Australia) and default zoom to use when location permission is
    // not granted.
    private final LatLng mDefaultLocation = new LatLng(-33.8523341, 151.2106085);
    private static final int DEFAULT_ZOOM = 15;
    private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
    private boolean mLocationPermissionGranted;

    // Used for selecting the Current Place.
    private static final int M_MAX_ENTRIES = 5;
    private String[] mLikelyPlaceNames;
    private String[] mLikelyPlaceAddresses;
    private String[] mLikelyPlaceAttributions;
    private LatLng[] mLikelyPlaceLatLngs;

อัปเดตเมธอด onCreate

คุณจะต้องอัปเดตเมธอด onCreate เพื่อจัดการสิทธิ์ของผู้ใช้รันไทม์สำหรับบริการตำแหน่ง ตั้งค่าองค์ประกอบ UI และสร้างไคลเอ็นต์ Places API

เพิ่มบรรทัดโค้ดต่อไปนี้เกี่ยวกับแถบเครื่องมือการดำเนินการ การตั้งค่ามุมมอง และไคลเอ็นต์ Places ไปยังส่วนท้ายของเมธอด onCreate() ที่มีอยู่

MapsActivity.java onCreate()

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //
        
        // Set up the action toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Set up the views
        lstPlaces = (ListView) findViewById(R.id.listPlaces);

        // Initialize the Places client
        String apiKey = getString(R.string.google_maps_key);
        Places.initialize(getApplicationContext(), apiKey);
        mPlacesClient = Places.createClient(this);
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    }

เพิ่มโค้ดสำหรับเมนูแถบแอป

ทั้ง 2 วิธีนี้จะเพิ่มเมนูแถบแอป (ที่มีรายการเดียวคือไอคอนเลือกสถานที่) และจัดการการคลิกไอคอนของผู้ใช้

คัดลอก 2 วิธีนี้ลงในไฟล์หลังวิธี onCreate

MapsActivity.java onCreateOptionsMenu() และ onOptionsItemSelected()

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
           case R.id.action_geolocate:
                
                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the current place picker
                // pickCurrentPlace();
                return true;

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }

ทดสอบ

  1. จาก Android Studio ให้คลิกเรียกใช้หรือเมนูเรียกใช้ > เรียกใช้ "แอป"

28bea91c68c36fb2.png

  1. ระบบจะขอให้คุณเลือกเป้าหมายการติดตั้งใช้งาน โปรแกรมจำลองที่ทำงานอยู่ควรปรากฏในรายการนี้ เลือก แล้ว Android Studio จะติดตั้งใช้งานแอปไปยังโปรแกรมจำลองให้คุณ

f44658ca91f6f41a.png

หลังจากนั้นไม่นาน แอปจะเปิดขึ้น คุณจะเห็นแผนที่ที่อยู่ตรงกลางซิดนีย์ ประเทศออสเตรเลีย พร้อมปุ่มเดียวและรายการสถานที่ที่ไม่มีข้อมูล

68eb8c70f4748350.png

โฟกัสของแผนที่จะไม่ย้ายไปยังตำแหน่งของผู้ใช้ เว้นแต่คุณจะขอสิทธิ์เข้าถึงตำแหน่งของอุปกรณ์

10. ขอและจัดการสิทธิ์เข้าถึงตำแหน่ง

ขอสิทธิ์เข้าถึงตำแหน่งหลังจากที่แผนที่พร้อม

  1. กำหนดเมธอดชื่อ getLocationPermission ที่ขอสิทธิ์จากผู้ใช้

วางโค้ดนี้ใต้ onOptionsSelected เมธอดที่คุณเพิ่งสร้าง

MapsActivity.java getLocationPermission()

    private void getLocationPermission() {
        /*
         * Request location permission, so that we can get the location of the
         * device. The result of the permission request is handled by a callback,
         * onRequestPermissionsResult.
         */
        mLocationPermissionGranted = false;
        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);
        }
    }
  1. เพิ่ม 2 บรรทัดที่ส่วนท้ายของonMapReadyเมธอดที่มีอยู่เพื่อเปิดใช้ตัวควบคุมการซูมและขอสิทธิ์เข้าถึงตำแหน่งจากผู้ใช้

MapsActivity.java onMapReady()

   @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //

        // Enable the zoom controls for the map
        mMap.getUiSettings().setZoomControlsEnabled(true);

        // Prompt the user for permission.
        getLocationPermission();

    }

จัดการผลลัพธ์จากสิทธิ์ที่ขอ

เมื่อผู้ใช้ตอบกลับกล่องโต้ตอบคำขอสิทธิ์ Android จะเรียกใช้การเรียกกลับนี้

วางโค้ดนี้หลังเมธอด getLocationPermission()

MapsActivity.java onRequestPermissionsResult()

   /**
     * Handles the result of the request for location permissions
     */
    @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 cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLocationPermissionGranted = true;
                }
            }
        }
    }

11. รับตำแหน่งปัจจุบันและดึงข้อมูลสถานที่ที่มีแนวโน้ม

เมื่อผู้ใช้คลิกเลือกสถานที่ในแถบแอป แอปจะเรียกใช้เมธอด pickCurrentPlace() ซึ่งจะเรียกใช้เมธอด getDeviceLocation() ที่คุณกำหนดไว้ก่อนหน้านี้ เมธอด getDeviceLocation จะเรียกเมธอดอื่น getCurrentPlaceLikelihoods, หลังจากดึงข้อมูลตำแหน่งล่าสุดของอุปกรณ์

เรียกใช้ findCurrentPlace API และจัดการการตอบกลับ

getCurrentPlaceLikelihoods สร้าง findCurrentPlaceRequest และเรียกใช้ฟังก์ชัน findCurrentPlace ของ Places API หากงานสำเร็จ ระบบจะแสดง findCurrentPlaceResponse ซึ่งมีรายการออบเจ็กต์ placeLikelihood แต่ละรายการมีพร็อพเพอร์ตี้หลายรายการ รวมถึงชื่อและที่อยู่ของสถานที่ และความน่าจะเป็นที่คุณอยู่ในสถานที่นั้น (ค่าแบบ Double จาก 0 ถึง 1) เมธอดนี้จะจัดการการตอบกลับโดยสร้างรายการรายละเอียดสถานที่จาก placeLikelihoods

โค้ดนี้จะวนซ้ำในสถานที่ที่มีแนวโน้มมากที่สุด 5 แห่ง และเพิ่มสถานที่ที่มีแนวโน้มมากกว่า 0 ลงในรายการ จากนั้นจึงแสดงผล หากต้องการแสดงมากกว่าหรือน้อยกว่า 5 รายการ ให้แก้ไขค่าคงที่ M_MAX_ENTRIES

วางโค้ดนี้หลัง onMapReady method

MapsActivity.java getCurrentPlaceLikelihoods()

   private void getCurrentPlaceLikelihoods() {
        // Use fields to define the data types to return.
        List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS,
                Place.Field.LAT_LNG);

        // Get the likely places - that is, the businesses and other points of interest that
        // are the best match for the device's current location.
        @SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
                FindCurrentPlaceRequest.builder(placeFields).build();
        Task<FindCurrentPlaceResponse> placeResponse = mPlacesClient.findCurrentPlace(request);
        placeResponse.addOnCompleteListener(this,
                new OnCompleteListener<FindCurrentPlaceResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<FindCurrentPlaceResponse> task) {
                        if (task.isSuccessful()) {
                            FindCurrentPlaceResponse response = task.getResult();
                            // Set the count, handling cases where less than 5 entries are returned.
                            int count;
                            if (response.getPlaceLikelihoods().size() < M_MAX_ENTRIES) {
                                count = response.getPlaceLikelihoods().size();
                            } else {
                                count = M_MAX_ENTRIES;
                            }

                            int i = 0;
                            mLikelyPlaceNames = new String[count];
                            mLikelyPlaceAddresses = new String[count];
                            mLikelyPlaceAttributions = new String[count];
                            mLikelyPlaceLatLngs = new LatLng[count];

                            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                                Place currPlace = placeLikelihood.getPlace();
                                mLikelyPlaceNames[i] = currPlace.getName();
                                mLikelyPlaceAddresses[i] = currPlace.getAddress();
                                mLikelyPlaceAttributions[i] = (currPlace.getAttributions() == null) ?
                                        null : TextUtils.join(" ", currPlace.getAttributions());
                                mLikelyPlaceLatLngs[i] = currPlace.getLatLng();

                                String currLatLng = (mLikelyPlaceLatLngs[i] == null) ?
                                        "" : mLikelyPlaceLatLngs[i].toString();

                                Log.i(TAG, String.format("Place " + currPlace.getName()
                                        + " has likelihood: " + placeLikelihood.getLikelihood()
                                        + " at " + currLatLng));

                                i++;
                                if (i > (count - 1)) {
                                    break;
                                }
                            }


                            // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                            // Populate the ListView
                            // fillPlacesList();
                        } else {
                            Exception exception = task.getException();
                            if (exception instanceof ApiException) {
                                ApiException apiException = (ApiException) exception;
                                Log.e(TAG, "Place not found: " + apiException.getStatusCode());
                            }
                        }
                    }
                });
    }

ย้ายกล้องแผนที่ไปยังตำแหน่งปัจจุบันของอุปกรณ์

หากผู้ใช้ให้สิทธิ์ แอปจะดึงตำแหน่งล่าสุดของผู้ใช้และย้ายกล้องไปไว้ตรงกลางตำแหน่งนั้น

หากผู้ใช้ปฏิเสธการให้สิทธิ์ แอปจะย้ายกล้องไปยังตำแหน่งเริ่มต้นที่กำหนดไว้ในค่าคงที่ที่จุดเริ่มต้นของหน้านี้ (ในโค้ดตัวอย่างคือซิดนีย์ ออสเตรเลีย)

วางโค้ดนี้หลังเมธอด getPlaceLikelihoods()

MapsActivity.java getDeviceLocation()

    private void getDeviceLocation() {
        /*
         * Get the best and most recent location of the device, which may be null in rare
         * cases when a location is not available.
         */
        try {
            if (mLocationPermissionGranted) {
                Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            // Set the map's camera position to the current location of the device.
                            mLastKnownLocation = task.getResult();
                            Log.d(TAG, "Latitude: " + mLastKnownLocation.getLatitude());
                            Log.d(TAG, "Longitude: " + mLastKnownLocation.getLongitude());
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                    new LatLng(mLastKnownLocation.getLatitude(),
                                            mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
                        } else {
                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                            mMap.moveCamera(CameraUpdateFactory
                                    .newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                        }

                       getCurrentPlaceLikelihoods();
                    }
                });
            }
        } catch (SecurityException e)  {
            Log.e("Exception: %s", e.getMessage());
        }
    }

ตรวจสอบสิทธิ์เข้าถึงตำแหน่งเมื่อผู้ใช้คลิกเลือกสถานที่

เมื่อผู้ใช้แตะเลือกสถานที่ เมธอดนี้จะตรวจสอบสิทธิ์เข้าถึงตำแหน่งและแจ้งให้ผู้ใช้ขอสิทธิ์หากยังไม่ได้รับ

หากผู้ใช้ให้สิทธิ์แล้ว เมธอดจะเรียก getDeviceLocation เพื่อเริ่มกระบวนการรับสถานที่ที่น่าจะใช่ในปัจจุบัน

  1. เพิ่มวิธีการนี้หลังจาก getDeviceLocation() ดังนี้

MapsActivity.java pickCurrentPlace()

   private void pickCurrentPlace() {
        if (mMap == null) {
            return;
        }

        if (mLocationPermissionGranted) {
            getDeviceLocation();
        } else {
            // The user has not granted permission.
            Log.i(TAG, "The user did not grant location permission.");

            // Add a default marker, because the user hasn't selected a place.
            mMap.addMarker(new MarkerOptions()
                    .title(getString(R.string.default_info_title))
                    .position(mDefaultLocation)
                    .snippet(getString(R.string.default_info_snippet)));

            // Prompt the user for permission.
            getLocationPermission();
        }
    }
  1. เมื่อกำหนด pickCurrentPlace แล้ว ให้ค้นหาบรรทัดใน onOptionsItemSelected() ที่เรียกใช้ pickCurrentPlace แล้วยกเลิกการแสดงความคิดเห็น

MapsActivity.java onOptionItemSelected()

           case R.id.action_geolocate:

                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the Current Place picker
                pickCurrentPlace();
                return true;

ทดสอบ

หากคุณเรียกใช้แอปตอนนี้และแตะเลือกสถานที่ แอปควรแจ้งให้ขอสิทธิ์เข้าถึงตำแหน่ง

  • หากอนุญาตสิทธิ์ ระบบจะบันทึกค่ากำหนดนั้นและคุณจะไม่ได้รับข้อความแจ้ง หากปฏิเสธสิทธิ์ คุณจะได้รับข้อความแจ้งในครั้งถัดไปที่แตะปุ่ม
  • แม้ว่า getPlaceLikelihoods จะดึงข้อมูลสถานที่ปัจจุบันที่น่าจะเป็นไปได้แล้ว แต่ ListView ยังไม่แสดงสถานที่เหล่านั้น ใน Android Studio คุณคลิก ⌘6 เพื่อตรวจสอบบันทึกใน Logcat สำหรับคำสั่งที่ติดแท็ก MapsActivity เพื่อยืนยันว่าเมธอดใหม่ทำงานอย่างถูกต้อง
  • หากคุณให้สิทธิ์ บันทึกจะมีข้อความสำหรับ Latitude: และข้อความสำหรับ Longitude: ซึ่งแสดงตำแหน่งที่ตรวจพบของอุปกรณ์ หากคุณใช้ Google Maps และเมนูแบบขยายของโปรแกรมจำลองก่อนหน้านี้เพื่อระบุตำแหน่งสำหรับโปรแกรมจำลอง ข้อความเหล่านี้จะแสดงตำแหน่งดังกล่าว
  • หากการเรียกใช้ findCurrentPlace สำเร็จ บันทึกจะมีคำสั่ง 5 รายการที่พิมพ์ชื่อและตำแหน่งของสถานที่ 5 แห่งที่มีแนวโน้มมากที่สุด

d9896a245b81bf3.png

12. ป้อนข้อมูลในเครื่องมือเลือกสถานที่ปัจจุบัน

ตั้งค่าตัวแฮนเดิลสำหรับสถานที่ที่เลือก

มาดูกันว่าเราต้องการให้เกิดอะไรขึ้นเมื่อผู้ใช้คลิกรายการใน ListView หากต้องการยืนยันว่าผู้ใช้เลือกสถานที่ใดเป็นสถานที่ปัจจุบัน คุณสามารถเพิ่มเครื่องหมายลงในแผนที่ที่สถานที่นั้นได้ หากผู้ใช้คลิกเครื่องหมายดังกล่าว หน้าต่างข้อมูลจะปรากฏขึ้นพร้อมชื่อและที่อยู่ของสถานที่

วางตัวแฮนเดิลการคลิกนี้หลังเมธอด pickCurrentPlace

MapsActivity.java listClickedHandler

    private AdapterView.OnItemClickListener listClickedHandler = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            // position will give us the index of which place was selected in the array
            LatLng markerLatLng = mLikelyPlaceLatLngs[position];
            String markerSnippet = mLikelyPlaceAddresses[position];
            if (mLikelyPlaceAttributions[position] != null) {
                markerSnippet = markerSnippet + "\n" + mLikelyPlaceAttributions[position];
            }

            // Add a marker for the selected place, with an info window
            // showing information about that place.
            mMap.addMarker(new MarkerOptions()
                    .title(mLikelyPlaceNames[position])
                    .position(markerLatLng)
                    .snippet(markerSnippet));

           // Position the map's camera at the location of the marker.
            mMap.moveCamera(CameraUpdateFactory.newLatLng(markerLatLng));
        }
    };

ป้อนข้อมูลใน ListView

เมื่อมีรายการสถานที่ที่ผู้ใช้น่าจะไปในขณะนี้แล้ว คุณก็สามารถแสดงตัวเลือกเหล่านั้นต่อผู้ใช้ใน ListView ได้ คุณยังตั้งค่าListViewเครื่องมือฟังการคลิกให้ใช้ตัวแฮนเดิลการคลิกที่เพิ่งกำหนดได้ด้วย

วางเมธอดนี้หลังตัวแฮนเดิลการคลิก

MapsActivity.java fillPlacesList()

    private void fillPlacesList() {
        // Set up an ArrayAdapter to convert likely places into TextViews to populate the ListView
        ArrayAdapter<String> placesAdapter =
                new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mLikelyPlaceNames);
        lstPlaces.setAdapter(placesAdapter);
        lstPlaces.setOnItemClickListener(listClickedHandler);
    }

ตอนนี้เมื่อกำหนด fillPlacesList แล้ว ให้ค้นหาบรรทัดที่อยู่ใกล้กับส่วนท้ายของ findPlaceLikelihoods ที่เรียกใช้ fillPlacesList แล้วยกเลิกการแสดงความคิดเห็น

MapsActivity.java fillPlaceLikelihoods()

               // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Populate the ListView
                fillPlacesList();

เพียงเท่านี้ก็เป็นโค้ดทั้งหมดที่จำเป็นสำหรับเครื่องมือเลือกสถานที่ปัจจุบันแล้ว

13. เรียกใช้แอป

ทดสอบการเลือกสถานที่

  1. เรียกใช้แอปอีกครั้ง

เมื่อแตะเลือกสถานที่ในครั้งนี้ แอปจะป้อนข้อมูลในรายการด้วยสถานที่ที่มีชื่อซึ่งอยู่ใกล้กับตำแหน่ง ใกล้กับสถานที่นี้ในเมาวีมีร้านค้าอย่าง Ululani's Hawaiian Shave Ice และ Sugar Beach Bake Shop เนื่องจากสถานที่หลายแห่งอยู่ใกล้กับพิกัดตำแหน่งมาก รายการนี้จึงเป็นรายการสถานที่ที่คุณอาจอยู่

  1. คลิกชื่อสถานที่ใน ListView

คุณควรเห็นเครื่องหมายที่เพิ่มลงในแผนที่

  1. แตะเครื่องหมาย

คุณดูรายละเอียดสถานที่ได้

e52303cc0de6a513.png 864c74342fb52a01.png

ทดสอบตำแหน่งอื่น

หากต้องการเปลี่ยนตำแหน่งและใช้โปรแกรมจำลอง ตำแหน่งของอุปกรณ์จะไม่ได้รับการอัปเดตโดยอัตโนมัติเมื่อคุณอัปเดตพิกัดตำแหน่งในเมนูแบบขยายของโปรแกรมจำลอง

หากต้องการหลีกเลี่ยงปัญหานี้ ให้ทำตามขั้นตอนต่อไปนี้เพื่อใช้แอป Google Maps ดั้งเดิมเพื่อบังคับให้อัปเดตตำแหน่งของโปรแกรมจำลอง

  1. เปิด Google Maps
  2. แตะ ... > ตำแหน่ง เพื่อเปลี่ยนละติจูดและลองจิจูดเป็นพิกัดใหม่ แล้วแตะส่ง
  3. เช่น คุณสามารถใช้ละติจูด 49.2768 และลองจิจูด -123.1142 เพื่อตั้งค่าสถานที่เป็นดาวน์ทาวน์แวนคูเวอร์ ประเทศแคนาดา
  4. ตรวจสอบว่า Google Maps ได้จัดกึ่งกลางใหม่ตามพิกัดใหม่แล้ว คุณอาจต้องแตะปุ่มตำแหน่งของฉันในแอป Google Maps เพื่อขอจัดกึ่งกลาง
  5. กลับไปที่แอป Current Place แล้วแตะเลือกสถานที่เพื่อดูแผนที่ในพิกัดใหม่และดูรายการใหม่ของสถานที่ปัจจุบันที่เป็นไปได้

9adb99d1ce25c184.png

เพียงเท่านี้ก็เรียบร้อยแล้ว คุณสร้างแอปง่ายๆ ที่ตรวจสอบสถานที่ในตำแหน่งปัจจุบันและบอกความเป็นไปได้ว่าคุณอยู่ที่ใด ขอให้สนุกกับการรับชมค่ะ

ตอนนี้ให้ไปเรียกใช้แอปที่มีการแก้ไขที่คุณทำเพื่อทำตามขั้นตอนโบนัสนี้ให้เสร็จสมบูรณ์

14. ขั้นตอนถัดไป

คุณต้องรักษาคีย์ API ให้ปลอดภัยเพื่อให้มีเพียงแอป Android ของคุณเท่านั้นที่ใช้คีย์ได้ เพื่อป้องกันการขโมยคีย์ API หากไม่จำกัด ใครก็ตามที่มีคีย์ของคุณจะใช้คีย์ดังกล่าวเพื่อเรียก Google Maps Platform API และทำให้คุณถูกเรียกเก็บเงินได้

รับใบรับรอง SHA-1

คุณจะต้องใช้ข้อมูลนี้ในภายหลังเมื่อจำกัดคีย์ API ต่อไปนี้คือชุดวิธีการในการรับใบรับรองการแก้ไขข้อบกพร่อง

สำหรับ Linux หรือ macOS ให้เปิดหน้าต่างเทอร์มินัลแล้วป้อนข้อมูลต่อไปนี้

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

สำหรับ Windows Vista และ Windows 7 ให้เรียกใช้คำสั่งต่อไปนี้

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

คุณควรเห็นเอาต์พุตในลักษณะนี้

Alias name: androiddebugkey
Creation date: Jan 01, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 4aa9b300
Valid from: Mon Jan 01 08:04:04 UTC 2013 until: Mon Jan 01 18:04:04 PST 2033
Certificate fingerprints:
     MD5:  AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:F9
     SHA1: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75
     Signature algorithm name: SHA1withRSA
     Version: 3

บรรทัดที่ขึ้นต้นด้วย SHA1 จะมีลายนิ้วมือ SHA-1 ของใบรับรอง ลายนิ้วมือคือลำดับของตัวเลขฐานสิบหก 2 หลัก 20 ตัวที่คั่นด้วยเครื่องหมายโคลอน

เมื่อพร้อมที่จะเผยแพร่แอปแล้ว ให้ใช้วิธีการในเอกสารประกอบนี้เพื่อดึงใบรับรองรุ่น

เพิ่มข้อจำกัดให้แก่คีย์ API

  1. ใน Cloud Console ให้ไปที่ API และบริการ > ข้อมูลเข้าสู่ระบบ

คีย์ที่คุณใช้สำหรับแอปนี้ควรแสดงอยู่ในส่วนคีย์ API

  1. คลิก 6454a04865d551e6.png เพื่อแก้ไขการตั้งค่าคีย์

316b052c621ee91c.png

  1. ในหน้าคีย์ API ให้ตั้งค่าการจำกัดแอปพลิเคชันหลังจากการจำกัดคีย์โดยทำดังนี้
  2. เลือกแอป Android แล้วทำตามวิธีการ
  3. คลิกเพิ่มรายการ
  4. ป้อนชื่อแพ็กเกจและลายนิ้วมือของใบรับรอง SHA-1 (ดึงข้อมูลในส่วนก่อนหน้า)

เช่น

com.google.codelab.currentplace
BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75s
  1. ตั้งค่าการจำกัด API โดยทำดังนี้เพื่อเพิ่มการป้องกัน
  2. หลังจากการจำกัด API ให้เลือกจำกัดคีย์
  3. เลือก Maps SDK สำหรับ Android และ Places API
  4. คลิกเสร็จสิ้น แล้วคลิกบันทึก

15. ขอแสดงความยินดี

คุณสร้างแอปง่ายๆ ที่ตรวจสอบสถานที่ที่มีแนวโน้มมากที่สุดในตำแหน่งปัจจุบัน และเพิ่มเครื่องหมายลงในแผนที่สำหรับสถานที่ที่ผู้ใช้เลือก

ดูข้อมูลเพิ่มเติม