この Codelab は、Kotlin を使った高度な Android 開発コースの一部です。Codelab を順番に進めると、このコースを最大限に活用できますが、これは必須ではありません。コースの Codelab はすべて、Kotlin を使った高度な Android 開発の Codelab ランディング ページに記載されています。
Google マップを使用してアプリを構築すると、航空写真、地図用の堅牢な UI コントロール、位置情報追跡、位置マーカーなどの機能をアプリに追加できます。有名な釣り場や登山エリアの場所など、独自のデータセットの情報を表示することで、標準の Google マップに価値を追加できます。宝探しや拡張現実ゲームのように、プレーヤーが現実世界を探索するゲームを作成することもできます。
このレッスンでは、カスタマイズされた地図を表示し、ユーザーの現在地を表示する Wander という Google マップアプリを作成します。
前提条件
以下の知識が必要です。
- Android Studio を使用して基本的な Android アプリを作成して実行する方法。
- 文字列などのリソースを作成して管理する方法。
- Android Studio を使用してコードをリファクタリングし、変数の名前を変更する方法。
- Google マップをユーザーとして使用する方法。
- ランタイム権限を設定する方法。
学習内容
- Google API Console から API キーを取得してアプリに登録する方法
- アプリに Google マップを統合する方法
- さまざまな地図の種類を表示する方法
- Google マップのスタイルを設定する方法
- 地図にマーカーを追加する方法
- ユーザーがスポット(POI)にマーカーを配置できるようにする方法
- 位置情報の記録を有効にする方法
- Google マップが埋め込まれた
Wander
アプリを作成する方法 - マーカーやスタイル設定など、アプリのカスタム機能を作成する方法
- アプリで位置情報のトラッキングを有効にする方法
この Codelab では、カスタム スタイルで Google マップを表示する Wander
アプリを作成します。Wander アプリでは、場所にマーカーをドロップしたり、オーバーレイを追加したり、現在地をリアルタイムで確認したりできます。
Maps SDK for Android には API キーが必要です。API キーを取得するには、[API とサービス] ページでプロジェクトを登録します。API キーは、アプリをその作成者に関連付けるデジタル証明書に関連付けられています。デジタル証明書の使用とアプリへの署名について詳しくは、アプリへの署名をご覧ください。
この Codelab では、デバッグ証明書の API キーを使用します。デバッグビルドに署名するで説明されているように、デバッグ用証明書は設計上安全ではありません。Maps SDK for Android を使用する公開済みの Android アプリには、リリース証明書のキーという 2 つ目の API キーが必要です。リリース証明書の取得について詳しくは、API キーを取得するをご覧ください。
Android Studio には、便利なテンプレート コードを生成する Google Maps Activity テンプレートが含まれています。テンプレート コードには、API キーの取得を簡素化するリンクを含む google_maps_api.xml ファイルが含まれています。
ステップ 1: 地図テンプレートを使用して Wander プロジェクトを作成する
- 新しい Android Studio プロジェクトを作成します。
- [Google Maps Activity] テンプレートを選択します。
- プロジェクトに
Wander
という名前を付けます。 - 最小 API レベルを API 19 に設定します。言語が Kotlin になっていることを確認します。
- [完了] をクリックします。
- アプリのビルドが完了したら、プロジェクトと、Android Studio が作成した次のマップ関連ファイルを確認します。
google_maps_api.xml - この構成ファイルを使用して API キーを保持します。このテンプレートは、デバッグ用とリリース用の 2 つの google_maps_api.xml ファイルを生成します。デバッグ証明書の API キーのファイルは src/debug/res/values にあります。リリース用証明書の API キーのファイルは src/release/res/values にあります。この Codelab では、デバッグ証明書のみを使用します。
activity_maps.xml - このレイアウト ファイルには、画面全体を埋める単一のフラグメントが含まれています。SupportMapFragment
クラスは Fragment
クラスのサブクラスです。SupportMapFragment
は、アプリに地図を配置する最も簡単な方法です。地図のビューをラップし、必要なライフサイクルを自動的に処理します。
SupportMapFragment
は、ViewGroup
の <fragment>
タグで、追加の name
属性とともにレイアウト ファイルに含めることができます。
android:name="com.google.android.gms.maps.SupportMapFragment"
MapsActivity.java - MapsActivity.kt ファイルは、onCreate()
メソッドで SupportMapFragment
をインスタンス化し、クラスの getMapAsync
()
を使用して、地図システムとビューを自動的に初期化します。SupportMapFragment
を含むアクティビティは、OnMapReadyCallback
インターフェースとそのインターフェースの onMapReady()
メソッドを実装する必要があります。地図が読み込まれると、onMapReady()
メソッドが呼び出されます。
ステップ 2: API キーを取得する
- google_maps_api.xml ファイルのデバッグ バージョンを開きます。
- ファイルで、長い URL を含むコメントを探します。URL のパラメータには、アプリに関する具体的な情報が含まれます。
- URL をコピーしてブラウザに貼り付けます。
- プロンプトに従って、[API とサービス] ページでプロジェクトを作成します。指定された URL のパラメータにより、ページは Maps SDK for Android を自動的に有効にすることを認識します。
- [API キーを作成] をクリックします。
- 次のページで、[API キー] セクションに移動し、作成したキーをクリックします。
- [キーを制限] をクリックし、[Maps SDK for Android] を選択して、キーの使用を Android アプリに制限します。
- 生成された API キーをコピーします。「
AIza"
」で始まります。 google_maps_api.xml
ファイルで、YOUR_KEY_HERE
と書かれているgoogle_maps_key
文字列に鍵を貼り付けます。- アプリを実行します。アクティビティに埋め込まれた地図が表示され、オーストラリアのシドニーにマーカーが設定されます。(シドニーのマーカーはテンプレートの一部であり、後で変更します)。
ステップ 3: mMap の名前を変更する
MapsActivity
には、mMap
という名前のプライベート lateinit
var
があります。これは GoogleMap
型です。Kotlin の命名規則に従って、mMap
の名前を map
に変更します。
MapsActivity
で、mMap
を右クリックし、[Refactor] > [Rename...] をクリックします
- 変数名を
map
に変更します。
onMapReady()
関数の mMap
へのすべての参照も map
に変更されます。
Google マップには、標準、地図 + 写真、航空写真、地形、なし(地図をまったく表示しない)の 5 種類の地図タイプがあります。
標準の地図 | 航空写真地図 | ハイブリッド地図 | 地形地図 |
地図の種類ごとに、異なる種類の情報が表示されます。たとえば、車でナビゲーションに地図を使用する場合は、道路名が表示されると便利なので、[標準] オプションを使用できます。ハイキングの際は、地形図が山頂までの残り距離を把握するのに役立ちます。
このタスクでは、次のことを行います。
- ユーザーが地図の種類を変更できるオプション メニューを含むアプリバーを追加します。
- 地図の開始位置を自宅の位置に移動します。
- 地図上の単一の場所を示し、ラベルを含めることができるマーカーのサポートを追加します。
地図の種類のメニューを追加
このステップでは、ユーザーが地図の種類を変更できるオプション メニューを含むアプリバーを追加します。
- 新しいメニュー XML ファイルを作成するには、res ディレクトリを右クリックして、[New] > [Android Resource File] を選択します。
- ダイアログで、ファイル名を
map_options
とします。 - リソースタイプとして [メニュー] を選択します。
- [OK] をクリックします。
- [コード] タブで、新しいファイル内のコードを次のコードに置き換えて、地図のメニュー オプションを作成します。「none」マップタイプは、マップがまったく表示されないため、省略されています。このステップではエラーが発生しますが、次のステップで解決します。
<?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">
<item
android:id="@+id/normal_map"
android:title="@string/normal_map"
app:showAsAction="never" />
<item
android:id="@+id/hybrid_map"
android:title="@string/hybrid_map"
app:showAsAction="never" />
<item
android:id="@+id/satellite_map"
android:title="@string/satellite_map"
app:showAsAction="never" />
<item
android:id="@+id/terrain_map"
android:title="@string/terrain_map"
app:showAsAction="never" />
</menu>
strings.xml
で、title
属性のリソースを追加してエラーを解決します。
<resources>
...
<string name="normal_map">Normal Map</string>
<string name="hybrid_map">Hybrid Map</string>
<string name="satellite_map">Satellite Map</string>
<string name="terrain_map">Terrain Map</string>
<string name="lat_long_snippet">Lat: %1$.5f, Long: %2$.5f</string>
<string name="dropped_pin">Dropped Pin</string>
<string name="poi">poi</string>
</resources>
MapsActivity
で、onCreateOptionsMenu()
メソッドをオーバーライドし、map_options
リソース ファイルからメニューをインフレートします。
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.map_options, menu)
return true
}
MapsActivity.kt
で、onOptionsItemSelected()
メソッドをオーバーライドします。地図の種類の定数を使用して地図の種類を変更し、ユーザーの選択を反映します。
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
// Change the map type based on the user's selection.
R.id.normal_map -> {
map.mapType = GoogleMap.MAP_TYPE_NORMAL
true
}
R.id.hybrid_map -> {
map.mapType = GoogleMap.MAP_TYPE_HYBRID
true
}
R.id.satellite_map -> {
map.mapType = GoogleMap.MAP_TYPE_SATELLITE
true
}
R.id.terrain_map -> {
map.mapType = GoogleMap.MAP_TYPE_TERRAIN
true
}
else -> super.onOptionsItemSelected(item)
}
- アプリを実行します。
をクリックして、地図の種類を変更します。モードによって地図の外観がどのように変化するかを確認してください。
デフォルトでは、onMapReady()
コールバックには、Google マップが作成されたオーストラリアのシドニーにマーカーを配置するコードが含まれています。デフォルトのコールバックでは、地図をアニメーションでシドニーにパンします。
このタスクでは、地図のカメラを自宅に移動し、指定したレベルまでズームして、マーカーを配置します。
ステップ 1: 自宅にズームしてマーカーを追加する
MapsActivity.kt
ファイルで、onMapReady()
メソッドを見つけます。シドニーにマーカーを配置してカメラを移動するコードを削除します。メソッドは次のようになります。
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
}
- こちらの手順に沿って、自宅の緯度と経度を確認します。
- 緯度と経度の値を作成し、それぞれの浮動小数点値を入力します。
val latitude = 37.422160
val longitude = -122.084270
homeLatLng
という名前の新しいLatLng
オブジェクトを作成します。homeLatLng
オブジェクトで、作成した値を渡します。
val homeLatLng = LatLng(latitude, longitude)
- 地図のズームレベルを指定する
val
を作成します。ズームレベル 15f を使用します。
val zoomLevel = 15f
ズームレベルは、地図の拡大率を制御します。次のリストは、各ズームレベルで表示されるおおよその詳細度を示しています。
1
: 世界5
: 大陸10
: 都市15
: 通り20
: 建物
map
オブジェクトでmoveCamera()
関数を呼び出し、CameraUpdateFactory.newLatLngZoom()
を使用してCameraUpdate
オブジェクトを渡すことで、カメラをhomeLatLng
に移動します。homeLatLng
オブジェクトとzoomLevel
を渡します。
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
homeLatLng
の地図にマーカーを追加します。
map.addMarker(MarkerOptions().position(homeLatLng))
完成したメソッドは次のようになります。
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
//These coordinates represent the latitude and longitude of the Googleplex.
val latitude = 37.422160
val longitude = -122.084270
val zoomLevel = 15f
val homeLatLng = LatLng(latitude, longitude)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
map.addMarker(MarkerOptions().position(homeLatLng))
}
- アプリを実行します。地図が自宅に移動し、目的のレベルにズームして、自宅にマーカーが配置されます。
ステップ 2: 長押しでマーカーを追加できるようにする
このステップでは、ユーザーが地図上の場所を長押ししたときにマーカーを追加します。
MapsActivity
に、GoogleMap
を引数として受け取るsetMapLongClick()
というメソッド スタブを作成します。setOnMapLongClickListener
リスナーを地図オブジェクトにアタッチします。
private fun setMapLongClick(map:GoogleMap) {
map.setOnMapLongClickListener { }
}
setOnMapLongClickListener()
で、addMarker()
メソッドを呼び出します。位置が渡されたLatLng
に設定された新しいMarkerOptions
オブジェクトを渡します。
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
onMapReady()
メソッドの最後で、map
を使用してsetMapLongClick()
を呼び出します。
override fun onMapReady(googleMap: GoogleMap) {
...
setMapLongClick(map)
}
- アプリを実行します。
- 地図を長押しして、その場所にマーカーを配置します。
- マーカーをタップすると、画面の中央に表示されます。
ステップ 3: マーカーの情報ウィンドウを追加する
このステップでは、マーカーがタップされたときにマーカーの座標を表示する InfoWindow
を追加します。
setMapLongClick()setOnMapLongClickListener()
で、snippet
のval
を作成します。スニペットは、タイトルの後に表示される追加のテキストです。スニペットにマーカーの緯度と経度が表示されます。
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
// A snippet is additional text that's displayed after the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
addMarker()
で、R.string.
dropped_pin
文字列リソースを使用して、マーカーのtitle
を Dropped Pin に設定します。- マーカーの
snippet
をsnippet
に設定します。
完成した関数は次のようになります。
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
// A Snippet is Additional text that's displayed below the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet)
)
}
}
- アプリを実行します。
- 地図を長押しして位置マーカーをドロップします。
- マーカーをタップして情報ウィンドウを表示します。
ステップ 4: POI リスナーを追加する
スポット(POI)は、対応するアイコンとともに地図にデフォルトで表示されます。POI には、公園、学校、政府機関などが含まれます。地図のタイプが normal
に設定されている場合、ビジネス スポットも地図に表示されます。ビジネス スポットは、店舗、レストラン、ホテルなどのビジネスを表します。
このステップでは、地図に GoogleMap.OnPoiClickListener
を追加します。このクリック リスナーは、ユーザーがスポットをクリックすると、すぐに地図上にマーカーを配置します。クリック リスナーは、POI 名を含む情報ウィンドウも表示します。
MapsActivity
に、GoogleMap
を引数として受け取るsetPoiClick()
というメソッド スタブを作成します。setPoiClick()
メソッドで、渡されたGoogleMap
にOnPoiClickListener
を設定します。
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
}
}
setOnPoiClickListener()
で、マーカーのval poiMarker
を作成します。map.addMarker()
を使用してマーカーに設定し、MarkerOptions
でtitle
を POI の名前に設定します。
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
val poiMarker = map.addMarker(
MarkerOptions()
.position(poi.latLng)
.title(poi.name)
)
}
}
setOnPoiClickListener()
関数で、poiMarker
に対してshowInfoWindow()
を呼び出して、情報ウィンドウをすぐに表示します。
poiMarker.showInfoWindow()
setPoiClick()
関数の最終的なコードは次のようになります。
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
val poiMarker = map.addMarker(
MarkerOptions()
.position(poi.latLng)
.title(poi.name)
)
poiMarker.showInfoWindow()
}
}
onMapReady()
の最後に、setPoiClick()
を呼び出してmap
を渡します。
override fun onMapReady(googleMap: GoogleMap) {
...
setPoiClick(map)
}
- アプリを実行し、公園やカフェなどの POI を探します。
- POI をタップすると、その場所にマーカーが配置され、情報ウィンドウに POI の名前が表示されます。
Google マップはさまざまな方法でカスタマイズでき、地図に独自のルック アンド フィールを与えることができます。
他のフラグメントをカスタマイズする場合と同様に、使用可能な XML 属性を使用して MapFragment
オブジェクトをカスタマイズできます。ただし、このステップでは、GoogleMap
オブジェクトのメソッドを使用して、MapFragment
のコンテンツのルック アンド フィールをカスタマイズします。
地図のカスタム スタイルを作成するには、地図内のフィーチャーの表示方法を指定する JSON ファイルを生成します。この JSON ファイルを手動で作成する必要はありません。Google は、地図のスタイルを視覚的に設定した後に JSON を生成する Maps Platform スタイル ウィザードを提供しています。このタスクでは、地図をレトロなテーマでスタイル設定します。つまり、地図でビンテージ カラーを使用し、色付きの道路を追加します。
ステップ 1: 地図のスタイルを作成する
- ブラウザで https://mapstyle.withgoogle.com/ に移動します。
- [スタイルを作成] を選択します。
- [レトロ] を選択します。
- [その他のオプション] をクリックします。
- [フィーチャー タイプ] リストで、[道路] > [塗りつぶし] を選択します。
- 道路の色を任意の色(ピンクなど)に変更します。
- [完了] をクリックします。
- 結果のダイアログから JSON コードをコピーし、必要に応じて、次のステップで使用するためにプレーン テキストのメモに保存します。
ステップ 2: 地図にスタイルを追加する
- Android Studio の
res
ディレクトリで、リソース ディレクトリを作成し、raw
という名前を付けます。raw
ディレクトリ リソースは JSON コードのように使用します。 res/raw
にmap_style.json
というファイルを作成します。- 保存した JSON コードを新しいリソース ファイルに貼り付けます。
MapsActivity
で、onCreate()
メソッドの上にTAG
クラス変数を作成します。これはロギングの目的で使用されます。
private val TAG = MapsActivity::class.java.simpleName
- また、
MapsActivity
で、GoogleMap
を受け取るsetMapStyle()
関数を作成します。 setMapStyle()
にtry{}
ブロックを追加します。try{}
ブロックで、スタイリングの成功を表すval success
を作成します。(次の catch ブロックを追加します)。try{}
ブロックで、JSON スタイルを地図に設定し、GoogleMap
オブジェクトでsetMapStyle()
を呼び出します。JSON ファイルを読み込むMapStyleOptions
オブジェクトを渡します。- 結果を
success
に割り当てます。setMapStyle()
メソッドは、スタイル設定ファイルの解析とスタイルの設定の成功ステータスを示すブール値を返します。
private fun setMapStyle(map: GoogleMap) {
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
val success = map.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this,
R.raw.map_style
)
)
}
}
success
が false の場合の if ステートメントを追加します。スタイリングが失敗した場合は、解析が失敗したことを示すログを出力します。
private fun setMapStyle(map: GoogleMap) {
try {
...
if (!success) {
Log.e(TAG, "Style parsing failed.")
}
}
}
catch{}
ブロックを追加して、スタイル ファイルが見つからない状況を処理します。catch
ブロックで、ファイルを読み込めない場合は、Resources.NotFoundException
をスローします。
private fun setMapStyle(map: GoogleMap) {
try {
...
} catch (e: Resources.NotFoundException) {
Log.e(TAG, "Can't find style. Error: ", e)
}
}
完成したメソッドは次のコード スニペットのようになります。
private fun setMapStyle(map: GoogleMap) {
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
val success = map.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this,
R.raw.map_style
)
)
if (!success) {
Log.e(TAG, "Style parsing failed.")
}
} catch (e: Resources.NotFoundException) {
Log.e(TAG, "Can't find style. Error: ", e)
}
}
- 最後に、
onMapReady()
メソッドでsetMapStyle()
メソッドを呼び出し、GoogleMap
オブジェクトを渡します。
override fun onMapReady(googleMap: GoogleMap) {
...
setMapStyle(map)
}
- アプリを実行します。
- マップを
normal
モードに設定すると、レトロなテーマと選択した色の道路で新しいスタイルが表示されます。
ステップ 3: マーカーのスタイルを設定する
地図マーカーのスタイルを設定して、地図をさらにカスタマイズできます。このステップでは、デフォルトの赤いマーカーをよりクールなものに変更します。
onMapLongClick()
メソッドで、次のコード行をコンストラクタのMarkerOptions()
に追加して、デフォルトのマーカーを使用し、色を青に変更します。
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
onMapLongClickListener()
は次のようになります。
map.setOnMapLongClickListener { latLng ->
// A snippet is additional text that's displayed after the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
)
}
- アプリを実行します。長押し後に表示されるマーカーが青色で表示されます。
onPoiClick()
メソッドにスタイルを追加していないため、POI マーカーはまだ赤色です。
Google マップをカスタマイズする方法の 1 つは、地図の上に描画することです。この手法は、人気の釣り場など、特定の種類の場所をハイライト表示する場合に便利です。
- シェイプ: 地図にポリライン、ポリゴン、円を追加できます。
GroundOverlay
オブジェクト: 地面オーバーレイは、地図に固定されている画像です。マーカーとは異なり、地面オーバーレイは画面ではなく地表面に平行に配置されます。地図を回転、傾斜、ズームすると、画像の向きが変わります。地面オーバーレイは、地図上の 1 か所に 1 枚の画像を固定したい場合に便利です。
ステップ: 地面オーバーレイを追加する
このタスクでは、Android の形をしたグラウンド オーバーレイを現在地に配置します。
- この Android イメージをダウンロードして、
res/drawable
フォルダに保存します。(ファイル名がandroid.png
であることを確認してください)。
onMapReady()
で、カメラを家の位置に移動する呼び出しの後に、GroundOverlayOptions
オブジェクトを作成します。- オブジェクトを
androidOverlay
という変数に割り当てます。
val androidOverlay = GroundOverlayOptions()
BitmapDescriptorFactory.fromResource()
メソッドを使用して、ダウンロードした画像リソースからBitmapDescriptor
オブジェクトを作成します。- 結果の
BitmapDescriptor
オブジェクトをGroundOverlayOptions
オブジェクトのimage()
メソッドに渡します。
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
- 目的のオーバーレイの幅(メートル単位)の
float overlaySize
を作成します。この例では、幅100f
が適切です。
position()
メソッドを呼び出して GroundOverlayOptions
オブジェクトの position
プロパティを設定し、homeLatLng
オブジェクトと overlaySize
を渡します。
val overlaySize = 100f
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
.position(homeLatLng, overlaySize)
GoogleMap
オブジェクトでaddGroundOverlay()
を呼び出し、GroundOverlayOptions
オブジェクトを渡します。
map.addGroundOverlay(androidOverlay)
- アプリを実行します。
zoomLevel
の値を 18f に変更すると、Android の画像がオーバーレイとして表示されます。
ユーザーは現在地を確認するために Google マップをよく使用します。地図上にデバイスの位置情報を表示するには、位置情報レイヤを使用します。
位置情報レイヤにより、地図に [現在地] が追加されます。ユーザーがボタンをタップすると、地図の中心がデバイスの位置に移動します。現在地は、デバイスが静止している場合は青い点で、デバイスが移動している場合は青い山形で表示されます。
このタスクでは、位置情報データレイヤを有効にします。
ステップ: 位置情報の利用許可をリクエストする
Google マップで位置情報の追跡を有効にするには、1 行のコードが必要です。ただし、ユーザーが位置情報の権限を付与していることを確認する必要があります(ランタイム権限モデルを使用)。
このステップでは、位置情報の利用許可をリクエストし、位置情報の追跡を有効にします。
AndroidManifest.xml
ファイルで、FINE_LOCATION
権限がすでに存在することを確認します。Android Studio で Google マップ テンプレートを選択したときに、この権限が挿入されました。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
MapsActivity
でREQUEST_LOCATION_PERMISSION
クラス変数を作成します。
private val REQUEST_LOCATION_PERMISSION = 1
- 権限が付与されているかどうかを確認するには、
MapsActivity
にisPermissionGranted()
というメソッドを作成します。このメソッドで、ユーザーが権限を付与しているかどうかを確認します。
private fun isPermissionGranted() : Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
}
- アプリで位置情報の追跡を有効にするには、引数を受け取らず何も返さない
enableMyLocation()
というメソッドをMapsActivity
に作成します。内部でACCESS_FINE_LOCATION
権限を確認します。権限が付与されている場合は、位置情報レイヤを有効にします。それ以外の場合は、権限をリクエストします。
private fun enableMyLocation() {
if (isPermissionGranted()) {
map.isMyLocationEnabled = true
}
else {
ActivityCompat.requestPermissions(
this,
arrayOf<String>(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_LOCATION_PERMISSION
)
}
}
onMapReady()
コールバックからenableMyLocation()
を呼び出して、位置情報レイヤを有効にします。
override fun onMapReady(googleMap: GoogleMap) {
...
enableMyLocation()
}
onRequestPermissionsResult()
メソッドをオーバーライドします。requestCode
がREQUEST_LOCATION_PERMISSION
と等しく、権限が付与されている場合、かつgrantResults
配列が空ではなく、最初のスロットにPackageManager.PERMISSION_GRANTED
が含まれている場合は、enableMyLocation()
を呼び出します。
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray) {
if (requestCode == REQUEST_LOCATION_PERMISSION) {
if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
enableMyLocation()
}
}
}
- アプリを実行します。デバイスの位置情報へのアクセスを求めるダイアログが表示されます。権限を許可してください。
地図にデバイスの現在地が青い点で表示されます。位置情報ボタンが表示されます。地図を現在地から移動させた後にこのボタンをクリックすると、地図がデバイスの現在地を中心に戻ります。
完成した Codelab のコードをダウンロードします。
$ git clone https://github.com/googlecodelabs/android-kotlin-geo-maps
または、リポジトリを ZIP ファイルとしてダウンロードし、Android Studio で開くこともできます。
- Maps API を使用するには、Google API Console から API キーを取得する必要があります。
- Android Studio で Google Maps Activity テンプレートを使用すると、アプリのレイアウトに 1 つの
SupportMapFragment
を含むActivity
が生成されます。また、このテンプレートは、アプリ マニフェストにACCESS_FINE_PERMISSION
を追加し、アクティビティにOnMapReadyCallback
を実装し、必要なonMapReady()
メソッドをオーバーライドします。
実行時に GoogleMap
の地図タイプを変更するには、GoogleMap.setMapType()
メソッドを使用します。Google マップは、次のいずれかの地図タイプになります。
- Normal: 通常の道路地図。道路、一部の人工物、河川などの重要な自然物を表示します。道路や対象物のラベルも表示されます。
- ハイブリッド: 航空写真データに道路地図を加えたもの。道路や対象物のラベルも表示されます。
- 航空写真: 写真データ。道路および地物のラベルは表示されません。
- 地形: 地形データ。色、等高線とラベル、透視投影による影も表示されます。一部の道路とラベルも表示されます。
- なし: 基本地図タイルはありません。
Google マップについて:
- マーカーは、特定の地理的位置を示すインジケーターです。
- タップすると、マーカーのデフォルトの動作として、その場所に関する情報を含む情報ウィンドウが表示されます。
- スポット(地図上の場所)は、対応するアイコンとともに基本地図にデフォルトで表示されます。POI には、公園、学校、政府機関などが含まれます。
- また、地図タイプが
normal
の場合は、ビジネス スポット(店舗、レストラン、ホテルなど)がデフォルトで地図に表示されます。 OnPoiClickListener
を使用して、スポットのクリックをキャプチャできます。- スタイル設定ウィザードを使用すると、Google マップのほぼすべての要素の視覚的な外観を変更できます。スタイル ウィザードは、
setMapStyle()
メソッドを使用して Google マップに渡す JSON ファイルを生成します。 - デフォルトの色を変更したり、デフォルトのマーカー アイコンをカスタム画像に置き換えたりして、マーカーをカスタマイズできます。
その他の重要な情報:
- 地面オーバーレイを使用して、画像を地理的位置に固定します。
GroundOverlayOptions
オブジェクトを使用して、画像、画像のサイズ(メートル単位)、画像の位置を指定します。このオブジェクトをGoogleMap.addGroundOverlay()
メソッドに渡して、オーバーレイを地図に設定します。- アプリに
ACCESS_FINE_LOCATION
権限が付与されている場合、map.isMyLocationEnabled = true
を設定することで位置情報の追跡を有効にできます。 - この Codelab では扱いませんが、特定の場所のナビゲーション可能なパノラマ写真である Google ストリートビューを使用して、場所に関する追加情報を提供できます。
Android デベロッパー ドキュメント:
リファレンス ドキュメント:
このコースの他の Codelab へのリンクについては、Kotlin を使った高度な Android 開発の Codelab のランディング ページをご覧ください。