androidでjsonデータをパースする

androidでjsonデータをパースする方法。
JSONObjectと、JSONArrayを使う。

こんなjsonデータの場合

{
"news":{
"body": "あいうえお".
"title": "かきくけこ"
}
"topics":{
"topic:[
{
"body": "さしすせそ".
"title": "たちつてと"
},
{
"body": "なにぬねの".
"title": "はひふへほ"
}
]
}
}


String jsondata = jsonデータ;
JSONObject rootObject = new JSONObject( jsondata );
JSONObject topicstObject = rootObject.getJSONObject("topics");
JSONArray topicArray = topicstObject.getJSONArray("topic");

android.util.Log.d("debug", rootObject.getJSONObject("news").getString("body").toString());

for(int i=0; i < topicArray.length(); i++){
android.util.Log.d("debug", topicArray[i].getString("body").toString());
}

スポンサーサイト

eclipseでエミュレーター起動時に「PANIC: Could not open: C:\Users\xxx\.android/avd/AVD2.1-2.ini」が出た時の対処法

eclipseでエミュレーター起動時に

PANIC: Could not open: C:\Users\xxx\.android/avd/AVD2.1-2.ini

と言うエラーが出た時の対処方法をメモ。
xxxは、ログインユーザー名。

まず、これが出るのは、windoiwsにログインしているユーザー名が日本語とか、スペースが含まれている時に起きるらしい。
その対処法は、下記参照。

今から1時間で,Androidアプリの開発環境を構築し,Windows上でサンプルを動作させる手順

ユーザー名が上記に当てはまらずに、普通に英語名とかだった場合でも
これがおきた。
原因はマイドキュメントとかの位置をDドライブに移動してたため。

元に戻しても解決出来るだろうけど、
そうしないで解決する方法。

1.Android SDKおよび AVDマネージャーを開く。
2.Virtual devicesを選択して、上の方にある
「List of existing Virtual Devices located ad D:\xxx\.android\avd」

D:\xxx\.android\avd
の中身を
C:\Users\xxx\.android/avd/
にコピー

これで動いた。

カスタムviewのクラスを、xmlでレイアウトを設定する方法

カスタムViewを設定する方法は結構載ってたけど、どこもjavaのクラス内でレイアウトとか定義してるとこが多かったのでメモ。
まだ試してないけど。

http://labs.techfirm.co.jp/android/cho/751

LayoutInflater#inflateとかを使えば行けるのかな。。

スマートフォン(iPhone/Android)アプリ制作時に役立つ画像サイズのまとめ

スマートフォン(iPhone/Android)アプリ制作時に役立つ画像サイズのまとめのメモ。

スマートフォン(iPhone/Android)アプリ制作時に役立つ画像サイズのまとめ

Adminジェネレーターで外部キーにした時のコンボボックスをIDじゃなくする方法

Adminジェネレーターで、外部キーを設定すると勝手にそのリレーション先のテーブルのデータをコンボボックスにしてくれる。
ただ、表示がIDなのでそれを任意のカラムにする方法。

そのモデルクラスに __toString() メソッドを追加する。

参考サイト

第14章 - Admin ジェネレーター
ここの「データモデルの例」辺りを参照

googlemap api v3で複数ピンを立てて、ズームレベルを適切な形にする方法

v2だとgetBoundsZoomLevelと言う関数でやるんみたいだけど、v3だとそれが無くなっているらしい。
やり方を見つけたのでメモ。

<head>内

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
<!--
google.maps.event.addDomListener(window, 'load', function()
{
var mapOptions = {
zoom: 20,
center: new google.maps.LatLng(),
mapTypeId: google.maps.MapTypeId.ROADMAP,
scaleControl: true
};
var mapObj = new google.maps.Map(document.getElementById('gmap'), mapOptions);
var minLatLng = new google.maps.LatLng(最小緯度,最小経度);
var maxLatLng = new google.maps.LatLng(最大緯度,最大経度);
var latLngBounds = new google.maps.LatLngBounds(minLatLng, maxLatLng);
var bounds = new google.maps.LatLngBounds();
bounds.extend(minLatLng);
bounds.extend(maxLatLng);
mapObj.fitBounds(bounds);

// 位置情報
var locations = {
list: [
{ name: "タイトル1", latlng: new google.maps.LatLng(緯度,経度) },
{ name: "タイトル2", latlng: new google.maps.LatLng(緯度,経度) },
{ name: "タイトル3", latlng: new google.maps.LatLng(緯度,経度) },
{ name: "タイトル4", latlng: new google.maps.LatLng(緯度,経度) },
],

// Getter
getAll: function()
{
return this.list;
}
};

// マーカーを作成
jQuery.each(locations.getAll(), function(i, station)
{
var marker = new google.maps.Marker({
position: station.latlng,
map: mapObj,
title: station.name
});
});
});
-->
</script>


<body>で。

<div id="gmap" style="width:640px;height:400px;">ヒットする結果はありませんでした。



ピンを立てる緯度経度で、それぞれ最大・最小の緯度経度を求めて
boundsを広げるようにする。

参考サイト
Google Maps JavaScript API V3 リファレンス
地名や住所から緯度・経度を取得する
Google Map APIで縮尺と位置の自動調節

iAdを設置するのに参考にしたサイト

iAdを設置するのに参考にしたサイト

iAdプログラミングガイド
iAd Networkの設定
iAd導入時の注意事項 rejectされない為に

UIWebviewで気をつけること

