HERE SDKを統合する
このチュートリアルでは、地図を表示するAndroidアプリケーションを開発します。
- HERE SDKを既存のアプリケーションに統合する場合は、新しいプロジェクトを最初からセットアップする最初の手順は飛ばしてかまいません。
- HERE SDK の一部の機能を紹介しているサンプル アプリの実行から始める場合は、こちらのチュートリアルをご覧ください。
前提条件
資格情報と HERE SDK フレームワークへのアクセス権があることを確認します。詳細については、「利用開始」を参照してください。
新しいプロジェクトを作成する
Android Studioが推奨IDEです。Androidの開発が初めての場合は、基本を学ぶためにdeveloper.android.comにあるガイドを参照してください。
注生成された「HelloMap」アプリケーションは、Java版およびKotlin版がGitHubで公開されています。 HERE SDK for Android (Explore) およびHERE SDK for Android (Navigate) 用のより詳細なコード例も提供されています。
- 「HelloMapKotlin」アプリは、Javaの同様のアプリと同じように、XMLベースのレイアウトを使用しています。それ以外のKotlinアプリはすべてJetpack Composeと宣言型UIアプローチを採用しています。
- さらに、「HelloMap」アプリでは、コンパスやマップルーラーなどの機能を使用して地図を装飾する方法も示されています。これらのオプション要素は、HERESKUnitsプロジェクトに示されているように、アプリ側で作成できます。
Android Studio (このガイドはバージョンAndroid Studio Narwhal 4 Feature Drop | 2025.1.4に基づいています) を起動し、
- [Start a new Android Studio Project](新しいAndroid Studioプロジェクトを開始) を選択して新しいプロジェクトを作成します。
- [Phone and Tablet](携帯電話とタブレット)、[Empty Views Activity](空のビューのアクティビティ) の順に選択して [次へ] をクリックします。
- プロジェクト名を入力 (例:「HelloMap」) し、言語としてJavaまたはKotlinを選択します。
- [Minimum API level](最小APIレベル) の横でAPI 24を最小Android SDKとして設定します。
- [Build configuration language](設定言語をビルド) を選択します。
- [保存場所] で適切なディレクトリが選択されていることを確認し、[完了] をクリックして続行します。
AndroidXサポートライブラリを使用できます。通常、これらは新しい Android Studio プロジェクトを作成するときにデフォルトで追加されることに注意してください。
ウィザードが終了したら、必ず何も設定していないプロジェクトを構築し、エミュレータ (またはデバイス) でそれを実行します。すべてうまくいけば、「Hello World」というテキストが表示されます。
注JAVAとKotlinは完全にサポートされています。HERE SDK は JAVA 用にコンパイルされており、API リファレンスは JavaDoc に基づいています。ただし、JAVA は Kotlin と 100% 相互運用可能です。
特に記載がない限り、この開発者ガイドのコードスニペットはJAVAで記述されています。以下では、タブスイッチャーを使用して、お好みのプログラミング言語を選択できます。
動作するAndroidアプリケーションができたら、アプリの機能を検討します。このチュートリアルでは、エミュレータまたはデバイスにマップビューを表示することが目標です。
次のステップの概要は以下のとおりです。
- Gradleスクリプトを調整してHERE SDKを統合する。
- 必要な資格情報を設定する。
- HERE SDK を初期化する。
- メイン アクティビティのレイアウト ファイルにマップ ビューを追加する。
- 最初のマップ シーンを読み込むコードを追加する。
注HERE SDK のすべての機能はエミュレータからアクセスできますが、実際のデバイスで機能を使用することを強くお勧めします。全体的なパフォーマンスが向上し、ジェスチャーなどの一部の機能はマルチタッチ対応のハードウェアの方が簡単に使用できます。マップ ビューのレンダリングはモバイル機器の GPU に合わせて最適化されています。
最初のステップから始めて、HERE SDKをプロジェクトに追加する方法を確認してみましょう。
Android Archiveを統合する
アプリケーションに含めるHERE SDKフレームワークアーカイブなどの最新のリリースアーティファクトを入手します (heresdk-xx-xx.aar)。
注ArtifactoryのサポートおよびMavenを通じたSDKの依存関係管理にはまだ対応していません。そのため、HERE SDK ライブラリ (AAR) を手動でダウンロードして統合する必要があります。
HERE SDK AAR ファイル (*.aar) をアプリケーションの app/libs フォルダーにコピーします。フォルダーが自動で作成されない場合は作成してください。
次に、以下を追加することで、アプリレベルのbuild.gradleファイル内の依存関係のクロージャーを拡張し、*.aarファイル (HERE SDK AARの場合) と*.jarファイル (たとえば、単体テストのオプションのheresdk-mock.jarの場合) がすべて含まれていることを確認します。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
...
}dependencies {
implementation(fileTree(mapOf(
"dir" to "libs",
"include" to listOf("*.aar", "*.jar"),
"exclude" to listOf("*mock*.jar")
)))
...
}
注このガイドはHERE SDKバージョン4.25.5.0に基づいています。お使いのAARバージョンがこのガイドで使用しているバージョンと異なる場合は手順が異なることがあり、アプリのソースコードの調整が必要になる可能性があります。
それでは、[Sync Now](今すぐ同期) ボタンをクリックして HERE SDK を統合します。または、Android Studio のメニューバーに移動して [File](ファイル) を選択し、[Sync Project with Gradle Files](プロジェクトを Gradle ファイルと同期) を選択します。
資格情報を設定する
HERE SDK を使用する際には、一連の資格情報を使用してアプリケーションを認証する必要があります。
資格情報を手元に用意したら、HERE SDK を初期化する際に、プログラムで一連の資格情報を追加します (次のステップを参照)。
資格情報はパッケージ名に関連付けられているのではなく、資格情報の取得に使用されるアカウントに関連付けられています。複数のアプリに同じ資格情報を使用する場合は、システム内のアプリを区別するためにスコープを設定する必要もあります。
HERE SDK を初期化する
HERE SDK は自動的に初期化されません。代わりに、HERE SDK を初期化するタイミングを自由に決定できます。初期化はメイン スレッド上で同期的に行われ、約 100 ミリ秒かかります。
注資格情報が無効であっても、HERE SDK の初期化は成功します。資格情報が有効かどうかを確認する最良の方法は、機能エンジンを試すことです。資格情報が無効である場合は専用のエラー列挙型 (enum) 値になります。一部の機能では、他の機能よりも多くの権限が必要になる場合があります。たとえば、Explore用に取得した資格情報をExploreのサブセットの一部ではない
OfflineSearchEngineで使用すると、エラーが発生します。
HERE SDKの機能を使用する前に、次のメソッドを実行してHERE SDKを初期化します。
import android.content.Context;
import com.here.sdk.core.engine.AuthenticationMode;
import com.here.sdk.core.engine.SDKNativeEngine;
import com.here.sdk.core.engine.SDKOptions;
import com.here.sdk.core.errors.InstantiationErrorException;
...
private void initializeHERESDK() {
// Set your credentials for the HERE SDK.
String accessKeyID = "YOUR_ACCESS_KEY_ID";
String accessKeySecret = "YOUR_ACCESS_KEY_SECRET";
AuthenticationMode authenticationMode = AuthenticationMode.withKeySecret(accessKeyID, accessKeySecret);
SDKOptions options = new SDKOptions(authenticationMode);
try {
Context context = this;
SDKNativeEngine.makeSharedInstance(context, options);
} catch (InstantiationErrorException e) {
throw new RuntimeException("Initialization of HERE SDK failed: " + e.error.name());
}
}import android.content.Context;
import com.here.sdk.core.engine.AuthenticationMode;
import com.here.sdk.core.engine.SDKNativeEngine;
import com.here.sdk.core.engine.SDKOptions;
import com.here.sdk.core.errors.InstantiationErrorException;
...
private fun initializeHERESDK() {
// Set your credentials for the HERE SDK.
val accessKeyID = "YOUR_ACCESS_KEY_ID"
val accessKeySecret = "YOUR_ACCESS_KEY_SECRET"
val authenticationMode = AuthenticationMode.withKeySecret(accessKeyID, accessKeySecret)
val options = SDKOptions(authenticationMode)
try {
val context = this
SDKNativeEngine.makeSharedInstance(context, options)
} catch (e: InstantiationErrorException) {
throw RuntimeException("Initialization of HERE SDK failed: " + e.error.name)
}
}キーとシークレットの正しい資格情報を挿入してください。makeSharedInstance() を呼び出すことで、HERE SDK を使用するために必要なものをすべて初期化します。HERE SDK のコア クラスは SDKNativeEngine と呼ばれています。内部的には、HERE SDK によって提供される他のエンジンでこのインスタンスが使用されます。
初期化では android.content.Context を設定する必要があります。代わりにApplicationContextも使用できますが、必須ではありません。マップ キャッシュへのデフォルト パスを内部的に設定する場合にのみ Context が必須です。
レイアウトからMapViewにアクセスする前に、MainActivityのonCreate()メソッドでinitializeHERESDK()を呼び出す方法の例は以下のとおりです。常にメインスレッドでinitializeHERESDK()を呼び出します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Usually, you need to initialize the HERE SDK only once during the lifetime of an application.
// Before creating a MapView instance please make sure that the HERE SDK is initialized.
// Since in this example we inflate the MapView from a layout, make sure to initialize
// the HERE SDK before calling setContentView(...).
initializeHERESDK();
setContentView(R.layout.activity_main);
...
}override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Usually, you need to initialize the HERE SDK only once during the lifetime of an application.
// Before creating a MapView instance please make sure that the HERE SDK is initialized.
// Since in this example we inflate the MapView from a layout, make sure to initialize
// the HERE SDK before calling setContentView(...).
initializeHERESDK()
enableEdgeToEdge()
// Note that this example uses XML layouts. If you want to use Jetpack Compose,
// take a look at other example apps on GitHub, for example,
// "RoutingKotlin" uses declarative UIs with Jetpack Compose.
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
...
}initializeHERESDK()と同様に、HERE SDKを配置してリソースを解放することもできます。
private void disposeHERESDK() {
// Free HERE SDK resources before the application shuts down.
// Usually, this should be called only on application termination.
// Afterwards, the HERE SDK is no longer usable unless it is initialized again.
SDKNativeEngine sdkNativeEngine = SDKNativeEngine.getSharedInstance();
if (sdkNativeEngine != null) {
sdkNativeEngine.dispose();
// For safety reasons, we explicitly set the shared instance to null to avoid situations,
// where a disposed instance is accidentally reused.
SDKNativeEngine.setSharedInstance(null);
}
}private fun disposeHERESDK() {
// Free HERE SDK resources before the application shuts down.
// Usually, this should be called only on application termination.
// Afterwards, the HERE SDK is no longer usable unless it is initialized again.
SDKNativeEngine.getSharedInstance()?.dispose()
// For safety reasons, we explicitly set the shared instance to null to avoid situations,
// where a disposed instance is accidentally reused.
SDKNativeEngine.setSharedInstance(null)
}MainActivityのonDestroy()メソッドでdisposeHERESDK()を呼び出す方法の例を以下に示します。
@Override
protected void onDestroy() {
mapView.onDestroy();
disposeHERESDK();
super.onDestroy();
}override fun onDestroy() {
mapView?.onDestroy()
disposeHERESDK()
super.onDestroy()
}「エンジン」セクションには、他にもHERE SDKを初期化する方法が記載されています。
マップ ビューを追加する
SDKがプロジェクトと資格情報に統合されたため、続いて新しいMapViewインスタンスを追加できます。
MainActivity のレイアウト ファイル (通常は activity_main.xml という名前) を開き、"Hello World" TextView を削除します (Android Studio のウィザードを使用した場合)。デフォルトでは、マップビューを配置できるConstraintLayoutが作成されます。他のすべてのレイアウトの親も適しています。
先ほど[Empty Views Activity](空のビューのアクティビティ) を選択したため、この例ではJetpack Composeを組み込むことなく、非宣言型XMLレイアウトを使用します。
または、Jetpack ComposeとKotlinを宣言型UIで使用することもできます。Jetpack Composeを使用してマップビューを追加する方法に関するチュートリアルは、こちらを参照してください。
XMLレイアウトでJavaまたはKotlinを使用している場合、次のコードを追加します。
<com.here.sdk.mapview.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.here.sdk.mapview.MapView>ConstraintLayoutにはフラットなビュー階層があり、Android Studioのレイアウトエディターとうまく連携するというメリットがありますが、こうしたメリットを利用するかどうかはユーザー次第です。SDK の MapView は他の Android View とまったく同じように動作します。
レイアウトファイルからマップビューが作成されているようです。これも初期化する必要があります。初期化するには、MainActivity (またはマップビューを表示する他のActivity) のonCreate()メソッドを次のように更新します。
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Usually, you need to initialize the HERE SDK only once during the lifetime of an application.
initializeHERESDK();
setContentView(R.layout.activity_main);
// Get a MapView instance from the layout.
mapView = findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
...
}private var mapView: MapView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Usually, you need to initialize the HERE SDK only once during the lifetime of an application.
// Before creating a MapView instance please make sure that the HERE SDK is initialized.
initializeHERESDK()
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
// Get a MapView instance from the layout.
mapView = findViewById(R.id.map_view)
mapView?.onCreate(savedInstanceState)
...
}MapViewが未解決のシンボルであるというエラーが表示されるため、自動完了ホットキーを使用してcom.here.sdk.mapview.MapViewをインポートリストに追加するか、手動で追加します。
追加の初期化タスクを実行するには、mapView.onCreate() を呼び出すことが重要です。そうしないと、地図はレンダリングされません。同じレイアウトの一部として複数の MapView インスタンスを作成し、1 つの画面にレンダリングできます。
initializeHERESDK()では、setContentView()が呼び出される前にHERE SDKを初期化します。レイアウトでMapViewを使用するため、HERE SDKを事前に初期化する必要があります。
マップ シーンを読み込む
デバイスの画面に地図を表示する前に、マップデータのレンダリング方法を決定します。そのため、地図の外観をカスタマイズできるようにするシーンを非同期で読み込む必要があります。シーンを読み込むと、SDKに付属しているデフォルトのマップスタイルのいずれかが使用されます。
いくつかのコード行を追加することで、MainActivity クラスからマップ シーンを読み込むことができます。たとえば、次のメソッドを追加し、アクティビティが作成されたときや、アプリでリクエストされたすべての Android 権限が付与されたときに呼び出します。
private void loadMapScene() {
// The camera can be configured before or after a scene is loaded.
double distanceInMeters = 1000 * 10;
MapMeasure mapMeasureZoom = new MapMeasure(MapMeasure.Kind.DISTANCE_IN_METERS, distanceInMeters);
mapView.getCamera().lookAt(new GeoCoordinates(52.530932, 13.384915), mapMeasureZoom);
// Load a scene from the HERE SDK to render the map with a map scheme.
mapView.getMapScene().loadScene(MapScheme.NORMAL_DAY, new MapScene.LoadSceneCallback() {
@Override
public void onLoadScene(@Nullable MapError mapError) {
if (mapError != null) {
Log.d("HelloMap", "Loading map failed: mapError: " + mapError.name());
}
}
});
}private fun loadMapScene() {
// Load a scene from the HERE SDK to render the map with a map scheme.
mapView?.mapScene?.loadScene(MapScheme.NORMAL_DAY) { mapError ->
if (mapError == null) {
val distanceInMeters = (1000 * 10).toDouble()
val mapMeasureZoom = MapMeasure(MapMeasure.Kind.DISTANCE_IN_METERS, distanceInMeters)
mapView?.camera?.lookAt(GeoCoordinates(52.530932, 13.384915), mapMeasureZoom)
} else {
Log.d(TAG, "Loading map failed: mapError: " + mapError.name)
}
}
}onCreate() で説明したように、上記のコードを追加した後で、未解決のパッケージを解決する必要があります。
onCreate() 内から、または Android 権限が付与されたら、loadMapScene() を呼び出します。この「HelloMap」アプリケーションでは、権限の処理は任意の手順です。特別な権限は必要ありません。
@Override
protected void onCreate(Bundle savedInstanceState) {
...
loadMapScene();
}override fun onCreate(savedInstanceState: Bundle?) {
...
loadMapScene()
}HERE SDK で利用できるほとんどのコールバックと同様に、シーンの読み込みが完了すると onLoadScene() がメイン スレッドで呼び出されます。MapError が null でない場合はエラーの内容が表示されます。
MapViewからCameraにアクセスして、地図の中央に配置する場所やズームレベル (カメラの地球までの距離で指定) などのカスタム地図パラメーターを設定できます。MapView インスタンスが使用可能になるとすぐに Camera を設定できます。ただし、変更内容は onLoadScene() が完了した後にのみ有効になります。
演習として、上記で使用されている MapScheme スタイルを MapScheme.SATELLITE に置き換えることができます。どのような結果になりましたか?通常の夜間スキームなど、他のマップスキームも試してみてください。
マップレイヤーを試す
HERE SDK for Android Navigateを使用している場合、利用可能なマップレイヤーのいずれかを試すことができます。たとえば、目立つランドマークのテクスチャ付き3Dモデルを有効にするには、次のコードラインをonLoadScene()内に追加します。
Map<String, String> mapFeatures = new HashMap<>();
mapFeatures.put(MapFeatures.LANDMARKS, MapFeatureModes.LANDMARKS_TEXTURED);
mapView.getMapScene().enableFeatures(mapFeatures);val mapFeatures: MutableMap<String, String> = HashMap()
mapFeatures[MapFeatures.LANDMARKS] = MapFeatureModes.LANDMARKS_TEXTURED
mapView?.mapScene?.enableFeatures(mapFeatures)有効期間を処理する
最後に、アクティビティの有効期間が終了したらクリーン アップすることをお勧めします。先ほど示したように、残りのリソースをすべて安全に解放するための mapView.onDestroy() メソッドと SDKNativeEngine.getSharedInstance().dispose() が HERE SDK for Android には用意されています。
いずれにしてもアプリをシャットダウンする場合、SDKNativeEngine の破棄は必須ではありません。ただし、破棄してもデメリットはなく、進行中のリクエストをキャンセルして HERE SDK サービスをシャットダウンすることが推奨事項であると考えられています。一方で、アクティビティの 1 つだけが破棄され、アプリの他の部分では HERE SDK が必要な場合は、HERE SDK をあまりにも早い段階で破棄しないように注意してください。一般的に、Activity ごとに HERE SDK を初期化/配置することも可能です。
さらに、Activity が一時停止しているときにマップ ビューのレンダリングを一時停止し、マップ ビュー インスタンスの状態を保存することをお勧めします。次のコードを MainActivity クラスに追加します。
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
mapView.onDestroy();
disposeHERESDK();
super.onDestroy();
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
mapView.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}override fun onPause() {
mapView?.onPause()
super.onPause()
}
override fun onResume() {
mapView?.onResume()
super.onResume()
}
override fun onDestroy() {
mapView?.onDestroy()
disposeHERESDK()
super.onDestroy()
}
override fun onSaveInstanceState(outState: Bundle) {
mapView?.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}ビルドして実行する
次に、アプリを構築して実行します。すべてがうまくいけば、ビューの全領域をカバーする HERE マップが表示されます。

Screenshot: Showing main map scheme.

Screenshot: Showing 3D landmarks (only available for Navigate).

Screenshot: Showing satellite map scheme.
次のステップ
- HERE SDKの機能の詳細については、「機能一覧」トピックを参照してください。
- HERE SDKを使用してAndroid Auto用に開発する方法については、「Android Autoと統合する」を参照してください。
7 日前の更新