sola's note -9ページ目

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端末でやってください。
Slim3でブロブストアを使おうとすると、想定外の挙動になることがある

Slim3でブロブストアを使おうとした時のこと。

Slim3がブロブストアをカバーしていないような気もするけれど、
ブロブストアも使いたいんだよという時に、無理やり使う場合は注意。
(もしかしたら使い方がイレギュラーだったのかもしれないけど…。)

ブロブストアは、アップロードで指定したサーブレットを通さずに直接ブロブストアにファイルを送ります。
ファイルをアップロードする際に指定したformのaction先には、
ブロブストアにアップロードした後、アップロード情報を返します。

×JSP→Servlet→ブロブストア
○JSP→ブロブストア→Servlet

という流れ。

で、Slim3だと何がまずいかというと、

ブロブストア→Servlet

でServletの処理に移った時に、リクエストパラメータを使う場合。
通常リクエストパラメータを取得する場合は、

String hogehoge = request.getParameter("hogehoge");

としますが、
Slim3では

String hogehoge = asString("hogehoge");

とします。
しかし、ブロブストアアップロード後の場合、
Slim3の

String hogehoge = asString("hogehoge");

という方法でパラメータを取得しようとすると、
どうやら取得内容がnullになる模様です。

同時に、Validatorも使えません。
(requiredを設定していると、必須エラーになります。)

細かい解析はしていないので、
原因はわかりませんが、気を付けて下さい。

ちなみに、

String hogehoge = request.getParameter("hogehoge");

では取得可能でした。

ローカルテスト環境では再現しないので、
確認する場合はデプロイした後が良いです。
普段あまり使わないjQuery。忘れないうちにメモ。
GAEのフレームワークSlim3でjQueryのPOST使う時。

今回やったのは大きく2パターンあって、

$.postと$.ajax

違いは、前者は処理結果(success or error)を判別しない。
後者は処理結果を判別する。
処理に失敗した時に挙動を分けたい時は後者を使うといいかも。

下記はURL「/hoge」に対して、パラメータ「id=tarou」を送って、
返ってきたデータを
<div id="res"></div>
に表示させる方法。

$.postの場合

$(function(){
    //IDの存在チェック
    $("#checkId").click(function () {
        $.post("/hoge",{"id":"tarou"},
            function(data,status){
                $("#res").html(data);
            }
                ,"html"
            );
    });
});



<div id="res"></div>


$.ajaxの場合

$(function(){
    //IDの存在チェック
    $("#checkId").click(function () {
        $.ajax({
            type: "POST",
            url: "/hoge",
            data: "id=tarou",
            success : function(data,status){
                $("#res").html(data);
            },
            error:function(){alert("エラーです。");},
            dataType:"html"
        });
    });
});



<div id="res"></div>


POST先、「/hoge」の処理(Controllerのrunメソッドです。)

@Override
public Navigation run() throws Exception {

    //レスポンスのエンコード
    response.setContentType("text/html; charset=UTF-8");

    //リクエストパラメータをStringとして取得
    String id = asString("id");

    //レスポンスにセット
    String message = id;

    response.getWriter().write(message);
    return null;
}

これでとりあえず何とかなります。
疎通しかやってないので、$.ajaxのerrorが本当に機能してるかは未確認です。

ちなみにIDをinputから取得したい場合は

data: "id=" + $("#id").val()

とすると出来る。