狠狠撸

狠狠撸Share a Scribd company logo
ANDROID HACKS #21,27,28,29 担当: tsuruoka 09/19/11
この資料について この資料は下記の本をベースに勉強会で作成した資料です。 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー?ジャパン刊) この本の紹介ページが下記にあります。 http://www.oreilly.co.jp/books/9784873114569/ 09/19/11
アジェンダ Hack27  位置情報を取得する 位置情報の取得の仕方 Hack28  位置情報を活用する 位置情報取得の手段を臨機応変に 位置情報変更時にブロードキャスト 指定した領域に入った / 出た Hack29  センサを使う いろんなセンサの値を出す(だけの)アプリ作ってきました 09/19/11
Hack27.  位置情報の取得 位置情報の取得といえばGPSですが ネットワークからの取得など他の手段とともに LocationProvider として抽象化されています 現在のところ  LoctionProvider として次の2つが定義されている GPS_PROVIDER NETWORK_PROVIDER GPS がなければ NETWORK から、という実装が可能 (Hack28) 09/19/11
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 するメソッドはそろっています。 } 09/19/11
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. 09/19/11
Hack28.  位置情報の活用 LocationManager を臨機応変に切り替える 条件( Criteria )に応じて使用する LocationProvider を切り替えることが可能 位置情報の活用(すみません省略しました) 位置情報の変化に応じてブロードキャストインテント 特定の領域に入った  or  出た 09/19/11
Hack28.  位置情報の活用 LocationManager の切り替え 条件 (Criteria) setPowerRequirement :消費電力 高?中?低の3段階で設定可能 setAccuracy  正確さ 粗い?細かくの2段階。 Level9( GingerBread )からは3段階。 setAltitudeRequirement  高さも取得するか? setSpeedRequired :スピードを取得するか? setBearingRequired :進行方向を取得するか? setCostAllowed  お金がかかってもいいか? 現時点では  GPS かネットワークから取得するだけですが 将来他の方法で位置情報を取得できる可能性もあるので こういう設定があるようです。 09/19/11
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); 09/19/11
Hack29 センサを使う デバイスに搭載されているセンサの生の値を取り出すことができます Android としてサポートしているのは下のとおり TYPE_GYROSCOPE ジャイロセンサ(傾き等) TYPE_LIGHT 明るさセンサ TYPE_MAGNETICFIELD    磁界 TYPE_ORIENTATION     傾き TYPE_PRESSURE       圧力 TYPE_PROXIMITY       接近 TYPE_TEMPATURE      温度
Hack29 センサを使う センサのタイプは違っても 値の取り出し方は同じです。 取り出した値の意味が、タイプごとに違うだけ 最大3つの値を返してきます  ([0],[1],[2]) 例 電磁場は3つの値を返す それぞれ X 軸、 Y 軸、 Z 軸方向の電磁場の強さ 例 オリエンテーションセンサは3つの値を返す それぞれ 方向、ピッチ、ロール 例 温度センサは1つの値をかえす 温度(摂氏)
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 のライフサイクルにあわせてセンサの使用 / 不使用をコントロールする必要があります。 消費電力がもったいないですから。

More Related Content

