Places SDK for Android(Kotlin)を使ってみる

1. 始める前に

この Codelab では、Places SDK for Android をアプリに統合し、Places SDK の各機能を使用する方法について説明します。

プレイス デモアプリ

要件

  • Kotlin と Android の開発に関する基本的な知識

学習する内容

  • Kotlin 拡張機能を使って Places SDK for Android をインストールする方法
  • 特定の場所の Place Details を読み込む方法
  • Place Autocomplete ウィジェットをアプリに追加する方法
  • デバイスで現在報告されている位置に基づいて、Current Place を読み込む方法

必要なもの

この Codelab を実行するには、次のアカウント、サービス、ツールが必要です。

2. 準備

以下の有効化の手順では、Places API を有効にします。

Google Maps Platform を設定する

課金を有効にした Google Cloud Platform アカウントとプロジェクトをまだ作成していない場合は、Google Maps Platform スタートガイドに沿って請求先アカウントとプロジェクトを作成してください。

  1. Cloud Console で、プロジェクトのプルダウン メニューをクリックし、この Codelab に使用するプロジェクトを選択します。

  1. Google Cloud Marketplace で、この Codelab に必要な Google Maps Platform API と SDK を有効にします。詳しい手順については、こちらの動画またはドキュメントをご覧ください。
  2. Cloud Console の [認証情報] ページで API キーを生成します。詳しい手順については、こちらの動画またはドキュメントをご覧ください。Google Maps Platform へのすべてのリクエストで API キーが必要になります。

3. クイック スタート

できるだけ早く演習を開始できるように、この Codelab で使用できるスターター コードをダウンロードできます。すぐに次のステップに進んでも問題ありませんが、ご自身で構築するためのすべての手順を確認したい場合は、最後までお読みください。

  1. git がインストールされている場合は、リポジトリのクローンを作成します。
git clone https://github.com/googlemaps/codelab-places-101-android.git

あるいは、このボタンをクリックしてソースコードをダウンロードします。

  1. コードをダウンロードしたら、Android Studio の /starter ディレクトリにあるプロジェクトを開きます。このプロジェクトには、この Codelab の実行に必要な基本的なファイル構造が含まれています。作業対象のすべてのコンポーネントは /starter ディレクトリにあります。

ソリューション コード全体の動作を確認するには、/solution ディレクトリで最終的なコードをご確認ください。

4. Places SDK for Android をインストールする

このセクションでは、アプリの依存関係に Places SDK for Android を追加します。

API キーを追加する

Places SDK for Android で API キーがアプリに関連付けられるように、先ほど作成した API キーをアプリに渡します。

  1. プロジェクトのルート ディレクトリ(gradle.propertiessettings.gradle と同じレベル)で local.properties というファイルを開きます。
  2. 新しい API キー GOOGLE_MAPS_API_KEY を定義し、作成した API キーにその値を設定します。

local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

local.properties は、Git リポジトリの .gitignore ファイルに含まれています。これは、API キーが機密情報と見なされ、ソース コントロールにはできるだけチェックインしないことが推奨されるからです。

  1. 次に、アプリ全体で使用できるように API キーを公開するには、app/ ディレクトリにあるアプリの build.gradle ファイルに Android 用 Secrets Gradle プラグインを含め、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 ファイル内で定義したキーが、ビルド時に Android マニフェスト ファイル内でビルド変数として、および Gradle で生成された BuildConfig クラスの変数として使えるようになります。また、アプリ全体でアクセスできるように local.properties からプロパティを読み込むために必要となるボイラープレート コードが削除されます。

Places SDK for Android の依存関係を追加する

  1. アプリ内で API キーにアクセスできるようになったので、Places SDK for Android の依存関係をアプリの build.gradle ファイルに追加します。

この Codelab に含まれるスターター プロジェクトでは、この依存関係がすでに追加されています。

アプリレベルの build.gradle

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. アプリを実行します。

これで、アプリで空白の画面が表示されるようになります。以降の手順を実施すると、この画面には 3 つのデモが表示されます。

5. Places Android KTX をインストールする

Kotlin アプリで 1 つ以上の Google Maps Platform Android SDK を使用している場合、Kotlin 拡張機能(KTX)ライブラリを使用すると、コルーチンや、拡張プロパティまたは拡張関数などの Kotlin 言語機能を利用できます。各 Google Maps SDK には、以下に示すように、対応する KTX ライブラリがあります。

Google Maps Platform KTX の図

このタスクでは、Places Android KTX ライブラリを使って、アプリで Kotlin 固有の言語機能を使用します。

Places Android KTX の依存関係を追加する

Kotlin 固有の機能を活用するには、アプリレベルの build.gradle ファイルに、この SDK に対応する KTX ライブラリを含めます。

build.gradle

dependencies {
    // ...

    // Places SDK for Android KTX Library
    implementation 'com.google.maps.android:places-ktx:2.0.0'
}

6 Places クライアントを初期化する

