通常コンテンツ取得V4をAndroidから使う 
木曜日, 12月 30, 2010, 04:54 PM - ウキウキView
前回は長いURLでコンテンツ取得をしました。
今回はこれをAndroid側でどうやって取得して使うかについてです。

Android側で使う場合は次の2ステップで処理をします。
・HTTPリクエストを送信し、文字列として取得する
・取得した文字列をJSONとしてパースする
以下ではこの2つについて説明します。


HTTPリクエストを送信し、文字列として取得する


まずHTTPリクエストとなるURLを作ります。
作成するURLについては前回と同じですが、
これをHttpClientを使ってAndroidのコードで書くと次のようになります。
この例ではjsonString変数にコンテンツの文字列が格納されます。

HttpClient httpClient = new DefaultHttpClient();  
HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);

// コンテンツ取得処理
DecimalFormat df = new DecimalFormat("0.000000");
String lat = df.format((double)geoPoint.getLatitudeE6() / 1E6d);
String lng = df.format((double)geoPoint.getLongitudeE6() / 1E6d);

// HTTP通信用のURLを作成する
String url = "https://www.uki2view.jp/uki2/message/message/v4/"
+ "?apikey=" + apiKey
+ "&lat=" + lat
+ "&lng=" + lng
+ "&range=7"
+ "&sort=1"
+ "&term=full"
+ "&model=" + model;

// HTTP通信を行ってjsonの文字列を取得する
String jsonString = null;
try {
HttpGet objGet = new HttpGet(url);
HttpResponse objResponse = httpClient.execute(objGet);
if (objResponse.getStatusLine().getStatusCode() < 400) {
StringBuilder sb = new StringBuilder(2<<12);
Reader in = new InputStreamReader(objResponse.getEntity().getContent());
char[] buf = new char[2 << 12];
int r;
while ((r = in.read(buf, 0, buf.length)) != -1) {
sb.append(buf, 0, r);
}
in.close();
jsonString = sb.toString();
}
} catch (IOException e) {
Log.d(LearnUkiukiWeb.TAG, e.getMessage(), e);
}


取得した文字列をJSONとしてパースする


上記で取得したコンテンツの情報は、
jsonの形でjsonString変数に格納されていますので、
それを分解してアプリ側で使える様に変換します。
次のコードのUkiukiBallInfoクラスはデータ格納用のクラスです。

// 取得結果をJSONに変換する
List<UkiukiBallInfo> ukiukiBallInfoList = new ArrayList<UkiukiBallInfo>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject results = jsonObject.getJSONObject("results");
JSONArray messageArray = results.getJSONArray("message");

for (int i=0;i<messageArray.length();i++) {
JSONObject message = messageArray.getJSONObject(i);
UkiukiBallInfo ubInfo = new UkiukiBallInfo();
ubInfo.setStatus(message.getInt("status"));
ubInfo.setLanguage(message.getString("language"));
ubInfo.setObjectid(message.getString("objectid"));
ubInfo.setNickname(message.getString("nickname"));
ubInfo.setLanguage(message.getString("language"));
ubInfo.setTitle(message.getString("title"));
ubInfo.setRegisttime(message.getString("registtime"));
ubInfo.setUserid(message.getString("userid"));
ubInfo.setUri(message.getString("uri"));
ubInfo.setMtype(message.getString("mtype"));
ubInfo.setParentid(message.getString("parentid"));
ubInfo.setModerate(message.getInt("moderate"));

int ubLat = (int)(message.getDouble("lat")*1E6);
int ubLng = (int)(message.getDouble("lng")*1E6);
ubInfo.setGeoPoint(new GeoPoint(ubLat, ubLng));
ukiukiBallInfoList.add(ubInfo);
}
} catch (JSONException e) {
Log.d(LearnUkiukiWeb.TAG, e.getMessage(), e);
}


これでコンテンツの情報が取得できました。
後は取得したコンテンツをアプリ側で自由に使うことができます。

# 余談ですがJSONObjectはコンストラクタにStringしか与えることが出来ないので、
# しばしば問題になることがあります。
# 現状では回避するには自分でjsonをパースするしかなさそうです、、


サンプルコード


上記コードのサンプルは下記URLからダウンロードできます。
なお、ウキウキView Web APIのAPIキーはmain.xmlに別途設定して下さい。

サンプルコード(eclipseのプロジェクト)

実行すると次のようになります。
この例では大阪駅周辺のコンテンツを取得しています。


取得したコンテンツの中にはアイコンのURLも含まれていますので
そこからアイコンを取得することも出来ます。


  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 91 )

ウキウキViewのAPIキーの準備からデータの取得まで 
木曜日, 12月 23, 2010, 01:22 AM - ウキウキView

APIキーの取得


ウキウキView Web APIを使うにはAPIキーが必要になります。
取得は簡単で下記URLから取得できます。




コンテンツを取得