Android Hacks - Hack27 ~ Hack29

  • 1. ANDROID HACKS #21,27,28,29 担当: tsuruoka 09/19/11
  • 2. この資料について この資料は下記の本をベースに勉強会で作成した資料です。 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー?ジャパン刊) この本の紹介ページが下記にあります。 http://www.oreilly.co.jp/books/9784873114569/ 09/19/11
  • 3. アジェンダ Hack27 位置情報を取得する 位置情報の取得の仕方 Hack28 位置情報を活用する 位置情報取得の手段を臨機応変に 位置情報変更時にブロードキャスト 指定した領域に入った / 出た Hack29 センサを使う いろんなセンサの値を出す(だけの)アプリ作ってきました 09/19/11
  • 4. Hack27. 位置情報の取得 位置情報の取得といえばGPSですが ネットワークからの取得など他の手段とともに LocationProvider として抽象化されています 現在のところ LoctionProvider として次の2つが定義されている GPS_PROVIDER NETWORK_PROVIDER GPS がなければ NETWORK から、という実装が可能 (Hack28) 09/19/11
  • 5. 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 するメソッドはそろっています。 } 09/19/11
  • 6. 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. 09/19/11
  • 7. Hack28. 位置情報の活用 LocationManager を臨機応変に切り替える 条件( Criteria )に応じて使用する LocationProvider を切り替えることが可能 位置情報の活用(すみません省略しました) 位置情報の変化に応じてブロードキャストインテント 特定の領域に入った  or  出た 09/19/11
  • 8. Hack28. 位置情報の活用 LocationManager の切り替え 条件 (Criteria) setPowerRequirement :消費電力 高?中?低の3段階で設定可能 setAccuracy  正確さ 粗い?細かくの2段階。 Level9( GingerBread )からは3段階。 setAltitudeRequirement 高さも取得するか? setSpeedRequired :スピードを取得するか? setBearingRequired :進行方向を取得するか? setCostAllowed  お金がかかってもいいか? 現時点では  GPS かネットワークから取得するだけですが 将来他の方法で位置情報を取得できる可能性もあるので こういう設定があるようです。 09/19/11
  • 9. 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(&quot; 最適なロケーションプロバイダ = &quot; + bestProvider); 09/19/11
  • 10. Hack29 センサを使う デバイスに搭載されているセンサの生の値を取り出すことができます Android としてサポートしているのは下のとおり TYPE_GYROSCOPE ジャイロセンサ(傾き等) TYPE_LIGHT 明るさセンサ TYPE_MAGNETICFIELD    磁界 TYPE_ORIENTATION     傾き TYPE_PRESSURE       圧力 TYPE_PROXIMITY       接近 TYPE_TEMPATURE      温度
  • 11. Hack29 センサを使う センサのタイプは違っても 値の取り出し方は同じです。 取り出した値の意味が、タイプごとに違うだけ 最大3つの値を返してきます ([0],[1],[2]) 例 電磁場は3つの値を返す それぞれ X 軸、 Y 軸、 Z 軸方向の電磁場の強さ 例 オリエンテーションセンサは3つの値を返す それぞれ 方向、ピッチ、ロール 例 温度センサは1つの値をかえす 温度(摂氏)
  • 12. 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 のライフサイクルにあわせてセンサの使用 / 不使用をコントロールする必要があります。 消費電力がもったいないですから。

Editor's Notes

  • #6: *requestLocationUpdates provider the name of the provider with which to register minTime the minimum time interval for notifications, in milliseconds. This field is only used as a hint to conserve power, and actual time between location updates may be greater or lesser than this value. minDistance the minimum distance interval for notifications, in meters listener a {#link LocationListener} whose onLocationChanged(Location) method will be called for each location update
  • #7: *requestLocationUpdates provider the name of the provider with which to register minTime the minimum time interval for notifications, in milliseconds. This field is only used as a hint to conserve power, and actual time between location updates may be greater or lesser than this value. minDistance the minimum distance interval for notifications, in meters listener a {#link LocationListener} whose onLocationChanged(Location) method will be called for each location update
  • #9: ACCURACY に関しては API Level 9 (GingerBread) から 3段階になるようです! Since: API Level 9 a constant indicating a high accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of less than 100 meters. Constant Value: 3 (0x00000003) public static final int ACCURACY_LOW Since: API Level 9 A constant indicating a low location accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of greater than 500 meters. Constant Value: 1 (0x00000001) public static final int ACCURACY_MEDIUM Since: API Level 9 A constant indicating a medium accuracy requirement - currently used only for horizontal accuracy. For horizontal position this corresponds roughly to to an accuracy of between 100 and 500 meters. Constant Value: 2 (0x00000002)
  • #10: ACCURACY に関しては API Level 9 (GingerBread) から 3段階になるようです! Since: API Level 9 a constant indicating a high accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of less than 100 meters. Constant Value: 3 (0x00000003) public static final int ACCURACY_LOW Since: API Level 9 A constant indicating a low location accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of greater than 500 meters. Constant Value: 1 (0x00000001) public static final int ACCURACY_MEDIUM Since: API Level 9 A constant indicating a medium accuracy requirement - currently used only for horizontal accuracy. For horizontal position this corresponds roughly to to an accuracy of between 100 and 500 meters. Constant Value: 2 (0x00000002)