• Android扫描sd卡和系统文件


    原创作品,转载请注明
    如果你做过多媒体应用,一定会苦恼过,怎样获取sd卡中的多媒体文件。android还是很强大的,如果你知道怎么调用android的api,万事就ok了。
     当手机或模拟器开机时,会调用android的MediaScanner,扫描sd卡和内存里的文件。以下是log信息。
    12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new media retriever from pid 349
    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
    12-13 15:39:11.142: DEBUG/MediaScanner(349):  prescan time: 44ms
    12-13 15:39:11.142: DEBUG/MediaScanner(349):     scan time: 13ms
    12-13 15:39:11.142: DEBUG/MediaScanner(349): postscan time: 2ms
    12-13 15:39:11.142: DEBUG/MediaScanner(349):    total time: 59ms
    12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker
    12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker
    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(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE,
          MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
          MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA}
        , "_size>?", new String[]{1024*1024+""},null);
    
    
    好了,最后一个问题
     当你往sd卡中添加一些多媒体文件的时候,android没有自动将它刷新到数据库中。那么我们怎么让它手动刷新呢,如下:
    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卡中没有歌曲,请添加后再扫描", 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;
    			}
    
    
      
  • 相关阅读:
    获取ip地址,
    手机div侧滑删除
    swiper左右选项卡滑动
    table-cell使用
    返回和刷新
    电脑浏览器计算高度和宽度
    css 空格
    时间js
    Nodejs仿Apache的部分功能
    Nodejs中的JavaScript
  • 原文地址:https://www.cnblogs.com/stay/p/1898932.html
Copyright © 2020-2023  润新知