読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

AndroidでGPSを使ってみる

Android


AndroidでGPSを使った簡単サンプルを使ってみました。

今回はロケーションが変更されるたびにマップの表示を変更しています。


以前書いたGoogleMapのサンプルに若干の修正を入れました。


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.sample.map"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Sample"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <uses-library android:name="com.google.android.maps"/>
    </application>

    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- アプリケーションがGPSへアクセスするのを許容 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!-- アプリケーションがテスト用の位置情報にアクセスするのを許容 -->
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

    <uses-sdk android:minSdkVersion="4" />
</manifest>

今回は2箇所追加しています。



ACCESS_MOCK_LOCATIONのほうはエミュレーター用なので実機の場合は不要です。


Sample.java

package com.sample.map;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class Sample extends MapActivity implements LocationListener {

    private MapController mController;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // MapViewを取得
        MapView mapView = (MapView) findViewById(R.id.mapview);

        // 拡大・縮小ボタンを表示
        mapView.setBuiltInZoomControls(true);

        // LocationManagerを取得
        LocationManager l = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        // LocationManagerにリスナーを登録
        l.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

        // コントローラーをフィールドに設定
        mController  = mapView.getController();

    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    public void onLocationChanged(Location location) {
        // 現在地を取得
        GeoPoint gp = new GeoPoint((int)(location.getLatitude()*1E6), (int)(location.getLongitude()*1E6));
        // コントローラーを使用して、現在地にマップを移動
        mController.animateTo(gp);
    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}

まずはLocationListenerを実装します。
今回の場合は位置が変更されたときなので、onLocationChangedというメソッドを使用します。
これはロケーションが変更された時に呼び出されます。


onCreateメソッドでリスナーの登録を行ないます。
ActivityクラスのgetSystemServiceメソッドでLocationManagerを取得し、LocationManagerにリスナーを登録しています。


修正内容としてはこれだけです。

さっそく動かしてみます。
f:id:STAR_ZERO:20100725210011p:image


これだけでは意味はないので、次にGPS情報を設定します。
エミュレーターを動かしている状態で、eclipseのメニューから「ウィンドウ」→「ビューの表示」→「その他」を選択します。
f:id:STAR_ZERO:20100725210012p:image
Android」→「Emulator Control」を選択します。


f:id:STAR_ZERO:20100725211458p:image

Emulator Controlの赤丸の場所を入力して送信ボタンを押します。
上の例では
Longitude:139.70154762268066
Latitude:35.6581679808236
渋谷駅付近を設定しています。


送信ボタンを押すと、エミュレターでは渋谷駅に移動しているはずです。
f:id:STAR_ZERO:20100725211747p:image


あまり難しいことはしていませんが、細かい部分をまだ調べきれていないので
どっか時間があるときandやる気のある時に調べてみようと思います。