Android
 Computer >> コンピューター >  >> プログラミング >> Android

AndroidアプリでGoogleマップに現在地を表示する方法を徹底解説

Androidアプリ開発において、Googleマップ上にユーザーの現在地を表示する機能は、ナビゲーションアプリやフードデリバリーアプリなど、多くの場面で活用されています。本記事では、Android Studioを使ってGoogleマップに現在地を表示する手順を、サンプルコード付きで段階的に解説します。

実装の全体像

今回の実装では、以下の要素を組み合わせて現在地を取得・表示します。

  • SupportMapFragment: マップを画面に表示するためのフラグメント
  • FusedLocationProviderClient: Google Play Servicesが提供する位置情報取得API。GPSやWi-Fiなどを統合的に利用し、高精度かつ省電力で現在地を取得できます
  • 位置情報パーミッション: ACCESS_FINE_LOCATION権限のリクエスト処理

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目(プロジェクト名、パッケージ名、保存先など)を入力しましょう。テンプレートは「Empty Activity」で問題ありません。

ステップ2:レイアウトファイルを編集する

res/layout/activity_main.xml に以下のコードを追加します。ここでは、マップを全画面表示するための SupportMapFragment を配置しています。

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/myMap"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

ステップ3:依存関係を追加する

build.gradle(Module: app)の dependencies ブロックに、以下の2つのライブラリを追加します。

implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'

「play-services-maps」はマップ表示用、「play-services-location」は現在地取得用のライブラリです。追加後は「Sync Now」をクリックして同期を忘れずに行いましょう。

ステップ4:MainActivityを実装する

src/MainActivity.java に以下のコードを記述します。このコードでは、位置情報の権限チェック、現在地の取得、マップへのマーカー表示までを一連の流れで処理しています。

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
    Location currentLocation;
    FusedLocationProviderClient fusedLocationProviderClient;
    private static final int REQUEST_CODE = 101
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        fetchLocation();
    }
    private void fetchLocation() {
        if (ActivityCompat.checkSelfPermission(
            this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
            this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
            return;
        }
        Task<Location> task = fusedLocationProviderClient.getLastLocation();
        task.addOnSuccessListener(new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    currentLocation = location;
                    Toast.makeText(getApplicationContext(), currentLocation.getLatitude() + "" + currentLocation.getLongitude(), Toast.LENGTH_SHORT).show();
                    SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.myMap);
                    assert supportMapFragment != null;
                    supportMapFragment.getMapAsync(MainActivity.this);
                }
            }
        });
    }
    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
        MarkerOptions markerOptions = new MarkerOptions().position(latLng).title("I am here!");
        googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5));
        googleMap.addMarker(markerOptions);
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    fetchLocation();
            }
            break;
        }
    }
}

コードのポイント解説

  • fetchLocation(): まずACCESS_FINE_LOCATION権限が許可されているかを確認し、未許可の場合はダイアログを表示してユーザーにリクエストします。
  • getLastLocation(): 端末が最後に記録した位置情報を取得します。取得成功時にToastで緯度経度を確認できます。
  • onMapReady(): マップの準備が整ったタイミングで呼ばれ、現在地にマーカーを設置し、カメラをアニメーションで移動させます。

ステップ5:strings.xmlにAPIキー用の定義を追加する

Open strings.xml を開き、以下のコードを追加します。

<resources>
    <string name="app_name">Sample</string>
    <string name="map_key" translatable="false">Enter your google API key here</string>
</resources>

ステップ6:Google Maps APIキーを取得する

マップを表示するには、Google Cloud Platform(GCP)で発行されるAPIキーが必要です。以下の手順で取得してください。

  1. Google Cloud Platform Console にアクセスします。
  2. プロジェクトのプルダウンをクリックし、APIキーを追加したいプロジェクトを選択または新規作成します。
  3. メニューボタンから「APIとサービス」→「認証情報」を選択します。
  4. 認証情報ページで「認証情報を作成」→「APIキー」をクリックすると、新しく作成されたAPIキーがダイアログに表示されます。
  5. 「閉じる」をクリックします。

作成したAPIキーは、認証情報ページの「APIキー」欄に一覧表示されます。本番環境で使用する前に、必ずAPIキーに制限(アプリ制限・API制限)を設定しておきましょう。これにより、キーの不正利用を防ぐことができます。

ステップ7:AndroidManifest.xmlを編集する

androidManifest.xml に、インターネット通信と位置情報取得のためのパーミッション、およびAPIキーのmeta-data定義を追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <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">
        <meta-data android:name="com.google.android.geo.API_KEY" android:value="@string/map_key"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行して動作を確認する

以上で実装は完了です。実際のAndroid端末をPCに接続し、Android Studioからアプリを実行してみましょう。プロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。接続済みのモバイル端末を選択すると、アプリが起動し、マップ上に現在地を示すマーカーが表示されます。

AndroidアプリでGoogleマップに現在地を表示する方法を徹底解説

うまく動かないときのチェックポイント

  • APIキーが正しく strings.xml に設定されているか確認する
  • GCPコンソールで「Maps SDK for Android」が有効化されているか確認する
  • 端末の位置情報サービス(GPS)がオンになっているか確認する
  • エミュレータではなく実機でテストすることを推奨(エミュレータの場合は位置情報のシミュレート設定が必要)

これらを確認すれば、ほとんどの問題は解決できるはずです。ぜひ本記事の手順を参考に、現在地表示機能をあなたのアプリに組み込んでみてください。

  1. AndroidのLocation APIで現在地を追跡・表示する方法をステップごとに解説

    概要この記事では、AndroidのLocation API(Google Maps SDK)を使って、現在地を取得し地図上に表示する方法を段階的に解説します。マーカーを立てて現在地を視覚的に確認できる、シンプルなサンプルアプリを一緒に作成していきましょう。ステップ1:新規プロジェクトの作成と依存関係の追加Android Studioを起動し、メニューから「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目を入力してプロジェクトの雛形を生成してください。続いて、build.gradle(Module: app)に以下の依存関係を追加します。implemen

  2. 【初心者向け】HTML5ジオロケーションとGoogleマップで現在地を表示する方法

    HTML5のGeolocation API(ジオロケーションAPI)を使うと、Webサイトと位置情報を共有できるようになります。JavaScriptでデバイスの緯度・経度を取得し、そのデータをバックエンドのWebサーバーへ送信することで、周辺店舗の検索や地図上への現在地表示など、位置情報を活用したさまざまな機能を実装できます。ジオロケーションの座標は、デバイスの地理的な位置を正確に特定するための情報です。 getCurrentPosition()メソッドの仕組み Geolocation APIでは、getCurrentPosition()などのメソッドに対して、位置情報を取得するためのコールバ