アプリケーション スコープの Places SDK を初期化する

app/src/main/java/com/google/codelabs/maps/placesdemo フォルダの DemoApplication.kt ファイル内で、Places SDK for Android を初期化します。onCreate 関数の最後に以下の行を貼り付けます。

        // Initialize the SDK with the Google Maps Platform API key
        Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)

アプリをビルドすると、Android 用 Secrets Gradle プラグインによって、local.properties ファイル内の API キーが BuildConfig.GOOGLE_MAPS_API_KEY として使える状態になります。

アプリケーション ファイルをマニフェストに追加する

DemoApplicationApplication を拡張したので、マニフェストを更新する必要があります。app/src/main にある AndroidManifest.xml ファイルの application 要素に android:name プロパティを追加します。

    <application
        android:name=".DemoApplication"
        ...
    </application>

このコードでは、アプリ マニフェストで src/main/java/com/google/codelabs/maps/placesdemo/ フォルダ内の DemoApplication クラスが参照されます。

7. Place Details を取得する

Details 画面を作成する

app/src/main/res/layout/ フォルダには、LinearLayout が空の activity_details.xml レイアウトがあります。<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" />

このコードでは、ユーザーが場所 ID を入力したり、指定されたデフォルトを使用したりするテキスト入力フィールドや、Place Details リクエストを開始するボタン、レスポンスからの情報を表示する TextView が追加されます。関連付けられた文字列は、src/main/res/values/strings.xml ファイルで定義されます。

Details アクティビティを作成する

  1. src/main/java/com/google/codelabs/maps/placesdemo/ フォルダに DetailsActivity.kt ファイルを作成し、先ほど作成したレイアウトに関連付けます。以下のコードをファイルに貼り付けます。
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. このアクティビティで使用するプレイス クライアントを作成します。onCreate 関数のビュー オブジェクト設定の後に以下のコードを貼り付けます。
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. プレイス クライアントを設定したら、クリック リスナーをボタンに追加します。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
                }
            }
        }

このコードでは、入力フィールドに入力された場所 ID の取得や、場所に関してリクエストするフィールドの定義、FetchPlaceRequest の作成、タスクの開始、成功または失敗のリッスンを行います。リクエストが成功した場合、関数によって、リクエストされた詳細が TextView に入力されます。

  1. 拡張関数を定義して、FetchPlaceResponse をテキストに変換します。StringUtil.kt ファイルを使用すると、Places SDK のレスポンスを人が読んで理解できる文字列に簡単に変換できます。

DetailsActivity.kt ファイルの末尾に、Fetch Place レスポンス オブジェクトを文字列に変換する関数を定義します。

fun FetchPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

Details アクティビティをマニフェストに追加する

app/src/main にある AndroidManifest.xml ファイルに、DetailsActivity<activity> 要素を <application> 要素の子要素として追加します。

        <activity android:name=".DetailsActivity" />

Details アクティビティをデモメニューに追加する

空の Demo モジュールを使用すると、ホーム画面で利用可能なデモを一覧表示できます。Place Details アクティビティを作成したので、以下のコードを使って、それを src/main/java/com/google/codelabs/maps/placesdemo/ フォルダの Demo.kt ファイルに追加します。

    DETAILS_FRAGMENT_DEMO(
        R.string.details_demo_title,
        R.string.details_demo_description,
        DetailsActivity::class.java
    ),

関連付けられた文字列は、src/main/res/values/strings.xml ファイルで定義されます。

MainActivity.kt を調べて、Demo モジュールのコンテンツを反復処理して入力された ListView が作成されていることを確認します。ユーザーがリスト内の項目をタップすると、クリック リスナーによって、関連するアクティビティが開かれます。

アプリを実行する

  1. アプリを実行します。今回は、Place Details のデモを示すリストの項目が 1 つ表示されます。
  2. Place Details のテキストをタップします。作成したビューに入力フィールドとボタンが表示されます。
  3. [GET DETAILS] ボタンをタップします。デフォルトの場所 ID を使用した場合は、図 1 に示すように、場所の名前、住所、地図の座標が表示されます。

Place Details アクティビティとレスポンス

図 1. レスポンスが表示された Place Details アクティビティ

8. Place Autocomplete を追加する

Autocomplete 画面を作成する

app/src/main/res/layout/ フォルダには、LinearLayout が空の activity_autocomplete.xml レイアウトが用意されています。<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 ファイルで定義されます。

Autocomplete アクティビティを作成する

  1. src/main/java/com/google/codelabs/maps/placesdemo/ フォルダに AutocompleteActivity.kt ファイルを作成し、以下のコードで定義します。
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
    }
}

このコードでは、レイアウト ファイルで定義したビューと 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 Autocomplete ウィジェットを使用する際に、個別に Place Details リクエストを行う必要はありません。

Autocomplete アクティビティをマニフェストに追加する

