สร้างเครื่องมือเลือกสถานที่ปัจจุบันสําหรับ 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 &gt ตรวจหาอัปเดต...

ไฟล์ 1f36bae83b64e33.png

ห้องทดลองนี้เขียนขึ้นโดยใช้ Android Studio 3.4

Android SDK

ใน Android Studio คุณกําหนดค่า SDK ที่ต้องการได้โดยใช้ SDK ผู้จัดการ ห้องทดลองนี้ใช้ Android Q SDK

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

D3fa03c269ec231c.png

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

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

884e0aa1314f70d.png

บริการ Google Play

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

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

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

ad6211fd78f3b629.png

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

หากต้องการเรียกใช้แอป คุณจะเชื่อมต่ออุปกรณ์ของตัวเองหรือใช้โปรแกรมจําลอง Android ก็ได้

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

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

  1. จากหน้าจอต้อนรับของ Android Studio ให้คลิกกําหนดค่า &gt เครื่องมือจัดการ AVD

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 สําหรับเมืองคีไฮ เมาอิ ในฮาวาย เพื่อจําลองผลจาก Codelab นี้)

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

F9576B35218f4187.png

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

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

หากใช้อุปกรณ์ Android จริง ให้ทําตามขั้นตอนต่อไปนี้

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

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

โฆษณา 16cdb975b5c3f7.png baf0379ef8a9c88c.png

4. สร้าง Shell ของแอปด้วยกิจกรรม Google Maps

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

c9c80aa8211a8761.png

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

นี่คือการตั้งค่าสําหรับแอปชื่อว่า "สถานที่ปัจจุบัน" ซึ่งสอดคล้องกับแพ็กเกจ com.google.codelab.currentplace

ไฟล์ 37f5b93b94ee118c.png

  1. เลือก Java เป็นภาษาและเลือก ใช้อาร์ติแฟกต์ androidx*

แล้วเก็บการตั้งค่าที่เหลือไว้เป็นค่าเริ่มต้น

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

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

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

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

f3043429cf719c47.png

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

build.gradle (โมดูล: แอป)

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 API และรับคีย์ API

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

ตั้งค่า Google Maps Platform

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

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

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

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

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

aa576e551a7a1009.png

กําหนดค่าแอปแล้ว

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

  1. ในโปรแกรมสํารวจโปรเจ็กต์ ให้เปิดไฟล์ activity_maps.xml ใน Android &gt app และ gt; res > layout

4e0d986480c57efa.png

  1. & เลือกข้อความ และแทนที่เนื้อหาทั้งหมดของไฟล์เลย์เอาต์ด้วยสิ่งต่อไปนี้

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 แล้วเลือก New > Image Asset

Asset Studio จะเปิดขึ้น

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

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

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

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

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

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

  1. คลิกตกลง &gt ถัดไป &gt เสร็จสิ้น แล้วยืนยันว่ามีโฟลเดอร์ใหม่ชื่อ drawable ที่มีไฟล์ไอคอนใหม่

b9e0196137ed18ae.png

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

  1. ใน 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 แล้วเลือก New > Directory เพื่อสร้างไดเรกทอรีย่อยใหม่ภายใต้ 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. ในโปรแกรมสํารวจโปรเจ็กต์ ให้ขยาย 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 ใน Explorer ของโปรเจ็กต์

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

8b0fa27d417f5f55.png

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

นําเข้า SDK ของ Places และทรัพยากร Dependency อื่นๆ

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

โดยจะมีการนําเข้าที่มีอยู่และเพิ่มอีกหลายรายการที่ใช้ในโค้ดใน Codelab นี้

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 ที่กําหนดไว้โดยค่าเริ่มต้นสําหรับกิจกรรมแผนที่

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);
    }

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

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

คัดลอกทั้งสองวิธีนี้ไปยังไฟล์หลังเมธอด 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 ใน MapReady()

   @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 onRequestPermissionResult()

   /**
     * 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 และเรียกงาน Places API findCurrentPlace ได้ หากงานนั้นสําเร็จ งานจะส่งคืน findCurrentPlaceResponse ซึ่งมีรายการออบเจ็กต์ placeLikelihood แต่ละรายการจะมีพร็อพเพอร์ตี้จํานวนหนึ่ง ซึ่งรวมถึงชื่อและที่อยู่ของสถานที่ ตลอดจนความน่าจะเป็นที่คุณจะอยู่ในสถานที่นั้น (ค่าตั้งแต่ 0 ถึง 1) วิธีนี้จะจัดการคําตอบด้วยการสร้างรายการรายละเอียดของสถานที่จาก placeLikelihoods

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

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

MapsActivity.java getCurrentPlaceLikelidoms()

   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 selectCurrentPlace()

   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 ได้ คุณยังสามารถตั้งค่า Listener การคลิก 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 FillPlaceLikelidoms()

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

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

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

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

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

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

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

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

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

คุณจะเห็นรายละเอียดสถานที่

e52303cc0de6a513.png 864c74342fb52a01.png

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

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

หากต้องการหลีกเลี่ยงขั้นตอนเหล่านี้ ให้ทําตามขั้นตอนต่อไปนี้เพื่อใช้แอป Google Maps แบบเนทีฟเพื่อบังคับให้อัปเดตตําแหน่งของโปรแกรมจําลอง&#39:

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

9adb99d1ce25c184.png

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

ทีนี้ก็เริ่มต้นใช้งานแอปเวอร์ชันดัดแปลงด้วยการทําตามขั้นตอนพิเศษนี้ได้เลย

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

หากต้องการรักษาความปลอดภัยให้คีย์ API ของคุณ คุณต้องรักษาความปลอดภัยเพื่อให้คีย์ของแอป Android เท่านั้นที่ใช้ได้ หากไม่จํากัดไว้ ใครก็ตามที่ใช้คีย์ของคุณจะใช้เรียก 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 ของใบรับรอง ลายนิ้วมือคือลําดับเลขฐานสิบหก 20 หลักที่คั่นด้วยโคลอน

เมื่อพร้อมเปิดตัวแอปแล้ว ให้ใช้วิธีการในเอกสารนี้เพื่อเรียกข้อมูลใบรับรองรุ่น

เพิ่มข้อจํากัดลงในคีย์ API

  1. ใน Cloud Console ให้ไปที่ API & &; Services > Credentials

คีย์ที่คุณใช้สําหรับแอปนี้ควรอยู่ในคีย์ 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. ยินดีด้วย

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

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