Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Android Hacks - Hack27 ~ Hack29

891 views

Published on

「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。

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

  • Be the first to comment

  • Be the first to like this

Android Hacks - Hack27 ~ Hack29

  1. 1. ANDROID HACKS #21,27,28,29 担当: tsuruoka 09/19/11
  2. 2. この資料について <ul><li>この資料は下記の本をベースに勉強会で作成した資料です。 </li></ul><ul><ul><li>『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊) </li></ul></ul><ul><li>この本の紹介ページが下記にあります。 </li></ul><ul><ul><li>http://www.oreilly.co.jp/books/9784873114569/ </li></ul></ul>09/19/11
  3. 3. アジェンダ <ul><li>Hack27 位置情報を取得する </li></ul><ul><ul><li>位置情報の取得の仕方 </li></ul></ul><ul><li>Hack28 位置情報を活用する </li></ul><ul><ul><li>位置情報取得の手段を臨機応変に </li></ul></ul><ul><ul><li>位置情報変更時にブロードキャスト </li></ul></ul><ul><ul><li>指定した領域に入った / 出た </li></ul></ul><ul><li>Hack29 センサを使う </li></ul><ul><ul><li>いろんなセンサの値を出す(だけの)アプリ作ってきました </li></ul></ul>09/19/11
  4. 4. Hack27. 位置情報の取得 <ul><li>位置情報の取得といえばGPSですが ネットワークからの取得など他の手段とともに LocationProvider として抽象化されています </li></ul><ul><li>現在のところ LoctionProvider として次の2つが定義されている </li></ul><ul><ul><li>GPS_PROVIDER </li></ul></ul><ul><ul><li>NETWORK_PROVIDER </li></ul></ul><ul><li>GPS がなければ NETWORK から、という実装が可能 (Hack28) </li></ul>09/19/11
  5. 5. Hack27. 位置情報の取得       LocationManager <ul><li>取得方法 </li></ul><ul><li>implements LocationLisener する。 </li></ul><ul><li>onCreate で </li></ul><ul><li>// LocationManager の取得 </li></ul><ul><li>mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); </li></ul><ul><li>// LocationListener を登録 </li></ul><ul><li>mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); </li></ul><ul><li>さらに 位置情報の変化(=ほっといても多少動きますが、)マシンが移動したことに対して </li></ul><ul><li>public void onLocationChanged(Location location) { </li></ul><ul><li>// 新しい location で 画面を更新するなどのコード </li></ul><ul><li>location.getLatitude() などの </li></ul><ul><li>緯度、経度、プロバイダーなどを get するメソッドはそろっています。 </li></ul><ul><li>} </li></ul>09/19/11
  6. 6. Hack27. 位置情報の取得       LocationManager <ul><li>* implements LocationListener 必須のメソッドは </li></ul><ul><li>Public Methods </li></ul><ul><li>abstract void   onLocationChanged(Location location) </li></ul><ul><li>Called when the location has changed. </li></ul><ul><li>abstract void   onProviderDisabled(String provider) </li></ul><ul><li>Called when the provider is disabled by the user. </li></ul><ul><li>abstract void   onProviderEnabled(String provider) </li></ul><ul><li>Called when the provider is enabled by the user. </li></ul><ul><li>abstract void   onStatusChanged(String provider, int status, Bundle extras) </li></ul><ul><li>Called when the provider status changes. </li></ul>09/19/11
  7. 7. Hack28. 位置情報の活用 <ul><li>LocationManager を臨機応変に切り替える </li></ul><ul><ul><li>条件( Criteria )に応じて使用する LocationProvider を切り替えることが可能 </li></ul></ul><ul><li>位置情報の活用(すみません省略しました) </li></ul><ul><ul><li>位置情報の変化に応じてブロードキャストインテント </li></ul></ul><ul><ul><li>特定の領域に入った  or  出た </li></ul></ul>09/19/11
  8. 8. Hack28. 位置情報の活用 LocationManager の切り替え <ul><li>条件 (Criteria) </li></ul><ul><ul><li>setPowerRequirement :消費電力 高・中・低の3段階で設定可能 </li></ul></ul><ul><ul><li>setAccuracy  正確さ 粗い・細かくの2段階。 </li></ul></ul><ul><ul><ul><li>Level9( GingerBread )からは3段階。 </li></ul></ul></ul><ul><ul><li>setAltitudeRequirement 高さも取得するか? </li></ul></ul><ul><ul><li>setSpeedRequired :スピードを取得するか? </li></ul></ul><ul><ul><li>setBearingRequired :進行方向を取得するか? </li></ul></ul><ul><ul><li>setCostAllowed  お金がかかってもいいか? </li></ul></ul><ul><ul><ul><li>現時点では  GPS かネットワークから取得するだけですが 将来他の方法で位置情報を取得できる可能性もあるので こういう設定があるようです。 </li></ul></ul></ul>09/19/11
  9. 9. Hack28. 位置情報の活用 LocationManager の切り替え <ul><ul><li>Criteria の記述例 </li></ul></ul><ul><ul><li>// LocationManager の取得 </li></ul></ul><ul><ul><li>LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); </li></ul></ul><ul><ul><li>Criteria criteria = new Criteria(); </li></ul></ul><ul><ul><li>criteria.setPowerRequirement(Criteria.POWER_LOW); </li></ul></ul><ul><ul><li>criteria.setAccuracy(Criteria.ACCURACY_FINE); </li></ul></ul><ul><ul><li>criteria.setAltitudeRequired(false); </li></ul></ul><ul><ul><li>criteria.setSpeedRequired(false); </li></ul></ul><ul><ul><li>criteria.setBearingRequired(false); </li></ul></ul><ul><ul><li>criteria.setCostAllowed(false); </li></ul></ul><ul><ul><li>String bestProvider = lm.getBestProvider(criteria, true); </li></ul></ul><ul><ul><li>((TextView) findViewById(R.id.main_tv_bestprovider)).setText(&quot; 最適なロケーションプロバイダ = &quot; </li></ul></ul><ul><ul><li>+ bestProvider); </li></ul></ul>09/19/11
  10. 10. Hack29 センサを使う <ul><li>デバイスに搭載されているセンサの生の値を取り出すことができます </li></ul><ul><li>Android としてサポートしているのは下のとおり </li></ul><ul><li>TYPE_GYROSCOPE ジャイロセンサ(傾き等) </li></ul><ul><li>TYPE_LIGHT 明るさセンサ </li></ul><ul><li>TYPE_MAGNETICFIELD    磁界 </li></ul><ul><li>TYPE_ORIENTATION     傾き </li></ul><ul><li>TYPE_PRESSURE       圧力 </li></ul><ul><li>TYPE_PROXIMITY       接近 </li></ul><ul><li>TYPE_TEMPATURE      温度 </li></ul>
  11. 11. Hack29 センサを使う <ul><li>センサのタイプは違っても 値の取り出し方は同じです。 </li></ul><ul><ul><li>取り出した値の意味が、タイプごとに違うだけ </li></ul></ul><ul><ul><li>最大3つの値を返してきます ([0],[1],[2]) </li></ul></ul><ul><ul><li>例 電磁場は3つの値を返す </li></ul></ul><ul><ul><ul><li>それぞれ X 軸、 Y 軸、 Z 軸方向の電磁場の強さ </li></ul></ul></ul><ul><ul><li>例 オリエンテーションセンサは3つの値を返す </li></ul></ul><ul><ul><ul><li>それぞれ 方向、ピッチ、ロール </li></ul></ul></ul><ul><ul><li>例 温度センサは1つの値をかえす </li></ul></ul><ul><ul><ul><li>温度(摂氏) </li></ul></ul></ul>
  12. 12. Hack29 センサを使う 実装 <ul><li>本のやり方とは違いますが </li></ul><ul><li>Activity に implements SensorEventListener </li></ul><ul><li>onCreate で </li></ul><ul><li>// センサマネジャの取得 </li></ul><ul><li>sensorManager = (SensorManager)getSystemService( SENSOR_SERVICE ); </li></ul><ul><li>onResume で </li></ul><ul><li>// センサリッスンの開始 </li></ul><ul><li>List<Sensor> sensors = sensorManager.getSensorList(Sensor. TYPE_ACCELEROMETER ); </li></ul><ul><li>if (sensors.size() > 0) { </li></ul><ul><li>sensorManager.registerListener(this, sensors. get (0), SensorManager. SENSOR_DELAY_FASTEST ); </li></ul><ul><li>} </li></ul><ul><li>On Pause で </li></ul><ul><li>// センサリッスンの停止 </li></ul><ul><li>sensorManager.unregisterListener(this); </li></ul><ul><li>Acitity のライフサイクルにあわせてセンサの使用 / 不使用をコントロールする必要があります。 </li></ul><ul><li>消費電力がもったいないですから。 </li></ul>

×