現在地を検索

位置情報を認識するアプリケーションを作成する場合、最も一般的なタスクの 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 という便利なクラスを使用します。詳細については、利用開始の項を参照してください。

次に、 Android プラットフォームからのインスタンスLocationManagerを取得し、デバイスの機能に応じて位置情報の更新を要求します。

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 は、別のクラスに簡単に通知を受け取ることができるように定義されたインターフェイスです。

これは、 Android 位置情報サービスへのアクセスを提供するLocationManager を統合する方法の一例にすぎません。 自分のニーズに合わせて自由にアレンジできます。

以下に完全なクラスを示します。

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;

// A simple Android based positioning implementation.
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 が受信されることに注意してください。 次のメソッドを使用して、最も一般的なフィールドをカバーするために HERE SDK で使用されるクラスLocation に変換します。

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 の公式ドキュメントを参照してください。

HERE Positioning および GPX トラッキング機能を使用してアプリを構築する方法を示す、より包括的なチュートリアルが ここにあります。

」に一致する結果は 件です

    」に一致する結果はありません