MapViewを使用するソフトウェアでは、リリース用のapiキーとデバック用のapiキーが必要になる。
従ってレイアウトのxmlファイルに2つMapViewの記述を用意して、リリース時にコメントアウト切り替えを行うか、layoutファイルを使用しないといった少々面倒な事をする必要がある。

XMLで切り替えをする例


<!--
<com.google.android.maps.MapView
android:id="@+id/mapview"
android:apiKey="@string/mapkey"
android:apiKey="hogehoge Release apiKey"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
/>
-->
<com.google.android.maps.MapView
android:id="@+id/mapview"
android:apiKey="hogehoge Debug api key"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
/>

リリース版にデバック用のapiキーを間違えて使用してしまう等のリスクを下げるため、リリース時にはリリース版のapiキーを自動的に使用する仕組みがあると便利である。

先日の記事、「Android MapViewで使用するapiKeyの共有」にて、MapViewで使用するapiキーをグループ内で、共有するという記事を書いたが、この少々乱暴な手法を拡張して、最初からリリースキーで開発してしまえばいいのでは?と思ったりもしたが、さすがにそれはやってはいけないので違うしくみを作ってみた。

リリース版とデバック版を判断する場所

リリース時に必ず変更する場所や必ずチェックする場所はどこかと考えると、Manufest.xmlのバージョン番号とバージョンコード部分である。従って、リリース版とデバック版の判断をすべき区別をManufest.xmlで行う事にした。


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.taosoftware.android.silentarea"
android:versionCode="1"
android:versionName="1.0.0"
<application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".Main"
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>

上記コードの、android:debuggable="true"の部分を判断フラグとして利用する。
つまり

  • android:debuggable="true" デバック版
  • android:debuggable="false" リリース版

ちなみにこの、debugableフラグを使っている人はあまりいないと思うが、記載がない場合はfalseとして扱われる。

プログラム内部からdebugableの参照

これは特に難しくなく以下のコードを作成した。


public static boolean  isDebugAble(Context ctx){
PackageManager manager = ctx.getPackageManager();
ApplicationInfo appInfo = null;
try {
appInfo = manager.getApplicationInfo(ctx.getPackageName(), 0);
} catch (NameNotFoundException e) {
Log.e(e.toString());
return false;
}
if((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE) return true;
return false;
}

上記メソッドで、Manifestファイルのdebuableがtrueかfalseかが判断できる。

Apiキーの切り替え

上記判断メソッドを用いて、リリース用のapiキーとデバック用のapiキーを文字リソースあたりに格納して、MapViewのコンストラクターに渡す。


if(isDebugAble(this)){
Log.v("debug");
apiKey = getString(R.string.mapkey_debug);
}else{
Log.v("release");
apiKey = getString(R.string.mapkey_release);
}
MapView mapView = new MapView(this, apikey);

上記のようにapiキーを切り替えればリリース時には、Manufestファイルだけを編集すれば良い事になる。

コード内でMapViewを生成するのではなく、layoutファイルに記載して切り替える方法については、また後日記事にします。

ブログ内の関連する記事