今まで、原因がよくわからなくて強制終了される事がたまにあったけど
今日、こんな記事を見つけました。

アプリが落ちないUIWebViewの使い方

ここの通りにしたら、今までたまに落ちてた箇所が落ちなくなった!

助かりました~

delefate = nil;
これ結構大事~。

googlemap apiで住所から緯度経度を取得。(PHPで)

javascriptのAPIは結構あるけど、PHPでどうやるかわからなかったので調べてたらわかったのでメモ。

Geocoding APIのaddressパラメータに「表参道駅」を指定し、下記のURLにブラウザでアクセスすると、XML形式で場所の位置情報が返ります。
http://maps.google.com/maps/api/geocode/xml?address=%E8%A1%A8%E5%8F%82%E9%81%93&sensor=false

XMLのGeocodeResponse/result/geometry/locationノード内のlat、lngノードの値が、緯度・経度になります。
XMLは、PHP5ならsimplexml_load_fileを使えば簡単。

$url = "http://maps.google.com/maps/api/geocode/xml?address=%s&sensor=false";
$u = sprintf($url, rawurldecode('表参道駅'));
$xml = simplexml_load_file($u);
$xml->result->geometry->location->lat.",".$xml->result->geometry->location->lng)


参考サイト
Google Maps JavaScript API v3 - PHP & JavaScript Room
Google Map APIを使って住所から緯度/経度を取得する

別なappのroutingやpartialを読み込めるsfAppChange

symfonyで1つのプロジェクトでアプリケーションを複数作って
アプリケーション同士でリンクをしたりする方法。

別なappのroutingやpartialを読み込めるsfAppChange
アプリケーション間のリンクを作る方法


2011/9/12追記
sfAppChangeを使うと、suffixやアプリケーションを別のディレクトリに置いた時など
うまく動かなかった。
下記のように修正。

AppChange.class.php

private function _getURL($format, $dir=false, $show_controller=true,$protocol=false){
$env = sfContext::getInstance()->getConfiguration()->getEnvironment();
if($env == 'prod'){
$phpname = ($show_controller) ? '/'.$this->app.'.php' : '';
}else{
$phpname = '/'.$this->app.'_'.$env.'.php';
}

$url = $phpname;
if($protocol===true){
$protocol = 'http';
}
if($protocol){
$url = $protocol.'://'.sfContext::getInstance()->getRequest()->getHost().$url;
}

if($dir){
$url .= "/".$this->app;
}

if(!isset(self::$routings[$this->app])){
$config = new sfRoutingConfigHandler();
$routes = $config->evaluate(array(sfConfig::get('sf_apps_dir').'/'.$this->app.'/config/routing.yml'));
$routing =new sfPatternRouting(new sfEventDispatcher());
$routing->setRoutes($routes);
self::$routings[$this->app] = $routing;
}

$config = sfFactoryConfigHandler::getConfiguration(sfContext::getInstance()->getConfiguration()->getConfigPaths('config/factories.yml'));
$options = $config['routing']['param'];

$routing_old =sfContext::getInstance()->getRouting();
sfContext::getInstance()->set('routing',self::$routings[$this->app]);
$ret = $url.url_for($format).$options['suffix'];
sfContext::getInstance()->set('routing',$routing_old);
return $ret;
}


引数に $dir を追加して、$dirがtrueの時に$appnameをディレクトリに指定する。

symfony1.4で、拡張子.htmlでアクセス出来るようにする方法。

今までの、setting.ymlで設定は出来なくなっていた。
SF_APP/config/factories.yml:
で設定する。


prod:
routing:
param:
suffix: .html

で、使い方。

<?php echo url_for('my_route', array('variable1'=>'news', 'variable2'=>'sports', 'variable3'=>'page2'));?>

上記で
/news/sports/page2.html
と表示される。


UIWebViewを使って、youtubeを連続再生する方法

かなり迷ったのでメモ。

事前に
self.nowUrl = "再生する動画のURL"
self.nextUrl = "次の再生する動画のURL"
を準備。

UIWebViewDelegateを指定しておくこと。


- (void)embedYouTube:(NSString*)url frame:(CGRect)frame {

if(videoView == nil) {
videoView = [[UIWebView alloc] initWithFrame:frame];
videoView.scalesPageToFit = YES;
[self.view addSubview:videoView];
}

[videoView setBackgroundColor:[UIColor clearColor]];
[videoView setOpaque:NO];
videoView.delegate = self;

[videoView loadRequest:[NSURLRequest requestWithURL:
[NSURL URLWithString:self.nowUrl]]];
}


- (void)webViewDidFinishLoad:(UIWebView *)webView {
[videoView stringByEvaluatingJavaScriptFromString:
[NSString stringWithFormat:@"var v=document.querySelector('video'); v.addEventListener('ended', function(){ location.href='%@'; }); v.play(); ",
self.nextUrl]];
}


これで、連続再生出来る。

はまったのは、
Youtube API BLOGの2に書いてある通り、タグから文字作ってやってたけど、Javascript apiが動かないから、再生終了のイベントが取れない。

なので、下記サイト
https://gist.github.com/737414
にあるように、

ローカライズの方法

ローカライズの方法をやった時に参考にしたサイト。

http://d.hatena.ne.jp/dkfj/20110212/1297526058

プロフィール

U2K

Author:U2K
いろいろプログラムに関しての覚え書きをちょくちょくと書いていきます。

オススメ










オススメ

忍者AdMax

u2k on Twitter

最近の記事