当手机开机、插拔USB连接时,Android系统会启动MediaScanner,扫描SD卡和内存里面的文件,扫描的结果保存在data/data/com.android.providers.media/databases/external.db下。通过DDMS可以找到,数据库中包含了图片、视频、音乐等文件的信息。开发者不用遍历文件,只要使用ContentProvider就可以获取SD卡中不同种类的文件列表。
数据库external.db:
sqlite3 external.db
.tables
所有的表:
album_art audio_genres images
album_info audio_genres_map log
albums audio_genres_map_noid search
android_metadata audio_meta searchhelpertitle
artist_info audio_playlists semc_metadata
artists audio_playlists_map semc_metadata_version
artists_albums_map files thumbnails
audio files_ext video
audio_ext files_with_ext videothumbnails
选择images并查询;
.mode column (.mode column 将设置为列显示模式,.header 将显示列名)
.header ON
select * from images;
结果如下:
_id|_data|_size|_display_name|mime_type|title|date_added|date_modified|description|picasa_id|isprivate|latitude|longitude|datetaken|orientation|mini_thumb_magic|bucket_id|bucket_display_name|width|height
86|/mnt/sdcard/DCIM/100ANDRO/DSC_0001.jpg|607597|DSC_0001.jpg|image/jpeg|DSC_0001|1371782044|1361346484||||||1361346484000|90|7241443144086764191|1278012876|100ANDRO|2048|1536
示例代码:
列表界面:
public class PlayerActivity extends Activity {
private ListView listView;
private CursorAdapter adapter;
private Cursor cursor;
private String path;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.listView);
ContentResolver contentResolver = getContentResolver();
cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, null, null, null);
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor,
new String[] {
MediaStore.Images.ImageColumns.TITLE, MediaStore.Images.ImageColumns.SIZE
}, new int[] {
android.R.id.text1, android.R.id.text2
});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
try {
if (cursor.moveToPosition(position)) {
path = cursor.getString(cursor.getColumnIndex("_data"));
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
Intent intent = new Intent(PlayerActivity.this, ShowActivity.class);
intent.putExtra("path", path);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
cursor.close();
}
}
显示界面:
public class ShowActivity extends Activity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.show);
imageView = (ImageView)findViewById(R.id.show);
Intent intent = getIntent();
String path = intent.getStringExtra("path");
BitmapDrawable drawable = new BitmapDrawable(getResources(), path);
imageView.setImageDrawable(drawable);
}
}
MediaStore:基于SQLite的多媒体数据库,包含了视频、音频、图片等所有的多媒体文件的信息。
MediaStore.Audio:音频信息
MediaStore.Files:非媒体信息
MediaStore.Images:图片信息
MediaStore.Video:视频信息
MediaStore.MediaColumns:部分MediaProvider表的常用列