app/src/main にある AndroidManifest.xml ファイルに、AutocompleteActivity<activity> 要素を <application> 要素の子要素として追加します。

        <activity android:name=".AutocompleteActivity" />

Autocomplete アクティビティをデモメニューに追加する

これまでと同様、Place Autocomplete のデモを Demo モジュールのリストに追加して、ホーム画面に追加します。Place Autocomplete アクティビティを作成したので、それを src/main/java/com/google/codelabs/maps/placesdemo/ フォルダの Demo.kt ファイルに追加します。以下のコードを 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. [Place Autocomplete] 行をタップします。図 2 のように、Place Autocomplete の入力ポップアップが表示されます。
  3. 場所の名前(施設名、住所、または地域など)を入力します。入力を開始すると、候補が表示されます。
  4. 候補のいずれかを選択します。図 3 に示すように、候補の表示が消え、選択された場所に関する詳細情報が TextView に表示されます。

ユーザーが入力フィールドをタップした後の Autocomplete アクティビティ

図 2. ユーザーが入力フィールドをタップした後の Autocomplete アクティビティ

ユーザーが「Niagara Falls」と入力および選択した後の Autocomplete アクティビティ

図 3. ユーザーが「Niagara Falls」と入力および選択した後で Place Details が表示された Autocomplete アクティビティ

9. デバイスの Current Place を取得する

Current Place 画面を作成する

app/src/main/res/layout/ フォルダには、LinearLayout が空の activity_current.xml レイアウトが用意されています。<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" />

Current Place アクティビティを作成する

  1. src/main/java/com/google/codelabs/maps/placesdemo/ フォルダに CurrentActivity.kt ファイルを作成し、以下のコードで定義します。
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()
        }
    }
}

このコードでは、レイアウト ファイルで定義したビューにアクティビティが関連付けられます。また、ボタンがクリックされたときに 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. checkPermissionThenFindCurrentPlace 関数の else ブランチで requestPermissions が呼び出されると、アプリでは、ユーザーに対して利用許可リクエスト ダイアログが表示されます。デバイスで Android 12 より前の OS が実行されている場合、ユーザーが付与できるのは、正確な(精度の高い)位置情報の利用許可のみです。デバイスに Android 12 以降が搭載されている場合は、図 4 に示すように、正確な(精度の高い)位置情報ではなく、おおよその(精度の低い)位置情報を提供するオプションがユーザーに表示されます。

Android 12 以降を搭載したデバイスでのユーザー権限のリクエスト

図 4. Android 12 以降を搭載したデバイスでユーザー権限をリクエストすると、正確な位置情報またはおおよその位置情報を付与するオプションが表示されます。

ユーザーがシステム権限ダイアログに応答すると、システムでは、アプリの onRequestPermissionsResult の実装が呼び出され、利用許可ダイアログへのユーザー レスポンスと、定義したリクエスト コードが渡されます。checkPermissionThenFindCurrentPlace の下に以下のコードを貼り付けて、onRequestPermissionResult をオーバーライドして、この Current Place のアクティビティに関連する位置情報の利用許可のリクエスト コードを処理します。

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

Current Place アクティビティをマニフェストに追加する

app/src/main にある AndroidManifest.xml ファイルに、CurrentPlaceActivity<activity> 要素を <application> 要素の子要素として追加します。

        <activity android:name=".CurrentPlaceActivity" />

Current Place アクティビティをデモメニューに追加する

これまでと同様、Current Place のデモを Demo モジュールのリストに追加して、ホーム画面に追加します。Current Place アクティビティを作成したので、それを src/main/java/com/google/codelabs/maps/placesdemo/ フォルダの Demo.kt ファイルに追加します。以下のコードを 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. アプリを実行します。今回は、ホーム画面のリストに 3 個の項目が表示されます。
  2. [Current Place] 行をタップします。画面にボタンが表示されます。
  3. ボタンをタップします。これまでに位置情報の利用許可をこのアプリに付与したことがない場合は、利用許可リクエストが表示されます。
  4. デバイスの位置情報の利用許可をアプリに付与します。
  5. ボタンをもう一度タップします。今回は、図 5 に示すように、付近の場所(最大 20 か所)とその尤度のリストが表示されます。

デバイスによって報告された位置情報と一致する Current Place の候補の表示

図 5. デバイスによって報告された位置情報と一致する Current Place の候補の表示

10. 完了

Places SDK for Android を使用して Android アプリが正常に作成されました。

学習した内容

次のステップ

  • android-places-demos GitHub リポジトリのサンプルとデモを詳しく確認またはフォークします。
  • Google Maps Platform で Android アプリをビルドするためのその他の Kotlin Codelab を確認します。
  • 皆様のお役に立つコンテンツをご提供できるよう、以下のアンケートにご協力ください。

他にどのような Codelab をご希望ですか。

地図上のデータの可視化 地図のスタイルのカスタマイズの詳細 地図上に 3D インタラクションを構築する

ご希望の Codelab が上記にない場合、こちらからリクエストしてください