基于Android掃描sd卡與系統(tǒng)文件的介紹
更新時間:2013年06月19日 09:40:53 作者:
本篇文章是對Android掃描sd卡與系統(tǒng)文件進行了詳細的分析介紹,需要的朋友參考下
如果你做過多媒體應用,一定會苦惱過,怎樣獲取sd卡中的多媒體文件。android還是很強大的,如果你知道怎么調(diào)用android的api,萬事就ok了。
當手機或模擬器開機時,會調(diào)用android的MediaScanner,掃描sd卡和內(nèi)存里的文件。以下是log信息。
12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new media retriever from pid 349<BR>
12-13 15:39:11.082: DEBUG/MediaScannerService(349): getDefaultLocale =zh_CN
12-13 15:39:11.122: DEBUG/SurfaceFlinger(102): Layer::requestBuffer(this=0x7c8c68), index=1, pid=12866, w=309, h=192 success
12-13 15:39:11.142: INFO/MediaScanner(349): mOriginalCount = 14, prune thumb flag = false<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): prescan time: 44ms<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): scan time: 13ms<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): postscan time: 2ms<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): total time: 59ms<BR>
12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker<BR>
12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker<BR>
12-13 15:39:11.182: DEBUG/MediaScannerService(349): done scanning volume external
那么掃描后的記錄它保存到哪里了呢。哈。你覺得在哪里呢?data/data/com.android.media/providers/databases/external
它存了些什么信息呢,拉出來看看吧:
那么,我們直接使用ContentProvider就可以直接獲取到sd卡中多媒體的信息了,你還用去listfile么?還用去自己解析媒體文件中的信息么(時長,文件名,專輯名。。應有盡有哦)?
Cursor cursor = context.getContentResolver().query(<BR> MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,<BR> new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE,<BR> MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,<BR> MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA}<BR> , "_size>?", new String[]{1024*1024+""},null);
好了,最后一個問題<BR> 當你往sd卡中添加一些多媒體文件的時候,android沒有自動將它刷新到數(shù)據(jù)庫中。那么我們怎么讓它手動刷新呢,如下:
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addDataScheme("file");
scanReceiver = new ScanSdFilesReceiver();
registerReceiver(scanReceiver, intentFilter);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
private class ScanSdFilesReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {
scanHandler.sendEmptyMessage(STARTED);
}
if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {
scanHandler.sendEmptyMessage(FINISHED);
}
}
}
private Handler scanHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case STARTED:
MyDialog scanDialog = new MyDialog(LocalList.this);
scanAlertDialog = scanDialog.scanFile();
scanAlertDialog.show();
Log.i(TAG, "showing");
break;
case FINISHED:
ArrayList<Song> tempSongs = ReadFileList.readDataFromSD(LocalList.this, LOCAL);
if (tempSongs != null && tempSongs.size()>0) {
if (songs != null && songs.size()>0) {
songs.clear();
songs.addAll(tempSongs);
songAdapter.notifyDataSetChanged();
}else {
songs = new ArrayList<Song>();
songs.addAll(tempSongs);
initSong_lv();
}
}else {
Toast.makeText(LocalList.this, "SD卡中沒有歌曲,請?zhí)砑雍笤賿呙?, Toast.LENGTH_SHORT).show();
}
Log.i(TAG, "finish");
if (scanAlertDialog!=null && scanAlertDialog.isShowing()) {
scanAlertDialog.dismiss();
}
unregisterReceiver(scanReceiver);
break;
case DISMISS:
Log.i(TAG, "dismiss");
if (scanAlertDialog!=null && scanAlertDialog.isShowing()) {
scanAlertDialog.dismiss();
}
default:
break;
}
當手機或模擬器開機時,會調(diào)用android的MediaScanner,掃描sd卡和內(nèi)存里的文件。以下是log信息。
復制代碼 代碼如下:
12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new media retriever from pid 349<BR>
12-13 15:39:11.082: DEBUG/MediaScannerService(349): getDefaultLocale =zh_CN
12-13 15:39:11.122: DEBUG/SurfaceFlinger(102): Layer::requestBuffer(this=0x7c8c68), index=1, pid=12866, w=309, h=192 success
12-13 15:39:11.142: INFO/MediaScanner(349): mOriginalCount = 14, prune thumb flag = false<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): prescan time: 44ms<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): scan time: 13ms<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): postscan time: 2ms<BR>
12-13 15:39:11.142: DEBUG/MediaScanner(349): total time: 59ms<BR>
12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker<BR>
12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker<BR>
12-13 15:39:11.182: DEBUG/MediaScannerService(349): done scanning volume external
那么掃描后的記錄它保存到哪里了呢。哈。你覺得在哪里呢?data/data/com.android.media/providers/databases/external
它存了些什么信息呢,拉出來看看吧:

