Download ppt - Android Hacks - Hack32

Transcript
Page 1: Android Hacks - Hack32

Hack 32  コンテントプロバイダを使う

*事情によりテンプレを使えませんでした

担当:鶴岡

Page 2: Android Hacks - Hack32

#32  コンテントプロバイダを使う この章では

既存のコンテントプロバイダであるMediaStore を利用することでコンテントプロバイダがいかに便利であるか!を理解し、ついでに利用方法も学びます。

Page 3: Android Hacks - Hack32

#32  コンテントプロバイダを使う MediaStore とは?

名前からしてお店のようですが DB です 端末内の画像や音楽などの

メディアファイルのメタデータ(位置や名前)のDBです。 特に面白そうなのが音楽のプレイリスト 音楽再生ソフトをまたいでプレイリストを使いまわせ

るのもこれのおかげです 残念ながら iPod にあるような

音楽の☆☆☆☆☆はサポートしてません。 Sdcard を差しなおすとぐるぐるしてるのは

MediaScan ( DB 作成)をしているからです。

Page 4: Android Hacks - Hack32

#32  コンテントプロバイダを使う

MediaStore とは?(続き) MediaStore に登録しないと

MediaStore の DB を利用しているアプリから村八分にされる 何らかのアプリケーションを作ったとして、

その中で新しい画像を生成したようなときには、MediaStore へ登録したほうがいいです

それがお作法なのでしょう Android2.3 のソースの中を見ても

Bluetooth で OPP 通信したりGaraly3D でクロップしたときにMediaScan(scanFile) しているのが(コード上で)見えます。

Page 5: Android Hacks - Hack32

#32  コンテントプロバイダを使う

コンテントプロバイダの利用にはContentResolver を利用します。

ContentResolver はActivity の getContentResolver で取得できます。

ContentResolver cr = getContentResolver()

Page 6: Android Hacks - Hack32

#32  コンテントプロバイダを使う getContentResolver() が必要なのは何故?

1つは、 ContentProvider 側からも読み書きを制限(Permission) することができる。その仕組みのために、コンテンツプロバイダにアクセスする側のコンテキストが必要となる

コンテキストについてはここでは(という逃げ方で言うけど)権限、と考えればよいと思います

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc. アプリケーション固有のリソースや、アクティビティの起動やブロード

キャストを投げるなどのアプリケーションレベルでの動作を許す(Allows) アプリケーション環境の情報のインターフェース。(私の摂訳)

Page 7: Android Hacks - Hack32

#32  コンテントプロバイダを使う コンテントプロバイダは DB ベースなので

利用には やはり query が必要です。 #32 では画像を表示したいので

そのファイルパスと表示名をいただくことにしました

String[] columns = {MediaStore.Images.Media.DATA, // 画像のファイルパスMediaStore.Images.Media.DISPLAY_NAME // 画像の表示名

};  

NOTE:MediaStore のテーブルは MediaStore.MediaColumns  インターフェースで決まっています。http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html

Page 8: Android Hacks - Hack32

#32  コンテントプロバイダを使う そして、検索結果を Cursor で受け取ります

mCursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);

String[] columns = {MediaStore.Images.Media.DATA, // 画像のファイルパスMediaStore.Images.Media.DISPLAY_NAME // 画像の表示名

};  

Page 9: Android Hacks - Hack32

#32  コンテントプロバイダを使う あとはカーソルを操作して

好きな row のデータをいただきます// Cursor が取得できていればカーソルを先頭へ移動させ画像を表示する if(mCursor != null) { mCursor.moveToFirst(); showImage(); }

// 現在のカーソル位置から画像の表示名を取得するcolumnIndex = mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME);columnName = mCursor.getString(columnIndex);

Page 10: Android Hacks - Hack32

#32  コンテントプロバイダを使う カーソルの操作

先頭、ラスト 前、次 オフセット、絶対位置

move(int offset)moveToFirst()moveToLast()moveToNext()moveToPrevious()moveToPosition(int absolutePosition)

Page 11: Android Hacks - Hack32

#32  コンテントプロバイダを使う コンテントプロバイダ利用の仕方まとめ1、 ContentResolver を  getContentResolver で呼び出す。2、呼び出した ContentResolver の query メソッドで  アクセスしたいコンテントプロバイダのURIと  取り出したいカラム、並び順を指定。     select XXX from YYY  の部分を決めてしまいます。  すると条件を満たすレコードが手に入る。

3、 ContentResolver で query を投げて   検索結果を query で受けます

4、カーソルを操作しながら検索結果にアクセス

Page 12: Android Hacks - Hack32

参考書籍

『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)http://www.oreilly.co.jp/books/9784873114569/