次は取得できたAPIキーを使ってWeb APIからコンテンツを取得してみます。
今回は大阪駅周辺の感情玉の情報を取得してみます。
取得するにはHTTPのGETメソッドを使用します。

HTTPのリクエスト先のURL
https://www.uki2view.jp/uki2/message/message/v5/
パラメータ名今回設定する値説明
apikey上記で取得したAPIキーウキウキView Web APIのキー
lat34.701909中心となる緯度(これは大阪駅)
lng135.494977中心となる経度(これは大阪駅)
zoom16取得する距離、Google Mapのズームレベルで指定
termfull取得期間、fullは過去2年間
count20取得する感情玉の個数
modeltest端末のモデル


これらのパラメータをリクエスト先のURLの後に"?"を付け、
(パラメータ名)=(設定する値)を"&"で繋げて、一つの長いURLを作ります。
上記のURLとパラメータを組み合わせると次のような長ーーーーーーいURLになります。
https://www.uki2view.jp/uki2/message/message/v5/?apikey=********************************&lat=34.701909&lng=135.494977&zoom=16&term=full&count=50&model=test
※:APIキーは自分のもので置き換えて下さい。

これをWebブラウザに入力すると感情玉のコンテンツのjsonが取得できます。
※:ブラウザによっては文字化けたりダウンロードになるかもしれません。


これだけだとよくわからないので見やすくするとこんな感じになります。
{
"results":
{
"count": 6,
"clusters": [
{
"status": "0",
"objectid": "95526ce73caaad5bbead0d5ae48f6260",
"mtype": "emotion/joy",
"lat": "34.700970000000",
"lng": "135.496446000000",
"nickname": "fujita",
"uptime": "2010-03-06 11:09:17",
"language": "en",
"title": "",
"userid": "4e6cbc1f287702f30ff38cffce876e2b",
"registtime": "2010-03-06 15:51:30",
"moderate": "0"
},
{
"status": "0",
"objectid": "0c78af6081183e1e4b758d0eb3dce5f9",
"mtype": "emotion/joy",
"lat": "34.700970000000",
"lng": "135.496446000000",
"nickname": "fujita",
"uptime": "2010-03-06 11:09:17",
"language": "en",
"title": "",
"userid": "4e6cbc1f287702f30ff38cffce876e2b",
"registtime": "2010-03-06 15:40:14",
"moderate": "0"
},
{
"status": "0",
"objectid": "7dbd042f408b74f80c07d1ae25b84c76",
"mtype": "emotion/sad",
"lat": "34.701542000000",
"lng": "135.494677000000",
"nickname": "3156",
"uptime": "2010-05-10 11:11:18",
"language": "ja",
"title": "もうつかれた。",
"userid": "716147d06258486371b102a6fd355925",
"registtime": "2010-03-11 15:25:26",
"moderate": "0"
}, {
(中略)
}
]
}
}


このデータはjsonと呼ばれる汎用的なデータ構造なので、
大抵のプラットフォームで取り扱うことが出来ます。
Androidでは標準ライブラリのJSONObjectを使えば楽に取り扱えます。

今回は通常コンテンツ取得v5から取得しましたが、
ウキウキView Web APIには他にもホットペッパーやぐるなびの情報が取得できる
サービスデータ取得 APIなどもあり、同じように使用できます。
詳しくは下記リンクをご覧下さい。


リンク
ウキウキView Web API
通常コンテンツ取得V5

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 866 )

ウキウキView Web APIをツラツラとまとめて行こうと思う 
火曜日, 12月 21, 2010, 12:36 AM - ウキウキView
ウキウキViewといっても聞いたこと無い人が多いと思います。
AR(Augmented Reality:拡張現実)といっても判らない人が多いと思います。
セカイカメラというとなんか聞いたことあるという人が居ると思います。
でまぁ、最近ARアプリの開発に首を突っ込んでいるのでそれのご紹介です。

ウキウキViewとは何か?
Androidで動作するARアプリでホットペッパーやぐるなび、じゃらんの
お店の情報が見えたり、他のユーザが置いたコメントが見れたりできます。
カメラを向けるとそちらの方向にあるお店が見えて、
そこからホームページに飛んだり、Webクーポンを見たりできます。

↓地図モードだとこんな感じに見えます


↓カメラモードだとこんな感じに見えます


http://jp.androlib.com/android.applicat ... -xmED.aspx


開発に関する特徴
公式のAndroidのクライアントはオープンソースで公開されています。
ビルドするのは少々手が掛かるのですが、
こちらのブログに一通り書かれています。
http://d.hatena.ne.jp/bs-android/20091223/1261504006

コンテンツは公開されているサーバからWeb APIで取得できます。
APIキーを取得していれば、このAPIを使うと
ホットペッパー、ぐるなび、じゃらんからお店のコンテンツや、
ユーザの置いたコメントである「感情玉」のコンテンツがjson形式で取得できます。
http://sites.google.com/site/uki2view/

