背景
ファーウェイのHMSを使って、GMSなしでGoogleマップアプリと同じものを作ってみました。最終的には無事に作れました。しかし、作っているときにはまった部分があったので、その原因を書こうと思います。
アプリのターゲット機能
機能 | キット |
---|---|
地図表示 | Map Kit |
ジェスチャー | Map Kit |
コンパス | Map Kit |
ズーム | Map Kit |
現在地 | Location Kit |
キーワード検索 | Site Kit |
ロケーション情報検索 | Site Kit |
APIキーの受け渡し
特定なキットを利用するのに、APIキーを渡さなければなりません。
今回利用するキットはMap Kit、Location Kit、Site Kitです。Map KitとSite KitではAPIキーの受け渡しが必要です。
下記はHMSの公式ドキュメントに書かれたAPIキーの渡し方です。
Map Kit
方法1
// In the entrance class (inherited from android.app.Application) of the app,
// call the setApiKey method in the overridden onCreate() method.
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// Set the API key.
MapsInitializer.setApiKey("Your API Key");
}
}
方法2
// FragmentまたはMapViewの中でAPIキーを渡す
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate: ");
super.onCreate(savedInstanceState);
// Set the API key before calling setContentView.
MapsInitializer.setApiKey("Your API Key");
setContentView(R.layout.basic_demo);
}
簡単にいうと、MapsInitializer.setApiKey("Your API Key")を実行するというわけです。
Site Kit
// Declare a SearchService object.
private SearchService searchService;
// Instantiate the SearchService object.
searchService = SearchServiceFactory.create(this, "API key");
実行結果(失敗)
上記の方法に従って実行してみると…
原因
原因はSite Kitに渡すAPIキーです。Map KitではAPIキーをそのまま渡せばよいですが、Site Kitの場合、APIキーをエンコードしてから渡さなければなりません。
実行結果(成功)
次のようにソースコードを直して試してみたら…
searchService = SearchServiceFactory.create(this, URLEncoder.encode("API key", "utf-8"));