基于Android掃描sd卡與系統(tǒng)文件的介紹
當(dāng)手機(jī)或模擬器開(kāi)機(jī)時(shí),會(huì)調(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
那么掃描后的記錄它保存到哪里了呢。哈。你覺(jué)得在哪里呢?data/data/com.android.media/providers/databases/external
它存了些什么信息呢,拉出來(lái)看看吧:
那么,我們直接使用ContentProvider就可以直接獲取到sd卡中多媒體的信息了,你還用去listfile么?還用去自己解析媒體文件中的信息么(時(shí)長(zhǎng),文件名,專輯名。。應(yīng)有盡有哦)?
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);
好了,最后一個(gè)問(wèn)題<BR> 當(dāng)你往sd卡中添加一些多媒體文件的時(shí)候,android沒(méi)有自動(dòng)將它刷新到數(shù)據(jù)庫(kù)中。那么我們?cè)趺醋屗謩?dòng)刷新呢,如下:
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卡中沒(méi)有歌曲,請(qǐng)?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卡上文件操作及記錄日志操作實(shí)例分析
- 將文件放到Android模擬器的SD卡中的兩種解決方法
- Android獲取assets文件夾中的數(shù)據(jù)并寫(xiě)入SD卡示例
- android通過(guò)配置文件設(shè)置應(yīng)用安裝到SD卡上的方法
- Android編程之在SD卡上進(jìn)行文件讀寫(xiě)操作實(shí)例詳解
- 最簡(jiǎn)單的SD卡文件遍歷Android程序
- Android 搜索SD卡文件的開(kāi)發(fā)示例
- Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來(lái)的方法
- android 手機(jī)SD卡讀寫(xiě)操作(以txt文本為例)實(shí)現(xiàn)步驟
- android讀寫(xiě)sd卡操作寫(xiě)入數(shù)據(jù)讀取數(shù)據(jù)示例
- Android開(kāi)發(fā)之SD卡文件操作分析
相關(guān)文章
如何通過(guò)Battery Historian分析Android APP耗電情況
Android 從兩個(gè)層面統(tǒng)計(jì)電量的消耗,分別為軟件排行榜及硬件排行榜。它們各有自己的耗電榜單,軟件排行榜為機(jī)器中每個(gè) App 的耗電榜單,硬件排行榜則為各個(gè)硬件的耗電榜單。這兩個(gè)排行榜的統(tǒng)計(jì)是互為獨(dú)立,互不干擾的2021-06-06
Android中制作進(jìn)度框和環(huán)形進(jìn)度條的簡(jiǎn)單實(shí)例分享
這篇文章主要介紹了Android中制作進(jìn)度框和環(huán)形進(jìn)度條的簡(jiǎn)單實(shí)例分享,環(huán)形進(jìn)度條帶有基本的百分比顯示,需要的朋友可以參考下2016-03-03
Flutter 網(wǎng)絡(luò)請(qǐng)求框架封裝詳解
這篇文章主要介紹了Flutter 網(wǎng)絡(luò)請(qǐng)求框架封裝詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
通過(guò)實(shí)例解析android Activity啟動(dòng)過(guò)程
這篇文章主要介紹了通過(guò)實(shí)例解析android Activity啟動(dòng)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
模仿美團(tuán)點(diǎn)評(píng)的Android應(yīng)用中價(jià)格和購(gòu)買(mǎi)欄懸浮固定的效果
這篇文章主要介紹了模仿美團(tuán)點(diǎn)評(píng)的Android應(yīng)用中價(jià)格和購(gòu)買(mǎi)欄懸浮固定的效果,文章后半還針對(duì)快速滑動(dòng)操作給出了一個(gè)響應(yīng)優(yōu)化的方法,需要的朋友可以參考下2016-04-04
Android實(shí)現(xiàn)讀寫(xiě)JSON數(shù)據(jù)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)讀寫(xiě)JSON數(shù)據(jù)的方法,以完整實(shí)例形式分析了Android解析及生成json數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
基于Manifest.xml中不要出現(xiàn)重復(fù)的uses permission的說(shuō)明
本篇文章對(duì)Manifest.xml中不要出現(xiàn)重復(fù)的uses permission進(jìn)行了介紹。需要的朋友參考下2013-05-05
使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作
這篇文章主要介紹了使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Android實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小程序
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Android中findViewById獲取控件返回為空問(wèn)題怎么解決
這篇文章主要介紹了Android中findViewById獲取控件返回為空問(wèn)題怎么解決的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

