Transcript
Page 1: Android Hacks - Hack27 ~ Hack29

ANDROIDHACKS#21,27,28,29

担当: tsuruoka

23/04/12

1

Page 2: Android Hacks - Hack27 ~ Hack29

この資料について• この資料は下記の本をベースに勉強会で作成した資料です。

• 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)

• この本の紹介ページが下記にあります。

• http://www.oreilly.co.jp/books/9784873114569/

23/04/12

2

Page 3: Android Hacks - Hack27 ~ Hack29

アジェンダ• Hack27 位置情報を取得する

• 位置情報の取得の仕方• Hack28 位置情報を活用する

• 位置情報取得の手段を臨機応変に• 位置情報変更時にブロードキャスト• 指定した領域に入った / 出た

• Hack29 センサを使う

• いろんなセンサの値を出す(だけの)アプリ作ってきました

23/04/12

3

Page 4: Android Hacks - Hack27 ~ Hack29

Hack27. 位置情報の取得• 位置情報の取得といえばGPSですが

ネットワークからの取得など他の手段とともにLocationProvider として抽象化されています

• 現在のところ LoctionProvider として次の2つが定義されている

• GPS_PROVIDER• NETWORK_PROVIDER

• GPS がなければ NETWORK から、という実装が可能 (Hack28)

23/04/12

4

Page 5: Android Hacks - Hack27 ~ Hack29

Hack27. 位置情報の取得       LocationManager取得方法

implements LocationLisener する。

onCreate で

// LocationManager の取得

mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

// LocationListener を登録

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

さらに 位置情報の変化(=ほっといても多少動きますが、)マシンが移動したことに対して

public void onLocationChanged(Location location) {

// 新しい location で 画面を更新するなどのコード

location.getLatitude() などの

緯度、経度、プロバイダーなどを get するメソッドはそろっています。

}

23/04/12

5

Page 6: Android Hacks - Hack27 ~ Hack29

Hack27. 位置情報の取得       LocationManager* implements LocationListener 必須のメソッドは

Public Methods

abstract void   onLocationChanged(Location location)

Called when the location has changed.

abstract void   onProviderDisabled(String provider)

Called when the provider is disabled by the user.

abstract void   onProviderEnabled(String provider)

Called when the provider is enabled by the user.

abstract void   onStatusChanged(String provider, int status, Bundle extras)

Called when the provider status changes.

23/04/12

6

Page 7: Android Hacks - Hack27 ~ Hack29

Hack28. 位置情報の活用• LocationManager を臨機応変に切り替える

• 条件( Criteria )に応じて使用する LocationProvider を切り替えることが可能

• 位置情報の活用(すみません省略しました)

• 位置情報の変化に応じてブロードキャストインテント• 特定の領域に入った  or  出た

23/04/12

7

Page 8: Android Hacks - Hack27 ~ Hack29

Hack28. 位置情報の活用LocationManager の切り替え

• 条件 (Criteria)

• setPowerRequirement :消費電力 高・中・低の3段階で設定可能• setAccuracy  正確さ 粗い・細かくの2段階。

• Level9( GingerBread )からは3段階。• setAltitudeRequirement 高さも取得するか?• setSpeedRequired :スピードを取得するか?• setBearingRequired :進行方向を取得するか?• setCostAllowed  お金がかかってもいいか?

• 現時点では  GPS かネットワークから取得するだけですが将来他の方法で位置情報を取得できる可能性もあるのでこういう設定があるようです。

23/04/12

8

Page 9: Android Hacks - Hack27 ~ Hack29

Hack28. 位置情報の活用LocationManager の切り替え

• Criteria の記述例

// LocationManager の取得 LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);

Criteria criteria = new Criteria();

criteria.setPowerRequirement(Criteria.POWER_LOW);

criteria.setAccuracy(Criteria.ACCURACY_FINE);

criteria.setAltitudeRequired(false);

criteria.setSpeedRequired(false);

criteria.setBearingRequired(false);

criteria.setCostAllowed(false);

String bestProvider = lm.getBestProvider(criteria, true);

((TextView) findViewById(R.id.main_tv_bestprovider)).setText(" 最適なロケーションプロバイダ = "

+ bestProvider);

23/04/12

9

Page 10: Android Hacks - Hack27 ~ Hack29

Hack29センサを使うデバイスに搭載されているセンサの生の値を取り出すことがで

きます

Android としてサポートしているのは下のとおり

• TYPE_GYROSCOPE ジャイロセンサ(傾き等)

• TYPE_LIGHT 明るさセンサ

• TYPE_MAGNETICFIELD    磁界

• TYPE_ORIENTATION     傾き

• TYPE_PRESSURE       圧力

• TYPE_PROXIMITY       接近

• TYPE_TEMPATURE      温度

Page 11: Android Hacks - Hack27 ~ Hack29

Hack29センサを使う• センサのタイプは違っても 値の取り出し方は同じです。

• 取り出した値の意味が、タイプごとに違うだけ• 最大3つの値を返してきます ([0],[1],[2])

• 例 電磁場は3つの値を返すそれぞれ X 軸、 Y 軸、 Z 軸方向の電磁場の強さ

• 例 オリエンテーションセンサは3つの値を返す• それぞれ 方向、ピッチ、ロール

• 例 温度センサは1つの値をかえす• 温度(摂氏)

Page 12: Android Hacks - Hack27 ~ Hack29

Hack29センサを使う 実装本のやり方とは違いますが

Activity に implements SensorEventListener

onCreate で

// センサマネジャの取得

sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

onResume で

// センサリッスンの開始

List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);

if (sensors.size() > 0) {

sensorManager.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_FASTEST);

}

On Pause で

// センサリッスンの停止

sensorManager.unregisterListener(this);

Acitity のライフサイクルにあわせてセンサの使用 / 不使用をコントロールする必要があります。

消費電力がもったいないですから。