基地局を利用した位置情報提供機能 | sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

参考:http://www.dcm-gate.com/fordeveloper/android/location.html

docomoのAndroid向けの位置情報取得用APIが公開されました。
Androidアプリで位置情報を扱う場合の手段の一つとして、使うことが出来ます。

利用申請から実装までの手順を纏めたので
Androidアプリで位置情報を使う時等の参考にして下さい。

※Androidアプリ開発の経験が無いので、http通信の設定等、適切ではない部分があるかもしれません。
アプリの実装に詳しい人は処理をカスタマイズして使ってください。

■サービス概要
サービス提供開始:2011年3月31日
測位方法:基地局測位
対象者:spモード加入者(BlackBerryは除く)

となります。
それぞれ簡単にコメントすると、

・2011年3月31日
→運悪く震災が起きてしまったのもあってか、
まだあまり一般に普及していない感じがあります。

・基地局測位
→GPS測位ではないので、精度は少し落ちます。
大雑把な測位や、建物内での測位に向いています。
そもそも測位が何か分からない場合は「GPS」、「基地局」、「測位」等の言葉で検索して下さい。

・spモード加入者
→docomoがスマートフォンユーザ向に提供しているサービスです。
API利用時にspモード専用網を使っているようなので、
spモードに入らなくても使えるという裏技とかは存在しません。
よって、Android Marketでアプリを公開する場合は利用キャリアの制限をかけるか、
アプリにspモードに入っていなくても使える測位方法を搭載するかした方がいいと思います。
※spモードが使えないと確実に測位が失敗します。

参考で記載したURL先のインタフェース仕様書にも記載がありますが、
APIの利用はhttps通信での実行となります。
その他利用時の詳細はリンク先のインタフェース仕様書を確認してください。

ここではアプリにAPIを実装するまでの流れを取り上げます。

■実装までの流れ
1.API利用申請書とAPI利用フォーマットを取得する。
2.API利用申請書を印刷して必要なサインをして、再びPCに取り込む。
3.API利用フォーマットに開発者及びAPIを実装するAndroidアプリケーションに関する情報を入力する。
4.(2.)で用意したAPI利用申請書(サイン済み)の画像と、(3.)のAPI利用フォーマットを
API利用フォーマットの1シート目に記載されているML宛てに送付する。
5.docomoの担当者からAPIを利用するのに必要なAPIキーを受け取る。
6.実装

■実装までの流れ(詳細)
1.API利用申請書とAPI利用フォーマットを取得する。
→Android向けアプリケーション開発者様用技術情報ページ
(http://www.dcm-gate.com/fordeveloper/android/location.html)
からAPI利用申請書とAPI利用フォーマットを取得します。

2.API利用申請書を印刷して必要なサインをして、再びPCに取り込む。
→(1.)で取得した「API利用申請書.pdf」を印刷して、説明に従って必要なサインをします。
サインをしたら、再びスキャナやデジカメで電子データとして記録し、PCに取り込みます。
※API利用申請書の内容にサインしていることが重要みたいなので、API利用申請書は全て取り込んでください。

3.API利用フォーマットに開発者及びAPIを実装するAndroidアプリケーションに関する情報を入力する。
→(1.)で取得した「API利用フォーマット.xls」を開いて、
・サービス提供名称
・連絡先住所(都道府県)
・連絡先住所2(市区町村)
・連絡先住所3
・電話番号
・メールアドレス
・サービス名称
・サービス概要
に対して入力します。
残念ながらどれが必須で、どれが書かなくても良いのかというのは分かりません。
申請してから返事が返ってくるまで数日時間がかかる事があるので、
せっかちな人は丁寧に全て埋めた方がいいです。

4.(2.)で用意したAPI利用申請書(サイン済み)の画像と、(3.)のAPI利用フォーマットを
API利用フォーマットの1シート目に記載されているML宛てに送付する。

送付時、個人情報が平分で流れる事が嫌な人は、なんらかしらの手段で暗号化をして下さい。
(勿論docomo担当者にパスワードが分かるように・・・。)

5.docomoの担当者からAPIを利用するのに必要なAPIキーを受け取る。
→APIに使うキーを二つ受け取ります。これを元にAPIを実装します。

6.実装
→下記に最低限必要な処理を挙げます。
必要に応じて例外処理やメソッドの分割をして下さい。

※「XXXXXXXXXX」と「YYYYYYYYYY」にはdocomoから受け取ったAPIキーを設定して下さい。

//リクエストボディ生成
StringBuffer strBuffer = new StringBuffer();
strBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
strBuffer.append("<DDF ver=\"1.0\">");
strBuffer.append("<RequestInfo>");
strBuffer.append("<RequestParam>");
strBuffer.append("<APIKey>");
strBuffer.append("<APIKey1_ID>XXXXXXXXXX</APIKey1_ID>");
strBuffer.append("<APIKey2>YYYYYYYYYY</APIKey2>");
strBuffer.append("</APIKey>");
strBuffer.append("<OptionProperty>");
strBuffer.append("<AreaCode></AreaCode>");
strBuffer.append("<AreaName></AreaName>");
strBuffer.append("<Adr></Adr>");
strBuffer.append("<AdrCode></AdrCode>");
strBuffer.append("<PostCode></PostCode>");
strBuffer.append("</OptionProperty>");
strBuffer.append("</RequestParam>");
strBuffer.append("</RequestInfo>");
strBuffer.append("</DDF>");
String params = strBuffer.toString();

//POSTの準備
String url = "https://api.spmode.ne.jp/nwLocation/GetLocation";
HttpPost method = new HttpPost(url);

//リクエストヘッダの設定
method.setHeader("Host", "api.spmode.ne.jp");
method.setHeader("Content-Type", "Application/xml; charset=UTF-8");

// クライアント生成
DefaultHttpClient client = new DefaultHttpClient();

// POSTデータ(ボディ)の設定
StringEntity paramEntity = new StringEntity(params);
paramEntity.setChunked(false);
paramEntity.setContentEncoding("UTF-8");
paramEntity.setContentType("Application/xml; charset=UTF-8");
method.setEntity(paramEntity);

//リクエスト投げる
HttpResponse response = client.execute(method);

//レスポンスからデータを取得
EntityUtils.toString(response.getEntity(), "UTF-8");

以上です。
レスポンスで受け取ったデータはXML形式なので、
お好みの形式に変換してください。

■注意
勿論ですがspモードに加入していないと利用できないので、
動作テストする場合はエミュレータは使えません。
(確実に測位に失敗します。)

よって実際に測位のテストを行う場合は、
spモード加入済みのSIMが入ったAndroid端末でやってください。