Amazon Mobile App SDK の Amazon Maps API を使ってみた

なんだか嬉しくってついついオーダーしてしまった Kindle Fire HD


Android タブレットとして考えると、Google API やソフトウェアが使えないのでちょっと残念。


というわけで、Amazon が用意している Amazon Mobile App SDKAmazon Maps API を使って Kindle Fire HD で地図を表示してみたのでメモ。

Amazon Mobile App SDK のダウンロード

まずは Amazon Mobile App SDK をダウンロード。
以下のページで [Download SDK] をクリックすればダウンロードできます。

ダウンロードした Apps-SDK.zip を展開すると、Maps フォルダ、lib フォルダがあり、その中に amazonmaps-1.0.2.jar があります。

Amazon Maps API の詳細は下記ページから辿れます。

とりあえず、概要を読んでおきましょう。

Amazon Mobile App Distribution Portal でアカウントを作る

Google API で地図を表示する際には、認証キーを Google API のページからゲットして、それをコードの中に埋め込む必要がありました。
しかし、Amazon Mobile App SDK の Maps では認証キーをコードに埋め込む必要はありません。
代わりに、アプリを Amazon Mobile App Distribution Program に登録して Maps を使える様に設定する必要があります。


最初、「え?どういうこと?」と思ったのですが、簡単に言うと「世間にリリースするつもりのない”テスト”で作るアプリでも、地図を表示したければ Amazon Mobile App Distribution Program に登録する必要がある」ということです。


正直、Amazon Mobile App Distribution Program にアカウントを持っていない場合(というか作るつもりもなかった場合)は非常にハードルが高い…。
幸い、今なら Amazon Mobile App Distribution Program の登録料は無料!なので、なんとなく登録してアカウントを作っておくのも良いかもしれません。
(有料になってから解約する手間がかかるけど…)


登録は以下のページで [Create an Account] をクリックしてして必要項目を入力します。

ちなみに、下記ページに日本語の Amazon Mobile App Distribution Program の FAQ があるのでざっと目を通しておくと良いかもしれません。

実際に地図を表示するアプリを作成してみる

SDK をダウンロードしたら後はチュートリアルに従っていけば OK です。

というわけで、以下、EclipseAndroid アプリケーションのプロジェクトを作ったところから順を追って進めて行きます。


1.AndroidManifest.xml ファイルを変更
 AndroidManifest.xml についてやることは3つ。

 で、出来上がったのがこんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:amazon="http://schemas.amazon.com/apk/res/android"
    package="com.paraches.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <uses-permission android:name= "android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <amazon:enable-feature android:name="com.amazon.geo.maps" android:required="false" />

        <activity
            android:name="com.paraches.test.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


2.amazonmaps-1.0.2.jar をライブラリに加える
 外部ライブラリ?として amazonmaps-1.0.2.jar を使えるようにするだけ。
 プロジェクトの [Properties] で [Java Build path] を選択し、[Libraries] タブを表示。
 [Add External JARs] ボタンをクリックして amazonmaps-1.0.2.jar を選択して OK をクリック。


 これで amazonmaps-1.0.2.jar がプロジェクトに加わりました。


3.MapView を Layout に加える
 地図を表示する為の MapView を Layout に加えます。
 MapView は FrameLayout に乗せないとダメ!ってどこかに書いてあった気がするので、全体を FrameLayout に変更して TextView の代わりに MapView を乗せます。
 編集後の activity_main.xml はこんな感じになります。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.amazon.geo.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true" />

</FrameLayout>


4.MapActivity を設定する
 Java のコード部分、MainActivity.java を編集します。
 MainActivity を MapActivity からの継承に変更して、onCreate でズームコントローラが表示される様にします。
 加えて MapActivity の abstract メソッド isRouteDisplayed をオーバーライドします。
 MainActivity の部分はこんな感じになります。

public class MainActivity extends MapActivity {
    private MapView mMapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMapView = (MapView) findViewById(R.id.mapview);
        mMapView.setBuiltInZoomControls(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

}


5.とりあえず起動してみる
 以上で、コード部分は終了なので、とりあえず現状でアプリを起動してみます。


 はい。こんな感じで格子模様の画面が表示されました。
 左下に [NOKIA] なんて表示されているのが唯一「MapView が表示されているんだ!」と思える箇所です。


 というわけで、先に説明した様に「アプリを Amazon Mobile App Distribution Program に登録」して Maps を使える様にしないと地図は表示されません。


 以下、その手順です。


6.debug.keystore の MD5 値を確認
 Android の開発には欠かせない debug.keystore の MD5 値が必要になります。
 とりあえず、ファイルパスなんかがデフォルトのままの場合は以下のような感じで確認できます。(環境変数ごにょごにょしてるのは Mac のターミナルで文字化けしないように…)

iMac-i3-27:.android paraches$ _JAVA_OPTIONS='-Dfile.encoding=UTF-8' keytool -list -keystore ~/.android/debug.keystore
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
キーストアのパスワードを入力してください:  

*****************  警告 警告 警告  *****************
*  キーストアに保存された情報の完全性は検証されて  *
*  いません!  完全性を検証するには、キーストアの   *
*  パスワードを入力する必要があります。            *
*****************  警告 警告 警告  *****************

キーストアのタイプ: JKS
キーストアのプロバイダ: SUN

キーストアには 1 エントリが含まれます。

androiddebugkey, 2012/06/05, PrivateKeyEntry, 
証明書のフィンガープリント (MD5): AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99
iMac-i3-27:.android paraches$ 


7.Amazon Mobile App Distribution Program でアプリを登録
 Amazon Mobile App Distribution Program にログインします。

 [MyApps] タブを表示し [Add a New App] ボタンをクリックしてアプリケーションを登録します。
 リリースする気はないので、赤い星の付いた箇所だけ適当に埋めて [Save] をクリックします。


 登録したらそのまま [Maps] タブをクリックして [Add a Debug Registration] ボタンをクリックします。


 登録したアプリの [Package name] と [Developer signature] を入力して [Submit] ボタンをクリックします。
 Developer signature は先ほど確認した MD5値です。


 [Status] が [Active] になっているのを確認。


 以上で、登録したアプリケーションで Maps API が使えるようになりました。


8.でも地図は表示されない!!!
が、しかし、すぐには地図が表示されるようにはなりません。


自分の場合、ここで「なんで表示されないの??? わっかんねぇ〜よ!」と投げ出してしまったので正確にどれくらいの時間で表示されるようになったのかわかりませんが、24時間後には表示されるようになっていました。(たぶん2〜3時間で反映されるんじゃないかと思うけど…)


でも、日本の地図を表示するとこんな感じにスッカスカです…。
ここまで頑張ってあれこれやってきたのに、日本の地図がこんな状態じゃ使えないよ…。
因に YOLP の Android マップSDK と比べてみるとこんな感じ。どっちも東京スカイツリー周辺で YOLP の方が少し広範囲を表示しています。


一応、FAQ にはこんな質問がありました。

Q: Amazon Maps が利用できる国はどこですか?
Amazon Mapsはグローバル規模でマップタイトルを表示することができます。一部の国(日本など)ではマップの詳細表示を制限していますが、大部分の国では詳細表示も許可しています。

日本ではマップの詳細表示を制限してるんだって…。
あ〜大人の事情があるんだろうな〜。