現在地を検索します
位置情報を認識するアプリケーションを作成する場合、最も一般的なタスクの 1 つは、マップ上のユーザーの現在の位置を表示することです。 このために、さまざまなソリューションを利用できます。 1 つの方法として、を使用 android.location.LocationManager
して、デバイスに内蔵されている GPS センサーから位置情報を取得する方法があります。
注
- 一部の Android デバイスには GPS センサーが搭載されていない
NETWORK_PROVIDER
ため、を使用して Wi-Fi の位置合わせにフォールバックする場合があります。 - GPS が利用可能な場合、一部の Android デバイスでは位置情報の精度を改善できます。 このためには、 [ 設定 ] 、 [ 位置情報サービス ] 、 [Google 位置情報の精度 ] 、または同等のものを選択します。
HERE SDK は、商用またはプラットフォーム のポジショニングソリューションでスムーズに動作します。 Navigate Edition の一部として、包括的な HERE Positioning ソリューションが提供されています。 プラットフォーム に依存する可能性のある実装を以下に示します。
デバイスのセンサーにアクセスする前に、ユーザーに許可を求める必要があります。 AndroidManifest
次の権限をファイルに追加します。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
このユーザー ガイドに付属 PermissionsRequestor
するすべてのサンプルアプリでは、タスクを処理してユーザーの権限を要求するという便利なクラスを使用しています。 詳細については、はじめにの項を参照してください。
次に LocationManager
、 Android プラットフォームからのインスタンスを取得し、デバイスの機能に応じて位置情報の更新を要求します。
locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) &&
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_UPDATE_INTERVAL_IN_MS, 1,this);
} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_UPDATE_INTERVAL_IN_MS, 1,this);
} else {
Log.d(LOG_TAG, "Positioning not possible.");
}
ユーザーが GPS を利用できない、または無効にしている場合、 Wi-Fi の位置にフォールバックしますが、これははるかに正確ではありません。 それでも電源がオフになっている場合は、あきらめます。
上で説明したように、呼び出し元のクラスをリスナーとして設定しているため LocationListener
、イベントの取得を開始するにはインターフェイスを実装する必要があります。
@Override
public void onLocationChanged(android.location.Location location) {
if (platformLocationListener != null) {
platformLocationListener.onLocationUpdated(location);
}
}
platformLocationListener
は、別のクラスに簡単に通知を受け取ることができるように定義されたインターフェイスです。
LocationManager
これは、 Android 位置情報サービスへのアクセスを提供するを統合する方法の一例にすぎません。 自分のニーズに合わせて自由にアレンジできます。
以下に完全なクラスを示します。
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import static android.content.Context.LOCATION_SERVICE;
public class PlatformPositioningProvider implements LocationListener {
public static final String LOG_TAG = PlatformPositioningProvider.class.getName();
public static final int LOCATION_UPDATE_INTERVAL_IN_MS = 100;
private Context context;
private LocationManager locationManager;
@Nullable
private PlatformLocationListener platformLocationListener;
public interface PlatformLocationListener {
void onLocationUpdated(Location location);
}
public PlatformPositioningProvider(Context context) {
this.context = context;
}
@Override
public void onLocationChanged(android.location.Location location) {
if (platformLocationListener != null) {
platformLocationListener.onLocationUpdated(location);
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
switch(status){
case LocationProvider.AVAILABLE:
Log.d(LOG_TAG, "PlatformPositioningProvider status: AVAILABLE");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.d(LOG_TAG, "PlatformPositioningProvider status: OUT_OF_SERVICE");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d(LOG_TAG, "PlatformPositioningProvider status: TEMPORARILY_UNAVAILABLE");
break;
default:
Log.d(LOG_TAG, "PlatformPositioningProvider status: UNKNOWN");
}
}
@Override
public void onProviderEnabled(String provider) {
Log.d(LOG_TAG, "PlatformPositioningProvider enabled.");
}
@Override
public void onProviderDisabled(String provider) {
Log.d(LOG_TAG, "PlatformPositioningProvider disabled.");
}
public void startLocating(PlatformLocationListener locationCallback) {
if (this.platformLocationListener != null) {
throw new RuntimeException("Please stop locating before starting again.");
}
if (ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.d(LOG_TAG, "Positioning permissions denied.");
return;
}
this.platformLocationListener = locationCallback;
locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) &&
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_UPDATE_INTERVAL_IN_MS, 1,this);
} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_UPDATE_INTERVAL_IN_MS, 1,this);
} else {
Log.d(LOG_TAG, "Positioning not possible.");
stopLocating();
}
}
public void stopLocating() {
if (locationManager == null) {
return;
}
locationManager.removeUpdates(this);
platformLocationListener = null;
}
}
このクラスを独自のアプリに統合するには、新しいインスタンスを作成します。
platformPositioningProvider = new PlatformPositioningProvider(context);
次に、リスナーでの検索とフックを開始できます。
platformPositioningProvider.startLocating(new PlatformPositioningProvider.PlatformLocationListener() {
@Override
public void onLocationUpdated(android.location.Location location) {
}
});
リスニングを停止するには、次の電話番号に電話
platformPositioningProvider.stopLocating();
クラスで android.location.Location
はイベントが受信されます。 Location
次のメソッドを使用して、最も一般的なフィールドをカバーするために HERE SDK で使用されるクラスに変換します。
private Location convertLocation(android.location.Location nativeLocation) {
GeoCoordinates geoCoordinates = new GeoCoordinates(
nativeLocation.getLatitude(),
nativeLocation.getLongitude(),
nativeLocation.getAltitude());
Location location = new Location(geoCoordinates);
if (nativeLocation.hasBearing()) {
location.bearingInDegrees = (double) nativeLocation.getBearing();
}
if (nativeLocation.hasSpeed()) {
location.speedInMetersPerSecond = (double) nativeLocation.getSpeed();
}
if (nativeLocation.hasAccuracy()) {
location.horizontalAccuracyInMeters = (double) nativeLocation.getAccuracy();
}
return location;
}
LocationManager
の詳細および 他のプラットフォームのポジショニング機能の使用方法について は、 Android の公式ドキュメントを参照してください。