<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>クレコ &#187; Android</title>
	<atom:link href="http://creco.net/tag/android/feed/" rel="self" type="application/rss+xml" />
	<link>http://creco.net</link>
	<description>East or west, home is best.</description>
	<lastBuildDate>Fri, 27 Nov 2009 13:26:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/tag/android/feed/" />
		<item>
		<title>Google Maps API V3 と Gears Geolocation API 使って Android のブラウザで現在位置情報を取得する</title>
		<link>http://creco.net/2009/06/11/google_maps_api_v3_with_gears_geolocation_api/</link>
		<comments>http://creco.net/2009/06/11/google_maps_api_v3_with_gears_geolocation_api/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 07:49:48 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ジオポ]]></category>

		<guid isPermaLink="false">http://creco.net/2009/06/11/google_maps_api_v3_with_gears_geolocation_api/</guid>
		<description><![CDATA[先日のGoogle Developer Day 2009 にて、GoogleさんからAndroid携帯である GDD Phone をいただいたので、早速Androidライフを楽しんでる毎日です。素敵なオモチャをありがとう [...]]]></description>
			<content:encoded><![CDATA[<p>先日の<a href="http://code.google.com/intl/ja/events/developerday/2009/home.html">Google Developer Day 2009</a> にて、GoogleさんからAndroid携帯である GDD Phone をいただいたので、早速Androidライフを楽しんでる毎日です。素敵なオモチャをありがとうございます！</p>
<p>ネイティブアプリの地図でGoogle Latitudeをいぢりたおしたりしてるんですが、地図大好きっ子としては自分で位置情報を活用したいところ。</p>
<p>そんな折、ジークルーの佐々木さんから</p>
<blockquote><p>@<a href="http://twitter.com/shinagaki">shinagaki</a> 自分が今日どこを歩いたかが履歴でMapに表示されるAndroidアプリって知らない？</p>
</blockquote>
<p>って遠まわしに作れって言われた気がしたので、Android界隈の位置情報について調べてみる。</p>
<p> <span id="more-535"></span>
</p>
<h3>Androidで位置情報を取得するにはどうすんの？</h3>
<p>調べてみたけど、ネイティブアプリでの情報しかなくて、実装が楽にできそうなブラウザでのAPI動作状況についてのサンプル例がなかった。</p>
<p>ネイティブアプリでは、<a href="http://code.google.com/intl/ja/android/add-ons/google-apis/maps-overview.html">Maps External Library &#8211; Google Projects for Android</a> に情報あるから、ネイティブアプリ作る人は見るといいよ。僕も、あとで見る。</p>
<p>Androidの搭載しているブラウザに、iPhone OS 3.0 のSafariブラウザみたくW3CのGeolocation APIをサポートして、ブラウザからGPS位置情報を取得できることを期待してたんですが、結果から言うとダメ。</p>
<p>ですが！Androidのブラウザ「Chrome Lite」はGoogle Gearsを搭載しているため、ひょっとしたらGearsのGeolocation API使えるかも！？ と思って実験。</p>
<h4>Google Gears での位置情報取得</h4>
<p><a href="http://code.google.com/intl/ja/apis/gears/api_geolocation.html">Geolocation API &#8211; Gears API &#8211; Google Code</a></p>
<p>サンプルのとおりに、 <strong>gears_init.js</strong> をおいて、</p>
<pre class="csharpcode">&lt;script type=<span class="str">&quot;text/javascript&quot;</span> src=<span class="str">&quot;gears_init.js&quot;</span>&gt;&lt;/script&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;
<span class="kwrd">var</span> geo = google.gears.factory.create(<span class="str">'beta.geolocation'</span>);

<span class="kwrd">function</span> updatePosition(position) {
  alert(<span class="str">'Current lat/lon is: '</span> + position.latitude + <span class="str">','</span> + position.longitude);
}

<span class="kwrd">function</span> handleError(positionError) {
  alert(<span class="str">'Attempt to get location failed: '</span> + positionError.message);
}

geo.getCurrentPosition(updatePosition, handleError);
&lt;/script&gt;</pre>
<p>と書くだけで、位置情報取得できた！簡単。</p>
<h4>Google Maps API V3 を使って地図表示</h4>
<p>それに、Google Maps API V3 を組み合わせる。<br />
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p><a href="http://code.google.com/intl/ja/apis/maps/documentation/v3/">The Google Maps API V3 &#8211; Google Maps JavaScript API V3 &#8211; Google Code</a></p>
<p>Google Maps API V3 ってのは、今までのMaps APIで効率が悪かったり、スマートフォンに最適化されてなかった部分を改善するため、一から書き直したAPIで、今までのMaps APIと書き方が異なる。</p>
<p>んでも、やってることは同じだし、まだ V3のほうができることが少ないので理解は早いと思います。</p>
<p>サンプルとしては、</p>
<pre class="csharpcode">&lt;script type=<span class="str">&quot;text/javascript&quot;</span> src=<span class="str">&quot;http://maps.google.com/maps/api/js?sensor=false&quot;</span>&gt;&lt;/script&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;
  <span class="kwrd">function</span> initialize() {
    <span class="kwrd">var</span> myLatlng = <span class="kwrd">new</span> google.maps.LatLng(-34.397, 150.644);
    <span class="kwrd">var</span> myOptions = {
      zoom: 8,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    <span class="kwrd">var</span> map = <span class="kwrd">new</span> google.maps.Map(document.getElementById(<span class="str">&quot;map_canvas&quot;</span>), myOptions);
  }
&lt;/script&gt;
&lt;/head&gt;
&lt;body style=<span class="str">&quot;margin:0px; padding:0px;&quot;</span> onload=<span class="str">&quot;initialize()&quot;</span>&gt;
  &lt;div id=<span class="str">&quot;map_canvas&quot;</span> style=<span class="str">&quot;width:100%; height:100%&quot;</span>&gt;&lt;/div&gt;
&lt;/body&gt;</pre>
<p>これで、全画面の地図表示。</p>
<ul>
<li>APIキーがいらない → Open Socialなアプリ作る場合に問題だった、ドメインごとにAPIキー発行する手間がなくなる。 </li>
<li>スマートフォンに対応 → iPhoneとAndroidのUIにあわせてコントローラーを配置してくれるし、地図の描画までが早い！ </li>
</ul>
<p>だから、iPhoneのネイティブアプリ作ってて地図周りだけ、UIWebView使ってるっていう人も恩恵あるんじゃないかな？</p>
<h3>実際に現在位置をTwitterにPOSTするJavaScriptを作ってみた<br />
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</h3>
<p><a href="http://inagaki.co.uk/test/gears.html">Google Maps API V3 with Gears Geolocation API</a> ＠inagaki.co.uk</p>
<p>実際にAndroidで試してみてください。</p>
<p>中身はコチラ。</p>
<pre class="csharpcode">&lt;html&gt;
&lt;head&gt;
&lt;meta name=<span class="str">&quot;viewport&quot;</span> content=<span class="str">&quot;initial-scale=1.0, user-scalable=no&quot;</span> /&gt;
&lt;meta http-equiv=<span class="str">&quot;content-type&quot;</span> content=<span class="str">&quot;text/html; charset=UTF-8&quot;</span>/&gt;
&lt;title&gt;Google Maps API V3 with Gears Geolocation API&lt;/title&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span> src=<span class="str">&quot;http://maps.google.com/maps/api/js?sensor=false&quot;</span>&gt;&lt;/script&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span> src=<span class="str">&quot;gears_init.js&quot;</span>&gt;&lt;/script&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;

<span class="rem">/*</span>
<span class="rem"> * GeoPo Encode in JavaScript</span>
<span class="rem"> * @author : Shintaro Inagaki</span>
<span class="rem"> * @param location (Object)</span>
<span class="rem"> * @return geopo (String)</span>
<span class="rem"> */</span>
<span class="kwrd">function</span> geopoEncode(location){
    <span class="rem">// 64characters (number + big and small letter + hyphen + underscore)</span>
    <span class="kwrd">var</span> chars = <span class="str">&quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_&quot;</span>;

    <span class="kwrd">var</span> geopo = <span class="kwrd">new</span> String();
    <span class="kwrd">var</span> lat = parseFloat(location.lat); <span class="rem">// Parse as float</span>
    <span class="kwrd">var</span> lng = parseFloat(location.lng); <span class="rem">// Parse as float</span>
    <span class="kwrd">var</span> scale = parseInt(location.scale); <span class="rem">// Parse as int</span>

    <span class="rem">// Change a degree measure to a decimal number</span>
    lat = (lat + 90) / 180 * Math.pow(8, 10);
    lng = (lng + 180) / 360 * Math.pow(8, 10);

    <span class="rem">// Compute a GeoPo code from head and concatenate</span>
    <span class="kwrd">for</span>(<span class="kwrd">var</span> i = 0; i &lt; scale; i++) {
        geopo = geopo + chars.substr(Math.floor(lat / Math.pow(8, 9 - i) % 8) + Math.floor(lng / Math.pow(8, 9 - i) % 8) * 8, 1);
    }
    <span class="kwrd">return</span> geopo;
}

<span class="kwrd">var</span> geo = google.gears.factory.create(<span class="str">'beta.geolocation'</span>);

<span class="kwrd">function</span> displayMap(position) {
    <span class="kwrd">var</span> geocoder = <span class="kwrd">new</span> google.maps.Geocoder();
    <span class="kwrd">var</span> latLng = <span class="kwrd">new</span> google.maps.LatLng(position.latitude,position.longitude);
    <span class="kwrd">var</span> options = {
        zoom: 15,
        center: latLng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    <span class="kwrd">var</span> map = <span class="kwrd">new</span> google.maps.Map(document.getElementById(<span class="str">&quot;map_canvas&quot;</span>), options);

    <span class="kwrd">var</span> geocodeAddress;

    <span class="kwrd">var</span> infowindow = <span class="kwrd">new</span> google.maps.InfoWindow();

    <span class="kwrd">var</span> marker = <span class="kwrd">new</span> google.maps.Marker({
        position: latLng,
        map: map,
        title:<span class="str">&quot;You are here.&quot;</span>
    });

    <span class="rem">// geopo</span>
    <span class="kwrd">var</span> location = <span class="kwrd">new</span> Object();
    location.lat = position.latitude;
    location.lng = position.longitude;
    location.scale = 7;

    <span class="kwrd">var</span> geopo = geopoEncode(location);

    <span class="kwrd">if</span> (geocoder) {
        geocoder.geocode({<span class="str">'latLng'</span>: latLng}, <span class="kwrd">function</span>(results, status) {
            <span class="kwrd">if</span> (status == google.maps.GeocoderStatus.OK) {
                <span class="kwrd">for</span>(i=1;i&lt;results.length;i++){
                    <span class="kwrd">if</span> (results[i].types.length &gt;= 2 &amp;&amp; results[i].types[1] == <span class="str">&quot;political&quot;</span>) {
                        <span class="kwrd">if</span>(results[i].formatted_address.indexOf(<span class="str">&quot;日本&quot;</span>) != -1){
                            geocodeAddress = results[i].formatted_address.substring(2);
                        }<span class="kwrd">else</span>{
                            geocodeAddress = results[i].formatted_address;
                        }
                        <span class="kwrd">break</span>;
                    }
                }
                <span class="kwrd">if</span>(geocodeAddress){
                    infowindow.set_content(<span class="str">'&lt;strong&gt;現在地：&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;font-size:80%&quot;&gt;'</span>+geocodeAddress+<span class="str">'&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;GeoPo：&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;font-size:80%&quot;&gt;http://geopo.at/'</span>+geopo+<span class="str">'&lt;/span&gt;&lt;hr /&gt;&lt;a href=&quot;http://twitter.com/home?status='</span>+encodeURIComponent(<span class="str">' L:'</span>+geocodeAddress+<span class="str">' http://geopo.at/'</span>+geopo)+<span class="str">'&quot; target=&quot;twitter&quot;&gt;TwitterにPOSTする&lt;/a&gt;'</span>);
                    infowindow.open(map, marker);
                } <span class="kwrd">else</span>{
                    alert(<span class="str">&quot;現在地が取得できませんでした＞＜&quot;</span>);
                }
            } <span class="kwrd">else</span> {
                alert(<span class="str">&quot;Geocoder failed due to: &quot;</span> + status);
            }
        });
    }

    google.maps.<span class="kwrd">event</span>.addListener(marker, <span class="str">'click'</span>, <span class="kwrd">function</span>() {
        infowindow.open(map,marker);
    });
}

<span class="kwrd">function</span> handleError(positionError) {
    alert(<span class="str">'Attempt to get location failed: '</span> + positionError.message);
}

geo.getCurrentPosition(displayMap, handleError);

&lt;/script&gt;
&lt;/head&gt;
&lt;body style=<span class="str">&quot;margin:0px; padding:0px;&quot;</span>&gt;
  &lt;div id=<span class="str">&quot;map_canvas&quot;</span> style=<span class="str">&quot;width: 100%; height: 100%;&quot;</span>&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>&#160;</p>
<h3>こんな風に現在位置が取れるよ<br />
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</h3>
<h4>１．さきほどのURLにアクセスする</h4>
<p><a href="http://creco.net/wp-content/uploads/device01.png" rel="lightbox[535]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="device01" border="0" alt="device01" src="http://creco.net/wp-content/uploads/device01-thumb.png" width="162" height="242" /></a></p>
<p>すると、Gearsで「現在地情報にアクセス」しますかというメッセージがでるので、OKを押してください。ドメインごとの許可ですかね？</p>
<h4>２． 現在地の地図を表示</h4>
<p><a href="http://creco.net/wp-content/uploads/device02.png" rel="lightbox[535]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="device02" border="0" alt="device02" src="http://creco.net/wp-content/uploads/device02-thumb.png" width="162" height="242" /></a> </p>
<p>Gearsからの位置情報をMaps API V3で地図表示。ちゃんと、拡大縮小コントローラーもAndroidなUIになってる。</p>
<p>そして、Maps API V3の逆ジオコーディングを使って、現在住所を取ってくる。</p>
<p>ついでに、GeoPoのエンコードもしてるよ！</p>
<p>一番下のリンクがTwitterにポストするためのリンク。</p>
<h4>３．TwitterにPOST内容を渡す</h4>
<p><a href="http://creco.net/wp-content/uploads/device03.png" rel="lightbox[535]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="device03" border="0" alt="device03" src="http://creco.net/wp-content/uploads/device03-thumb.png" width="162" height="242" /></a> </p>
<p>http://twitter.com/home/?status=[ポスト内容] で渡すことができるから、単純に URLエンコードしたものを渡してるだけ。</p>
<p>ただ、このようなTwitterのパラメータ渡しは、Twitterの表示モードがモバイルになってると無効になるみたいなので、あらかじめスタンダードに変更しておいてください。</p>
<h3>ブラウザでのGeolocation APIについて</h3>
<p>実は、Google Gearsに対応していれば、ChromeとかFirefox（要アドオン）でも上記のURLで現在地の位置情報が取得できる。</p>
<p>正確にいうと、IPから推測した位置情報なので正しくはないかもしれないけど、JavaScriptだけの実装で簡易的に位置情報が取れるのは素敵ですね。</p>
<p>将来的には、W3CのGeolocation APIが載って、開発者側はハードウェア、ソフトウェアの差異を何も考えなくて位置情報を使ったコンテンツに注力できるっていう世界になってくれると幸せです。</p>
<p>Windows 7 では、OSレベルにGeolocation APIがあるそうなので、そちらも楽しみ… その前にIEをなんとかしてｋ（ｒｙ</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/06/11/google_maps_api_v3_with_gears_geolocation_api/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/06/11/google_maps_api_v3_with_gears_geolocation_api/" />
	</item>
	</channel>
</rss>
