現在地を検索
マッピングアプリケーションを使用する主な理由の 1 つは、自分がどこにいるかを確認することです。
HERE SDK が提供するLocationEngine
は、 GPS やその他のグローバル衛星ナビゲーションシステム( GNSS )受信機、モバイルネットワーク信号、 Wi-Fi ネットワーク信号などの複数の位置情報源と連携して正確な位置を判断する、包括的な位置情報ソリューションを実装しています。
Android デバイスでは、サブメーターの精度は、資格情報 が有効になっている場合にのみサポートされます ( 以下を参照 ) 。
注
簡単に確認できます
HERE SDK の位置情報フィーチャーを統合するには、少なくとも次の手順を実行する必要があります。
- 必要なAndroid 権限をマニフェストファイルに追加し、ユーザーに権限を要求します。
- データを
LocationEngine
によって収集できるかどうかを確認する承諾ダイアログConsentEngine
を作成して表示します。 - 承諾ダイアログの結果を表示し、ユーザーが以前の決定を削除できるようにします。
LocationEngine
を作成し、少なくとも 1 つのLocationListener
を設定します。 -
LocationEngine
を1回開始し、必要な精度レベルを設定します。 Location
の更新を受信し、アプリで処理します。
必要な権限を追加
アプリでのLocationEngine
の使用を開始する前に、アプリ AndroidManifest.xml
のファイルに必要な権限を追加する必要があります。
...
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
注
アプリが Android SDK バージョン 31 以降を対象とする場合 、アプリのユーザーはデバイスの「正確な」位置情報を付与する必要があります。 プロンプトが表示された場合 、「近似」の精度を選択するだけでは不十分です。 したがって 、上記のように、マニフェストファイルにACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
権限が存在する必要があります。 HERE Positioning で GNSS を使用し、携帯電話および WiFi スキャンを行うには、ファインロケーション許可が必要です。 このACCESS_COARSE_LOCATION
権限だけでは、 HERE Positioning が動作するのに十分ではない近似の精度になるため、十分ではありません。 この場合、LocationEngine
は MISSING_PERMISSIONS
エラーで失敗します。
WAKE_LOCK
HERE SDK によって権限が強制されませんが、アプリケーションに権限が付与されている場合、 HERE SDK はウェークロックを使用して、省電力モードになっているデバイスによってネットワークスキャンおよび位置の計算が中断されないようにします。 ウェイクロックは、バッテリー消費への影響をできるだけ少なくするために、必要な時間だけ保持されます。 Android オペレーティング システムは、ウェイクロックを継続的に維持しているアプリケーションまたはサービスがバッテリー消費の原因であることに注意してください。そのため、アプリケーションをユーザーにとって魅力的な状態に保つには、ウェイクロックがユースケースにとって必須であるかどうか、またはウェイクロックが必須であるかどうかを慎重に検討する必要があります。
このユーザー ガイドに付属 するすべてのサンプルアプリで、負担の大きいタスクを処理してユーザーの権限を要求するPermissionsRequestor
という便利なクラスを使用しています。
GPS などのネイティブの位置情報サービスを使用するアプリは、ユーザーの許可を要求します。 すべてのデバイスが同じ機能を提供しているわけではありません。また、特定のハードウェアの制約があるため、結果が異なる可能性があります。
LocationEngine
を使用する前に、ネイティブの位置情報サービスが有効になっているかどうかを確認することをお勧めします。 ほとんど の Android デバイスでは、ユーザーが位置情報サービスをオンにすることを選択できます。さらに、デバイスの [ 設定 ] を開き、 [ セキュリティと位置情報 ] セクションに移動することで、精度を上げることもできます。
に LocationEngine
は、 HERE SDK が使用する HERE サービスを改善するために、モバイル機器の周辺についての特定の情報を収集できる機能が含まれています。 そのような情報の例として、近くの Wi-Fi およびモバイルネットワークの信号の強度があります。
HERE SDK は ConsentEngine
、ユーザーがデータを収集することに同意したことを取得するためのフローを処理するを提供します。 さらに、現在のステータスを取得し、データを収集するかどうかを判断する前の決定を削除できます。 アプリケーションは、ユーザーがいつでもアクセスできるようにする必要があります。
注 : 要件
承諾ダイアログの表示は必須です。 LocationEngine
は、ユーザーが決定するまで位置情報データをアプリ に送信しません。 ユーザーが承諾を付与または拒否した場合でも、LocationEngine
完全に動作可能になります。
次の 2 つのステップが必要です。
-
consentEngine.requestUserConsent()
を呼び出して、承諾ダイアログを表示します。 - アプリケーションは、ユーザーの現在の決定内容を表示し、以前の決定内容を削除する必要があります。
consentEngine.getUserConsentState()
経由で現在の決定を取得します。 ユーザーが再度 requestUserConsent()
をコールすることを許可して、前の決定を取り消します。 これは、アプリのライフサイクル中いつでも可能である必要があります。
これらの手順については、以下で詳しく説明します。 詳細については、 HERE SDK のプライバシーに関する補足情報を参照してください。 情報は、ユーザーが同意した場合にのみ収集されることに注意してください。 収集された情報はユーザーを特定するものではなく、 HERE は匿名化された情報のみを保持します。
LocationEngine
を開始する前 に、前述の情報を収集するユーザーの同意が得られていることを確認する必要があります。 回答の内容に関係なく ( ユーザーがデータの収集を承諾したかどうかに関係なく ) 、承諾ダイアログが表示され、回答が提供されたことのみが該当します。 LocationEngine
は、ユーザーの同意を得ずに開始しようとすると、LocationEngineStatus.USER_CONSENT_NOT_HANDLED
ステータスを返します。
以下のコード スニペットは、 ConsentEngine
のインスタンスを作成し、ユーザーの同意がすでに要求されているかどうかを確認します。要求されていない場合は、ユーザーに収集された情報の詳細を説明する UI ダイアログ ( 以下の図も参照 ) を呼び出します。 権限を付与または拒否することができます。
try {
consentEngine = new ConsentEngine();
} catch (InstantiationErrorException e) {
throw new RuntimeException("Initialization of ConsentEngine failed: " + e.getMessage());
}
if (consentEngine.getUserConsentState() == Consent.UserReply.NOT_HANDLED) {
consentEngine.requestUserConsent();
}
マップ シーンのロード中は、requestUserConsent()
を呼び出さないことをお勧めします。
スクリーンショット: 承諾のダイアログ。 このダイアログには、 HERE のプライバシープラクティスについて説明した Web ページへのリンクが含まれており、 37 言語をサポートしています。 表示されているダイアログは、デバイスの言語設定に従って表示されます。サポートされていない場合は、英語で表示されます。
ユーザーの応答は、アプリケーションの使用セッション間で保持され、メソッド getUserConsentState()
を使用して取得できます。メソッドは 、次の値Consent.UserReply
を返します。
switch(consentEngine.getUserConsentState()) {
case GRANTED:
consentStateTextView.setText(R.string.consent_state_granted);
break;
case DENIED:
case NOT_HANDLED:
case REQUESTING:
consentStateTextView.setText(R.string.consent_state_denied);
break;
default:
throw new RuntimeException("Unknown consent state.");
}
アプリケーションでは、メソッドgetUserConsentState()
を呼び出して、ユーザーが以前に入力した応答を参照できるようにする必要があります。 上の図では、consentStateTextView
を使用して現在の状態を表示します。 また、 このアプリケーションでは、メソッドrequestUserConsent()
を呼び出して承諾ダイアログを再度表示することで、いつでもユーザーが同意についての考え方を変更できるようにする必要があります。
requestUserConsent()
が呼び出されると、 HERE SDK にダイアログを含む新しい Activity
が表示されます。 ダイアログが閉じると、前のダイアログActivity
が再開されます。 ダイアログを開く前にMapView
が表示されている場合、MapView
が再び表示されるまで一時停止されます。
注
サンプルのフローは 、 GitHub にある Positioning Example アプリに記載されています。
承諾ダイアログのカスタマイズ
LocationEngine
を使用するには、ユーザーの同意を要求する必要があります。 既定では、上記の API を使用してこの問題が発生します。
ダイアログの外観と内容をカスタマイズできます。 このためには、 HERE に、アプリケーション独自にカスタマイズしたユーザーの同意ダイアログを証明するよう依頼します。 証明書を受け取ると、アプリケーションは grantUserConsent()
と denyUserConsent()
のメソッドを使用して HERE SDK に対するユーザーの応答を伝達できます。HERE が、アプリケーションによってカスタムダイアログを開始できることを承認した場合、requestUserConsent()
の呼び出しは不要になります。 通信したユーザーの応答は HERE SDK によって保持 getUserConsentState()
され、メソッドを使用して以前に指定した応答を取得できます。
特定の事前要件の下で、別の方法で承諾の決定を要求または更新することも可能です。 たとえば、ユーザーがすでに外部の Web サイトで承諾を付与している場合です。 ただし、ソリューションについては、 HERE チームと個別に話し合う必要があります。
このオプションの詳細について確認 するか、または HERE の営業担当者またはヘルプページから HERE に連絡して認定プロセスを開始してください。
locationEngine の作成
LocationEngine
の新規作成は簡単です。
try {
locationEngine = new LocationEngine();
} catch (InstantiationErrorException e) {
throw new RuntimeException("Initialization of LocationEngine failed: " + e.getMessage());
}
注
Application
のonCreate()
ライフサイクル中は、LocationEngine
を初期化できません。 それ以外の任意の時点で問題はありません。 たとえば、エンジンを初期化するのに適した場所が Activity
の onCreate()
メソッドに含まれている可能性があります。
最後に確認した場所を取得
エンジンが初期化されると、少なくとも 1 回前にエンジンが始動し、少なくとも 1 つの位置を受信している限り、最後に確認された位置を取得できます。そうでない場合、null
が返されます。 この情報は残ります。したがって、最後に確認された場所もアプリケーションセッション間で利用できます。
Location myLastLocation = locationEngine.getLastKnownLocation();
if (myLastLocation != null) {
Log.d(TAG, "Last known location: " + myLastLocation.coordinates.latitude + ", " + myLastLocation.coordinates.longitude);
}
注
最後の既知の場所を取得するために、 LocationEngine
を開始する必要はありません。また、リスナーを設定する必要もありません。 LocationEngine
が 前のセッションで 1 回正常に開始され、有効な位置イベントが少なくとも 1 回受信されただけで十分です。 Location
オブジェクトには timestamp
、その場所がいつ受信されたかを示すが含まれています。
位置情報イベントに関する通知を受信
次に、LocationEngine
を開始する前にLocationStatusListener
を登録して、エンジンのステータスの変更が通知されるようにすることをお勧めします。 そのためには LocationStatusListener
、インターフェイスを実装し、 Location Engine addLocationStatusListener()
のメソッドに登録します。 さまざまなステータスの詳細については、 API リファレンス を確認してください。
private final LocationStatusListener locationStatusListener = new LocationStatusListener() {
@Override
public void onStatusChanged(@NonNull LocationEngineStatus locationEngineStatus) {
Log.d(TAG, "LocationEngineStatus: " + locationEngineStatus.name());
}
@Override
public void onFeaturesNotAvailable(@NonNull List<LocationFeature> features) {
for (LocationFeature feature : features) {
Log.d(TAG, "Feature not available: " + feature.name());
}
}
};
locationEngine.addLocationStatusListener(locationStatusListener);
注
開始が成功すると、LocationStatusListener
は常にステータスLocationEngineStatus.ENGINE_STARTED
を受信し、停止が成功すると、常にステータスLocationEngineStatus.ENGINE_STOPPED
を受信します。
また、リスナー onFeaturesNotAvailable()
のコールバック を通じて 、利用できないものLocationFeature
があれば通知されます。 必要な機能が利用できない場合は、HERE の担当者にご連絡ください。 注 : LocationFeature
列挙型 (enum) は現在保留中の機能です。
エンジンを始動する前に考慮すべき最後の作業は、LocationListener
を登録することです。これにより、新しいLocation
が検出されたときに通知を送信するonLocationUpdated()
コールバックが提供されます。 これは、前述のLocationStatusListener
と同様の方法で行うことができます。
private final LocationListener locationListener = new LocationListener() {
@Override
public void onLocationUpdated(@NonNull Location location) {
Log.d(TAG, "Received location: " + location.coordinates.latitude + ", " + location.coordinates.longitude);
}
};
locationEngine.addLocationListener(locationListener);
注
コールバック onLocationUpdated()
はメインスレッドで受信されます。他のすべてのコールバックと同じです。
現在の地理座標とは別に Location
、インスタンスには現在の高度、方位、速度、精度など、より役立つ情報が多数含まれている場合があります。 詳細については、以下の「場所からのアクセス精度情報」セクションを参照してください。
それぞれのaddLocationStatusListener()
メソッドおよびaddLocationListener()
メソッドを呼び出して、必要なだけLocationStatusListener
およびLocationListener
を追加できます。
受信地点の開始および停止
LocationEngine
の start()
メソッドを呼び出す準備ができました。
try {
consentEngine = new ConsentEngine();
locationEngine = new LocationEngine();
} catch (InstantiationErrorException e) {
throw new RuntimeException("Initialization failed: " + e.getMessage());
}
if (consentEngine.getUserConsentState() == Consent.UserReply.NOT_HANDLED) {
consentEngine.requestUserConsent();
}
startLocating();
private void startLocating() {
locationEngine.addLocationStatusListener(locationStatusListener);
locationEngine.addLocationListener(locationListener);
locationEngine.start(LocationAccuracy.BEST_AVAILABLE);
}
エンジンを始動する最も簡単な方法は、上記のコード スニペットのように、定義済みのモードの 1 つLocationAccuracy
を渡すことです。 使用可能なすべてのモードの詳細については、次の表を参照するか、 API リファレンス を確認してください。
LocationEngine
が開始された後、最初にstop()
をコールしないで、再度開始しようとすると、LocationEngineStatus.ALREADY_STARTED
が届きます。 このメソッドisStarted()
を使用して、エンジンが始動しているかどうかを確認できます。 同様に、LocationEngine
を開始し、最初のを停止せずに別のを開始しようとすると、LocationEngineStatus.ALREADY_STARTED
エラーが発生します。 一度に始動できるエンジンは 1 つだけです。
位置情報の更新をこれ以上受信したくない場合 stop()
は、メソッドを呼び出してエンジンを停止できます。 不要になったリスナーは必ず削除してください。
public void stopLocating() {
locationEngine.stop();
}
locationEngine.removeLocationListener(locationListener);
locationEngine.removeLocationStatusListener(locationStatusListener);
一般 に、アプリが廃棄された場合は、LocationEngine
を停止することをお勧めします。
バックグラウンド更新を有効化
Android 10 ( API レベル 29 )以上をターゲットにしており、アプリがバックグラウンドで実行されている間も位置情報の更新を引き続き受信する場合は AndroidManifest.xml
、アプリのファイルに次の権限を追加して、この機能を有効にする必要があります。
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Android 14 以降をサポートする FOREGROUND_SERVICE_LOCATION
には、権限も必要です。
さらに、 Android API レベル 29 以上でアプリケーションをバックグラウンドで実行し続ける場合は、フォアグラウンドサービスまたは類似のサービスを開始する必要があります。 バックグラウンド位置のリクエストは、フォアグラウンド位置の権限のリクエストとは異なることに注意してください。 詳細については、Android のドキュメントを参照してください。 バックグラウンドで更新されたポジショニングアプリの例を参照することもできます。アプリ には、フォアグラウンドサービスの使用方法と、バックグラウンドで位置情報の更新を取得する方法が示されています。
さらに、ユーザーに自動化のリクエストが必要です。 [ 必要な権限を追加 ] セクションで、ユーザーに権限を要求する方法についての提案を確認します。
注
アプリケーションが SDK バージョン 28 以下を対象としている場合 、前の「必要な権限を追加」セクションで説明した権限をアプリがすでに要求している限り、バックグラウンドでの更新をサポートするために変更を加える必要はありません。
アプリケーションが SDK バージョン 33 以降を対象としており、フォアグラウンドサービスを使用している場合、アプリは権限 POST_NOTIFICATIONS
を要求する必要があります。
バックグラウンドで位置情報が更新されたことを示す完全な作業フローは 、 GitHub にある PositioningWithBackgroundUpdates サンプルアプリ で確認できます。 フォアグラウンドサービスを設定するために必要な手順の概要については、このチュートリアルを参照してください。
場所のオプションを指定
場所の生成時に考慮するオプションをより詳細に制御する場合は、 LocationOptions
は、オブジェクトを作成し、好みに合わせて設定して、そのオブジェクトを使用してエンジンを開始できます。
LocationOptions locationOptions = new LocationOptions();
locationOptions.wifiPositioningOptions.enabled = true
locationOptions.satellitePositioningOptions.enabled = true
locationOptions.sensorOptions.enabled = false;
locationOptions.cellularPositioningOptions.enabled = false
locationOptions.notificationOptions.smallestIntervalMilliseconds = TimeUnit.SECONDS.toMillis(30);
locationOptions.notificationOptions.desiredIntervalMilliseconds = TimeUnit.SECONDS.toMillis(60);
locationEngine.start(locationOptions);
次の表に、使用可能 なモードLocationAccuracy
の概要と、それらのモードの LocationOptions
への内部変換方法を示します。
位置精度 | 位置情報オプション |
Best_Available | cellularPositioningOptions.enabled=true satellitePositioningOptions.enabled=true wifiPositioningOptions.enabled=true sensorOptions.enabled=true notificationOptions.desired_interval_millisec =30000 (30s) notificationOptions.small_interval_millisec=1000 (11) |
NAVIGATION | cellularPositioningOptions.enabled=false satellitePositioningOptions.enabled=true wifiPositioningOptions.enabled=true sensorOptions.enabled=true notificationOptions.desired_interval_millisec =1000 (1s) notificationOptions.small_interval_millisec=1000 (11) |
sub_meter_navigation | cellularPositioningOptions.enabled=false satellitePositioningOptions.enabled=true satellitePositioningOptions.hdEnabled=true wifiPositioningOptions.enabled=true sensorOptions.enabled=true notificationOptions.desired_interval_millisec =1000 (1s)notificationOptions.small_interval_millisec=1000 (1s) |
TENS_OF_METERS | cellularPositioningOptions.enabled=false satellitePositioningOptions.enabled=false wifiPositioningOptions.enabled=true sensorOptions.enabled=true notificationOptions.desired_interval_millisec =30000 (30s) notificationOptions.small_interval_millisec=1000 (1s) |
HUNDREDS_OF_METERS | cellularPositioningOptions.enabled=true satellitePositioningOptions.enabled=false wifiPositioningOptions.enabled=true sensorOptions.enabled=false notificationOptions.desired_interval_millisec =30000 (30s) notificationOptions.small_interval_millisec=1000 (11) |
KILOMETERS | cellularPositioningOptions.enabled=true satellitePositioningOptions.enabled=false wifiPositioningOptions.enabled=false sensorOptions.enabled=false notificationOptions.desired_interval_millisec =30000 (30s) notificationOptions.small_interval_millisec=1000 (11) |
注
希望する間隔は LocationEngine
によって保証されないため、場所が多かれ少なかれ配信される可能性があります。一方、最小の間隔では、定義された値を超える頻度で場所が提供されないことが保証されます。
サブメーターナビゲーション
LocationEngine
with LocationAccuracy.SUB_METER_NAVIGATION
モードを開始すると、 HERE HD GNSS Positioning が有効になります。 HD GNSS(高解像度グローバルナビゲーション衛星システム)機能を使用すると、レーンアシスタンス、ターンバイターンガイダンス、拡張現実など、さまざまな用途に高解像度のポジショニングを行うことができます。 HD GNSS はクラウドベースのソリューションで、マスマーケットのデバイスが世界中でサブメーターの精度を達成できるようにします。
HD GNSS には、使用されている Android デバイスに特別な要件があります。 この機能が動作するには、 Android バージョンのデバイスが 12 ( API 31 )以上である必要があります。 具体的には、デバイスが以下をサポートしている必要があります。
- 生の GNSS 測定値
- GNSS キャリア位相測定( ADR )
- デュアル周波数 GNSS 受信機( L5 )
詳細については、Android のドキュメントも参照してください。
使用しているデバイスで上記の条件が満たされていることを確認する責任はユーザーにあります。 そうでない場合は、目的の精度レベルに達していない可能性があります。
上記の条件は、古いバージョンの一部の Android デバイスでも保持されます。 LocationAccuracy.SUB_METER_NAVIGATION
これらのバージョンの一部ではモードを正常に使用できますが、この操作は開発およびテストの目的でのみ行う必要があります。
従来の GNSS ソリューション(左)と HERE HD GNSS ソリューション(右)のグラウンドトラック精度の比較例。 この機能はデフォルトでは使用できませんが、個別にアクティブ化する必要があります。 HERE HD GNSS 補正データにアクセスするには、資格情報 が必要です。 詳細については、HEREにお問い合わせください。
注
LocationAccuracy.SUB_METER_NAVIGATION
モードを使用しても、どのような場合にも確実に使用されるわけではありませんが、他のポジショニングソースおよびテクノロジーにフォールバックする可能性があります。 この理由としては、デバイスに必要な機能がない、 GNSS 測定の品質が低い都市部と見なされる可能性のある環境、または資格情報 がこの機能で有効になっていない場合などが挙げられます。
座標とタイムスタンプを除き、他のすべてのフィールド Location
は、オプションです。 たとえば、受信 Location
したオブジェクトには、ベアリング角度および現在の速度に関する情報が含まれている場合がありますが、この情報は利用できないことが保証されています。 使用できない値は、 null
として返されます。 ポジショニングに使用されるソースの種類 LocationOptions
( 上記で定義 ) およびデバイスの機能によって、利用可能なフィールドが異なります。
if (location.speedInMetersPerSecond != null) {
Log.d(TAG, "Speed (m/s): " + location.speedInMetersPerSecond);
} else {
Log.d(TAG, "Speed (m/s): Not available");
}
Location
オブジェクト内に存在する horizontalAccuracyInMeters
フィールドは、「不確実性の半径」とも呼ばれ、68% の確率で真の地理座標が存在する可能性が高いエリアの推定値を提供します。これは、現在の位置の周囲にハローインジケータを描画するために使用されます。 下の図は、内側の緑色の円location.coordinates
に 、周囲の円を半径の精度の円horizontalAccuracyInMeters
として示し ています。 正確な地理座標は、精度円の内側(68%)または外側(32%)にあります。
図: 水平方向の不確実性と垂直方向の不確実性の半径。 同様に、高度の場合、 verticalAccuracyInMeters
値が10メートルの場合、実際の高度は 、 68%の確率で、高度-10mから高度+10mの範囲内にあると予想されます。 bearingAccuracyInDegrees
およびspeedAccuracyInMetersPerSecond
などの他の精度値も同じ規則に従います。不確実性が小さいほど精度が向上します。
注
Android デバイスで coordinates.altitude
は、 WGS 84 参照楕円体に関連して値が指定されます。
68% を超える確率で達成 (CEP68)
68% の確率 (CEP68) では不十分な場合、 99% の精度を達成できますか ? はい、次のとおりです。 与えられた円形誤差確率 (CEP) は自由度が 2 つのカイ (χ)2乗分布に続くため、次の式に基づいて望ましい確率を簡単に計算できます。
確率 | 不確実性の半径 |
50% | CEP50 = 0.78 x CEP68 |
60% | CEP60 = 0.90 x CEP68 |
70% | CEP70 = 1.03 x CEP68 |
80% | CEP80 = 1.19 x CEP68 |
90% | CEP90 = 1.42 x CEP68 |
95% | CEP95 = 1.62 x CEP68 |
99% | CEP99 = 2.01 x CEP68 |
上の表を使用して、マップ上のハローインジケータのさまざまな確率レベルを表示できます。 たとえば、水平方向の精度が 20 メートルの場合、半径のほぼ 2 倍の確率で 99 %を達成できます。 精度値は常に CEP68 として指定されます。つまり、次のことを意味します。
CEP99 = 2.01 x CEP68 = 2.01 x 20m = 40.2m
発見された場所の周囲に 40.2 メートルの半径を描画できるようになり ました。確率は 99% で、実際の場所はその円の内側にあります。 一方、半径 0 メートルの確率は 0% です。
法的要件
HERE SDK の位置情報機能を使用するには、前述のように、アプリケーションで HERE SDK の同意ダイアログを表示する必要があります。 ユーザーは、現在の承諾の決定を参照し、以前の承諾の決定を取り消すことができる必要があります。そうしないと、 HERE SDK の位置情報機能を使用できなくなり、代わりに Android の位置情報 API を参照する必要があります。
チュートリアル : 現在地を地図に表示
LocationIndicator
は 、マップ上のデバイスの現在位置を表すために使用されます。 インジケータが現在の位置の値で更新される前に、デフォルト Location
が設定されます。デフォルトは、最後に確認された場所、または最初の位置更新が到着する前にユーザが表示する必要がある場所です。 デフォルトでは、水平精度は半径horizontalAccuracyInMeters
のMapCircle
で表示されます。
private LocationIndicator locationIndicator;
private void addMyLocationToMap(@NonNull Location myLocation) {
locationIndicator = new LocationIndicator();
locationIndicator.setAccuracyVisualized(true);
locationIndicator.setLocationIndicatorStyle(LocationIndicator.IndicatorStyle.PEDESTRIAN);
locationIndicator.updateLocation(myLocation);
locationIndicator.enable(mapView);
MapMeasure mapMeasureZoom = new MapMeasure(MapMeasure.Kind.DISTANCE, CAMERA_DISTANCE_IN_METERS);
mapView.getCamera().lookAt(myLocation.coordinates, mapMeasureZoom);
}
private void updateMyLocationOnMap(@NonNull Location myLocation) {
locationIndicator.updateLocation(myLocation);
mapView.getCamera().lookAt(myLocation.coordinates);
}
private final static GeoCoordinates defaultLocation = new GeoCoordinates(52.520798, 13.409408);
final Location myLastLocation = locationEngine.getLastKnownLocation();
if (myLastLocation != null) {
addMyLocationToMap(myLastLocation);
} else {
final Location defaultLocation = new Location(defaultCoordinates);
defaultLocation.time = new Date();
addMyLocationToMap(defaultLocation);
}
private final LocationListener locationListener = location -> {
updateMyLocationOnMap(location);
};
スクリーンショット: マップ上の現在の位置を示す位置情報インジケータ。 上記の実装に示されているように、updateLocation()
を呼び出して、Location
オブジェクトを位置情報インジケータに渡すことができます。 この例では、ユーザーの現在の位置を追跡することを目的としています。そのため、マップビューポートの中心位置も更新されます。