位置情報

モバイルアプリに特有の機能として、位置認識があります。 モバイル ユーザーはデバイスをあらゆる場所に持参するため、アプリに位置認識を追加すると、より状況に適したエクスペリエンスをユーザーに提供できます。

コードサンプル

GitHub の ApiDemos リポジトリには、地図での位置情報の使用方法を示すサンプルが含まれています。

位置情報の使用

Android デバイスで使用可能な位置情報には、デバイスの現在地や(複数のテクノロジーを組み合わせて特定されます)、移動のルートと手段のほか、デバイスが事前定義済みの境界線を越えて移動しているかどうか(ジオフェンス)などがあります。アプリのニーズに応じて、いくつかの方法で位置情報を使用することができます。

  • 現在地レイヤを使用すると、デバイスの位置を地図上に表示することが簡単にできます。この方法では、位置情報は提供されません。
  • プログラムで位置情報をリクエストする場合は、Google Play 開発者サービスの Location API の使用が推奨されます。
  • LocationSource インターフェースを使用すると、カスタムの位置情報プロバイダを指定できます。

位置情報の利用許可

アプリでユーザーの位置情報を利用する必要がある場合は、適切な Android 位置情報の利用許可をアプリに追加して、パーミッションをリクエストする必要があります。

Android には、ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION という 2 つの位置情報の利用許可が用意されています。API で返される位置情報の精度は、選択するパーミッションによって異なります。どの程度の精度を必要とするかに応じて、Android 位置情報の利用許可を 1 つのみリクエストしてください。

  • android.permission.ACCESS_COARSE_LOCATION - API で Wi-Fi またはモバイル デバイス(あるいはその両方)のモバイルデータを使用して、デバイスの位置を特定できるようにします。API では、ほぼ市街地のブロックに相当する精度で位置情報が返されます。
  • android.permission.ACCESS_FINE_LOCATION - API で、使用可能な位置情報プロバイダ(グローバル ポジショニング システム(GPS)など)や、Wi-Fi またはモバイル デバイスのモバイルデータを利用して、できる限り正確な位置を特定できるようにします。

アプリ マニフェストにパーミッションを追加する

次のパーミッションのいずれかを、<manifest> 要素の子要素として Android マニフェストに追加します。精度の低い位置情報の利用許可は次のとおりです。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp" >
  ...
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  ...
</manifest>

精度の高い位置情報の利用許可は次のとおりです。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp" >
  ...
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  ...
</manifest>

ランタイム パーミッションをリクエストする

Android 6.0(Marshmallow)には、パーミッションを処理するための新しいモデルが導入されているため、ユーザーがアプリのインストールやアップグレードを行う際のプロセスが合理化されています。アプリが API レベル 23 以降をターゲットとしている場合は、この新しいパーミッション モデルを使用できます。

アプリで新しいパーミッション モデルがサポートされていて、デバイスで Android 6.0(Marshmallow)以降が実行されている場合は、アプリをインストールまたはアップグレードする際に、ユーザーがなんらかのパーミッションを付与する必要はありません。アプリでは、実行時に必要なパーミッションがあるかどうかを確認し、ない場合はそのパーミッションをリクエストする必要があります。ユーザーには、パーミッションを要求するダイアログが表示されます。

最適なユーザー エクスペリエンスを提供するには、状況に応じてパーミッションをリクエストすることが重要です。 アプリが機能するために位置情報が不可欠な場合は、アプリの起動時に位置情報の利用許可をリクエストする必要があります。それには、「ようこそ」の画面やウィザードで、パーミッションが必要な理由をユーザーに説明することをおすすめします。

アプリの一部の機能でのみパーミッションが必要な場合は、アプリでパーミッションを必要とするアクションが行われるときに位置情報の利用許可をリクエストする必要があります。

ユーザーがパーミッションを付与しなかった場合は、アプリで適切に対処する必要があります。たとえば、そのパーミッションが必要な機能をアプリで無効にするなどです。アプリが機能するためにパーミッションが不可欠な場合は、アプリですべての機能を無効にして、パーミッションを付与する必要があることをユーザーに通知します。

