一.命令行方式查找多媒體數據庫:
1.啓動模擬器或在Eclipse中Run一個應用到手機上。
2.cmd 啓動命令提示符窗體,進入SDK目錄中存放adb的路徑:「cd D:\adt-bundle-windows-x86-20130219\sdk\platform-tools」
3.進入模擬器的linux系統:「adb shell」
4.列出Android全部的系統數據庫所在的包:「ls /data/data/」
獲得結果:
...
com.android.providers.media
...
5.查看多媒體數據庫文件是否存在:「ls -l /data/data/com.android.providers.media/databases/」
獲得結果:
external-c0070e03.db 是SD卡里的多媒體數據庫文件
internal.db 是內存裏的多媒體數據庫文件
6.以external-c0070e03.db爲當前scheme啓動SQLITE3:「sqlite3 /data/data/com.android.providers.media/databases/external-c0070e03.db」
7.列出全部多媒體數據庫的表:「.table」
獲得結果:
album_art audio otherfile
album_info audio_genres search
albums audio_genres_map searchhelpertitle
android_metadata audio_meta thumbnails
artist_info audio_playlists video
artists audio_playlists_map videothumbnails
artists_albums_map images
8.顯示images表的建立語句,查詢表中的全部列名:「.schema images」
獲得結果:
CREATE TABLE images (_id INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_n
ame TEXT,mime_type TEXT,title TEXT,date_added INTEGER,date_modified INTEGER,desc
ription TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBLE,longitude DOUBLE,d
atetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,buc
ket_display_name TEXT);
9.列出images表中全部圖片的路徑:「SELECT _data FROM images;」
注:SQLite的命令行工具介紹:http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2325981.html html
二. 代碼方式對多媒體數據庫的操做:
1.得到一個ContentResolver的實例,可經過Activity的成員方法getContentResovler()方法:
ContentResolver cr = this.getContentResolver();
2.使用query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)操做數據庫:
uri是「content://」形式的URI,
projection是封裝數據表中所需的列名數組,
selection是設置條件,至關於SQL語句中的where,
selectionArgs是要配合selection使用的,若是你在selection裏面有?,那麼你在selectionArgs寫的數據就會替換掉?,
sortOrder是排序規則。 java
// 獲取SD卡中的所有圖片的路徑列表 public List<String> queryGallery() { List<String> galleryList = new ArrayList<String>(); // 圖片路徑列表 List<String> imageFolderIds = new ArrayList<String>(); // 包含圖片的文件夾ID列表 ContentResolver cr = getActivity().getContentResolver(); String[] columns = {Images.Media.DATA, // 圖片絕對路徑 Images.Media.BUCKET_ID, // 直接包含該圖片文件的文件夾ID,防止在不一樣下的文件夾重名 Images.Media.BUCKET_DISPLAY_NAME, // 直接包含該圖片文件的文件夾名 "COUNT(1) AS count" // 統計當前文件夾下共有多少張圖片 }; String sortOrder = Images.Media.DATE_MODIFIED; //默認升序排列 Cursor cur = cr.query( Images.Media.EXTERNAL_CONTENT_URI, //MediaStore多媒體數據庫中SD卡上的image數據表的uri columns, null, null, sortOrder); while (cur.moveToNext()) { int image_id_column = cur.getColumnIndex(Images.Media.DATA); int bucket_id_column = cur.getColumnIndex(Images.Media.BUCKET_ID); int bucket_name_column = cur.getColumnIndex(Images.Media.BUCKET_DISPLAY_NAME); int count_column = cur.getColumnIndex("count"); String image_path = cur.getString(image_id_column); //文件路徑 int bucket_id = cur.getInt(bucket_id_column); //所在文件夾ID String bucket_name = cur.getString(bucket_name_column); //所在文件夾Name int count = cur.getInt(count_column); //當前文件夾下共有多少張圖片 if(count > 1) { imageFolderIds.add(String.valueOf(bucket_id)); } else { galleryList.add(image_path); } } int folderCounts = imageFolderIds.size(); if( folderCounts > 0 ) { for ( int i = 0; i < folderCounts; ++i ) { String[] projection = {MediaStore.Images.Thumbnails.DATA}; cur = cr.query( Images.Media.EXTERNAL_CONTENT_URI, projection, Images.Media.BUCKET_ID + " = ?", //查詢條件 new String[] {imageFolderIds.get(i)}, //查詢條件中問號對應的值 sortOrder); while (cur.moveToNext()) { int image_id_column = cur.getColumnIndex(Images.Media.DATA); String image_path = cur.getString(image_id_column); //文件路徑 galleryList.add(image_path); } } } if( null != cur && !cur.isClosed() ){ cur.close(); } return galleryList; }
三. 圖片選擇: public void showPickImagesDialog() { final CharSequence[] items = { "圖庫選擇", "拍照處理" }; AlertDialog dlg = AlertDialog.Builder(this) .setTitle("選擇圖片") .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { if (item == 1) { // 拍照處理 String state = Environment .getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent( "android.media.action.IMAGE_CAPTURE"); filePath = getFileName(); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(filePath))); startActivityForResult(intent,item); } } else { // 圖庫選擇 Intent getImage = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(getImage,item); } } }).create(); dlg.show(); }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 0: // 圖庫選擇 try { if (data != null && data.getData() != null) { Uri uri = data.getData(); } } catch (Exception e) { e.printStackTrace(); } break; case 1: // 拍照處理 try { File mFile = new File(filePath); if (mFile != null && mFile.length() > 0) { Uri uri = Uri.fromFile(mFile); } } catch (Exception e) { e.printStackTrace(); } break; default: break; } }