単にAPIから取得するだけなら、ホットペッパー、ぐるなび、じゃらんの
Web APIから直接取得したら良いじゃないかというのもごもっとも。
でも、このウキウキView WEB APIの面白いのは
同じ手順で異なるサービスの情報が取得できるところ。
つまり、一回綺麗に作ってしまえば、
サービスが追加されても同じように画面に表示できるので嬉しい。


このAPIはARだけじゃなく他のものにも使えそうなので
もうしばらく遊んで見たいと思う今日この頃。
とりあえず、僕自身の備忘録も兼ねて、
使い方とかまとめて行きたいと思います。

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 932 )

開発で非root端末のDBを無理矢理に覗く方法2 
日曜日, 12月 19, 2010, 10:40 PM - Android
前の「開発で非root端末のDBを無理矢理に覗く方法」について
Android端末のIPって判らないことあるんじゃ、、、という質問があったので追記。

たしかにAndroid端末へはwifiでネットワーク接続してないと
直接接続はできないので、そのままではtelnet接続できない。
でも、USB接続の場合は以下のようにadbコマンドでローカルのポートを
Android端末のポートにフォワーディングすれば接続できる。
※:ポート番号は適当に読み替えて下さい
user@mypc:~$ ./adb -d forward tcp:8090 tcp:8090


user@mypc:~$ telnet localhost 8090
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


要約すると接続方法は次の2つになります
◆ネットワーク経由でAndroid端末に接続する
 ・Android端末をWIFIなどでネットワークに接続する
 ・同一ネットワークのPCからAndroid端末のIPを指定して接続する
◆USB経由でAndroid端末に接続する
 ・『./adb -d forward tcp:8090 tcp:8090』コマンドでポートをフォワーディ
ングする
 ・localhostを指定して接続する


とりあえずRDBAssistantとの連携も
それなりに使えるようになったので一回きっちりまとめねば、、

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 930 )

開発で非root端末のDBを無理矢理に覗く方法 
日曜日, 12月 5, 2010, 09:13 PM - Android

はじめに


ここに書いている内容はCattakaが作業用に考えた
試験段階のものなので実際に使用については自己責任でお願いします。


概要


Androidアプリの開発で非root端末のSQLiteDatabaseを
覗きたかったので無理矢理に覗く方法を作ってみた。
厳密には覗けないわけではなく、該当するアプリからは
アクセスできるのだけど、これでは勝手が悪く、
できればSQLを直接叩きたかった。

今回作ったのは汎用的にコピペできるServiceのクラスファイルで、
それを対象のアプリにコピペして、Serviceを起動してあげ、
telnetでアクセスするとSQLが実行できるようになるものだ。
主なサービスの動作は以下の通り。
・サービスを起動すると指定されたポートを開く
・Telnetで接続が来たらSQLiteのDBを開く
・入力値をSQLとして入力する
・CSVとして値を返す


準備手順


TelnetSqliteService.javaをプロジェクトに追加する。
↓ダウンロードしてください。
TelnetSqliteService.java



AndroidManifest.xmlに次の2つを追加する。
・TelnetSqliteServiceを追加
・android.permission.INTERNETを追加
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.cattaka.telnetsqlite"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TelnetSqlite" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- ★:TelnetSqliteServiceを追加 -->
<service android:name=".TelnetSqliteService"></service>
</application>
<uses-sdk android:minSdkVersion="4" />
<!-- ★:android.permission.INTERNETを追加 -->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>


起動時にTelnetSqliteServiceが起動するようにする。
    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// TelnetSqliteサービスの起動
Intent serviceIntent = new Intent(this, TelnetSqliteService.class);
startService(serviceIntent);
}



操作方法


telnetでアクセスする。
ホスト名は端末のIPを、ポート番号はソースコードに
記載している物を指定する
user@mypc:~$ telnet 192.168.201.128 8090
Trying 192.168.201.128...
Connected to 192.168.201.128.
Escape character is '^]'.


接続したら、まず対象となるデータベースの名前を指定する。
これはSQLiteOpenHelperで指定している名前と同じにする。
この例ではwalttend.dbを指定している。
成功するとプロンプトである"$"が返される。
user@mypc:~$ telnet $ADBHOST 8090
Trying 192.168.201.128...
Connected to 192.168.201.128.
Escape character is '^]'.
walttend.db
S
$


この状態でSQLコマンドを入力すると結果が出力される。
先頭が+の行は列名称であり、-も行はデータになる。
$
SELECT NAME FROM SQLITE_MASTER;
S6
+name
-android_metadata
-sqlite_sequence
-ANIMALS
-ANIMALS_DETAIL
-ANIMALS_DETAIL2

$



テスト中:RDBAssistantと連携


このtelnetで接続できるポートに
RDBAssistantで接続出来るようにしています。
今のところ開発バージョンのみだけど、
きっちり使えるようにする予定。

RDBAssistant
開発バージョンのダウンロード





  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3.2 / 936 )


Back Next