那么,我們直接使用ContentProvider就可以直接獲取到sd卡中多媒體的信息了,你還用去listfile么?還用去自己解析媒體文件中的信息么(時長,文件名,專輯名。。應有盡有哦)?
復制代碼 代碼如下:
Cursor cursor = context.getContentResolver().query(<BR> MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,<BR> new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE,<BR> MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,<BR> MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA}<BR> , "_size>?", new String[]{1024*1024+""},null);
好了,最后一個問題<BR> 當你往sd卡中添加一些多媒體文件的時候,android沒有自動將它刷新到數(shù)據(jù)庫中。那么我們怎么讓它手動刷新呢,如下:
復制代碼 代碼如下:
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addDataScheme("file");
scanReceiver = new ScanSdFilesReceiver();
registerReceiver(scanReceiver, intentFilter);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
private class ScanSdFilesReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {
scanHandler.sendEmptyMessage(STARTED);
}
if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {
scanHandler.sendEmptyMessage(FINISHED);
}
}
}
private Handler scanHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case STARTED:
MyDialog scanDialog = new MyDialog(LocalList.this);
scanAlertDialog = scanDialog.scanFile();
scanAlertDialog.show();
Log.i(TAG, "showing");
break;
case FINISHED:
ArrayList<Song> tempSongs = ReadFileList.readDataFromSD(LocalList.this, LOCAL);
if (tempSongs != null && tempSongs.size()>0) {
if (songs != null && songs.size()>0) {
songs.clear();
songs.addAll(tempSongs);
songAdapter.notifyDataSetChanged();
}else {
songs = new ArrayList<Song>();
songs.addAll(tempSongs);
initSong_lv();
}
}else {
Toast.makeText(LocalList.this, "SD卡中沒有歌曲,請?zhí)砑雍笤賿呙?, Toast.LENGTH_SHORT).show();
}
Log.i(TAG, "finish");
if (scanAlertDialog!=null && scanAlertDialog.isShowing()) {
scanAlertDialog.dismiss();
}
unregisterReceiver(scanReceiver);
break;
case DISMISS:
Log.i(TAG, "dismiss");
if (scanAlertDialog!=null && scanAlertDialog.isShowing()) {
scanAlertDialog.dismiss();
}
default:
break;
}
您可能感興趣的文章:
- Android SD卡上文件操作及記錄日志操作實例分析
- 將文件放到Android模擬器的SD卡中的兩種解決方法
- Android獲取assets文件夾中的數(shù)據(jù)并寫入SD卡示例
- android通過配置文件設置應用安裝到SD卡上的方法
- Android編程之在SD卡上進行文件讀寫操作實例詳解
- 最簡單的SD卡文件遍歷Android程序
- Android 搜索SD卡文件的開發(fā)示例
- Android實現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法
- android 手機SD卡讀寫操作(以txt文本為例)實現(xiàn)步驟
- android讀寫sd卡操作寫入數(shù)據(jù)讀取數(shù)據(jù)示例
- Android開發(fā)之SD卡文件操作分析
相關(guān)文章
Android+SQLite數(shù)據(jù)庫實現(xiàn)的生詞記事本功能實例
這篇文章主要介紹了Android+SQLite數(shù)據(jù)庫實現(xiàn)的生詞記事本功能,結(jié)合具體實例形式分析了Android操作SQLite數(shù)據(jù)庫實現(xiàn)生詞記錄功能的操作步驟與相關(guān)注意事項,需要的朋友可以參考下2017-09-09Android利用MPAndroidChart繪制曲線圖表的基礎教程
最近在項目中要用到曲線圖,于是在網(wǎng)上找了很多很多,有AChartengine,MPAndroidChart,helloChart等等,我還用過基于html5的jsChart來做過,不過最終還是選擇了MPAndroidChart來做本文介紹了Android利用MPAndroidChart繪制曲線圖表的基礎教程,需要的朋友可以參考下。2018-03-03Android編程實現(xiàn)讀取手機聯(lián)系人、撥號、發(fā)送短信及長按菜單操作方法實例小結(jié)
這篇文章主要介紹了Android編程實現(xiàn)讀取手機聯(lián)系人、撥號、發(fā)送短信及長按菜單操作方法,以完整實例形式總結(jié)分析了Android編程實現(xiàn)讀取手機聯(lián)系人、撥號、發(fā)送短信及長按菜單等操作的相關(guān)技巧,需要的朋友可以參考下2015-10-10Android SlidingDrawer 抽屜效果的實現(xiàn)
本篇文章小編為大家介紹,Android SlidingDrawer 抽屜效果的實現(xiàn)。需要的朋友參考下2013-04-04