戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

位置情報を取得 : LocationManager

位置情報を取得するには LocationManager を使います。

API Reference: LocationManager, LocationListener, Location
ソフトウェア技術ドキュメントを勝手に翻訳 - f.1 ユーザロケーションの取得

【参考】
逆引きAndroid入門 - 位置情報を取得するには/GPSを使用するには
A Day In The Life - Android の位置情報を確実に取る方法

【使い方】
・LocationManager は Context.getSystemService(Context.LOCATION_SERVICE) で取得する。
・位置情報の更新を開始するには、LocationManager#requestLocationUpdates を呼ぶ。
・位置情報の更新を停止するには、LocationManager#removeUpdates を呼ぶ。
・更新した位置情報の取得は LocationListener インターフェースを実装して行う。
・位置情報が更新されると、LocationListener#onLocationChanged(Location location) が呼ばれる。
・位置情報の取得には AndroidManifest.xml に <uses-permission> を追加する必要がある。
 android.permission.ACCESS_FINE_LOCATION (GPS) 
 android.permission.ACCESS_COARSE_LOCATION (3G / Wi-Fi)
 android.permission.ACCESS_MOCK_LOCATION (DDMS等のテスト用)
 android.permission.INTERNET (ネットワークをベースにする場合に通信許可が必要)

【メモ】
・Android での位置情報は GPS, 3G, Wi-Fi の3種類。
 LocationManager.GPS_PROVIDER (GPS)
 LocationManager.NETWORK_PROVIDER (3G / Wi-Fi)
・Android 2.2 (API 8) から LocationManager.PASSIVE_PROVIDER 追加。
 他のアプリやサービスが位置情報を取得した際に位置情報を流用する。
LocationManager#removeUpdates メソッドを呼ばずにアクティビティを終了すると挙動がおかしくなる
・HTC Desire(Android 2.1) で LocationManager#getBestProvider の不具合があるらしい。

以下、サンプルアプリ。

■ サンプル画面イメージ
Android_LocationManager.png

■ activity_location.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtProvider"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtLatitude"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtLongitude"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtAltitude"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtAccuracy"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtBearing"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtSpeed"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txtTime"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>


■ MyLocationActivity.java
package jp.inujirushi.android.sample;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class MyLocationActivity extends Activity implements LocationListener {

private LocationManager mLocationManager;
private TextView mTextProvider; // プロバイダ
private TextView mTextLatitude; // 緯度
private TextView mTextLongitude; // 経度
private TextView mTextAltitude; // 標高
private TextView mTextBearing; // 方位
private TextView mTextSpeed; // 速度
private TextView mTextAccuracy; // 精度
private TextView mTextTime; // 時間

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
mTextProvider = (TextView) findViewById(R.id.txtProvider);
mTextLatitude = (TextView) findViewById(R.id.txtLatitude);
mTextLongitude = (TextView) findViewById(R.id.txtLongitude);
mTextAltitude = (TextView) findViewById(R.id.txtAltitude);
mTextBearing = (TextView) findViewById(R.id.txtBearing);
mTextSpeed = (TextView) findViewById(R.id.txtSpeed);
mTextAccuracy = (TextView) findViewById(R.id.txtAccuracy);
mTextTime = (TextView) findViewById(R.id.txtTime);

// LocationManager を取得する
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}

@Override
protected void onResume() {
super.onResume();
if (mLocationManager != null) {
// 位置情報のリクエストを開始する
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, this);
}
}

@Override
protected void onPause() {
super.onPause();
if (mLocationManager != null) {
// 更新が不要であればリクエストを破棄する
mLocationManager.removeUpdates(this);
}
}

// 位置情報が更新されたときに呼ばれる
@Override
public void onLocationChanged(Location location) {
mTextProvider.setText("プロバイダ:" + location.getProvider());
mTextLatitude.setText("緯度:" + location.getLatitude());
mTextLongitude.setText("経度:" + location.getLongitude());
mTextAltitude.setText("標高:" + location.getAltitude());
mTextAccuracy.setText("精度:" + location.getAccuracy());
mTextBearing.setText("方位:" + location.getBearing());
mTextSpeed.setText("速度:" + location.getSpeed());
mTextTime.setText("時間:" + location.getTime());
}

// 位置情報のステータスが変更されたときに呼ばれる
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}

// プロバイダが有効になったときに呼ばれる
@Override
public void onProviderEnabled(String provider) {
}

// プロバイダが無効になったときに呼ばれる
@Override
public void onProviderDisabled(String provider) {
}
}


■ AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.inujirushi.android.sample"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />

<!-- ネットワーク接続 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- GPSからの位置情報取得 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- ネットワークからの位置情報取得 -->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> -->
<!-- テスト用の位置情報取得(DDMS等) -->
<!-- <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> -->

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="jp.inujirushi.android.sample.MyLocationActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。