現在地レイヤを有効にする前にサポート ライブラリを使用してパーミッションを確認するコードのサンプルを次に示します。

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        == PackageManager.PERMISSION_GRANTED) {
    if (mMap != null) {
        mMap.setMyLocationEnabled(true);
    }
} else {
    // Permission to access the location is missing. Show rationale and request permission
    PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
        Manifest.permission.ACCESS_FINE_LOCATION, true);
}

サポート ライブラリから ActivityCompat.OnRequestPermissionsResultCallback を実装してパーミッションのリクエストの結果を処理するコードのサンプルを次に示します。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
        return;
    }

    if (PermissionUtils.isPermissionGranted(permissions, grantResults, Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Enable the my location layer if the permission has been granted.
        enableMyLocation();
    } else {
        // Permission was denied. Display an error message
        // ...
    }
}

その他のコードサンプルや、Android のランタイム パーミッションに関するベスト プラクティスについては、Android パーミッション モデルに関するドキュメントをご覧ください。

現在地レイヤ

現在地レイヤと現在地ボタンを使用して、地図にユーザーの現在地を表示できます。地図で現在地レイヤを有効にするには、mMap.setMyLocationEnabled() を呼び出します。

現在地レイヤの簡単な使用方法のサンプルを次に示します。

public class MyLocationDemoActivity extends FragmentActivity
    implements OnMyLocationButtonClickListener,
        OnMyLocationClickListener,
        OnMapReadyCallback {

  private GoogleMap mMap;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_location_demo);

    SupportMapFragment mapFragment =
        (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
  }

  @Override
  public void onMapReady(GoogleMap map) {
    mMap = map;
    // TODO: Before enabling the My Location layer, you must request
    // location permission from the user. This sample does not include
    // a request for location permission.
    mMap.setMyLocationEnabled(true);
    mMap.setOnMyLocationButtonClickListener(this);
    mMap.setOnMyLocationClickListener(this);
  }

  @Override
  public void onMyLocationClick(@NonNull Location location) {
    Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
  }

  @Override
  public boolean onMyLocationButtonClick() {
    Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
    // Return false so that we don't consume the event and the default behavior still occurs
    // (the camera animates to the user's current position).
    return false;
  }
}

現在地レイヤが有効になっている場合は、地図の右上に現在地ボタンが表示されます。デバイスの現在地がわかっている場合は、ユーザーがボタンをクリックすると、カメラで現在地が地図の中心に設定されます。現在地は、地図に小さな青い点で示されるか(デバイスが静止している場合)、山形として示されます(デバイスが移動している場合)。

次のスクリーンショットでは、地図の右上に現在地ボタンが、中心に現在地を示す青い点が表示されています。

現在地ボタンが表示されないようにするには、UiSettings.setMyLocationButtonEnabled(false) を呼び出します。

アプリは、以下のイベントに応答できます。

  • ユーザーが現在地ボタンをクリックすると、アプリは GoogleMap.OnMyLocationButtonClickListener から onMyLocationButtonClick() コールバックを受け取ります。
  • ユーザーが現在地を示す青い点をクリックすると、アプリは GoogleMap.OnMyLocationClickListener から onMyLocationClick() コールバックを受け取ります。

利用規約から

ユーザーのプライバシーを保護
ユーザーに最新情報を提供

ユーザーには、ユーザーデータの使用方法と、個人を特定できる方法でそれらを使用しないことを必ず通知します。ユーザーの位置情報は本人の同意を得たうえで使用し、ユーザーがいつでも同意を取り消せるようにしてください。

詳細

Google Play 開発者サービスの Location API

Google Play 開発者サービスの Location API は、Android アプリに位置認識を追加するための方法として推奨されています。この API には、以下を行うための機能が含まれています。

  • デバイスの位置を特定する。
  • 現在地の変動をリッスンする。
  • デバイスが移動している場合は、移動手段を特定する。
  • ジオフェンスと呼ばれる、事前定義済みの地理的領域を作成して監視する。

Location API を使用すると、電力効率が高く、位置認識機能を備えたアプリを簡単に作成できます。Maps SDK for Android と同様に、Location API は Google Play 開発者サービス SDK の一部として配布されています。Location API について詳しくは、Android トレーニング クラスのアプリに位置認識を追加する方法または Location API リファレンスをご覧ください。コードサンプルは、Google Play 開発者サービス SDK の一部として含まれています。