MediaScanner

    当图片在compress()保存之后,使用gallery去查看的时候,发现刚才保存的图片不存在。          
    这种情况下,需要使用 MediaScannerConnection 去通知系统扫描到多媒体数据库

 
  MediaScannerConnection.MediaScannerConnectionClient client = new MediaScannerConnectionClient(){
		  //MediaScannerConnection mediaScannerConnection = mConnectionMap.get(MEDIA_CONNECT_KEY);
		// -------千万不要写在这里 初始化顺利的原因 mediaScannerConnection是null 会出现系统错误提示,也不能达到扫描的目的
                @Override
                public void onMediaScannerConnected() {
                    MediaScannerConnection mediaScannerConnection = mConnectionMap.get(MEDIA_CONNECT_KEY);  
                    //  注意这里
                    if(DEBUG) Log.i(TAG,"onMedia Connected~~~~~~~~~~~");
                    if(mediaScannerConnection != null)
                        mediaScannerConnection.scanFile(file.toString(),null);
                    else {
                        if(DEBUG) Log.i(TAG,"NUll point");
                    }
                }

                @Override
                public void onScanCompleted(String path, Uri uri) {
                    MediaScannerConnection mediaScannerConnection = mConnectionMap.get(MEDIA_CONNECT_KEY);
                    if(mediaScannerConnection != null) mediaScannerConnection.disconnect();
                    if(DEBUG) Log.i(TAG,"connect is over~~~~~~`");
                }
            };
            MediaScannerConnection  mediaScannerConnection = new MediaScannerConnection(this,client);
            mConnectionMap.put(MEDIA_CONNECT_KEY, mediaScannerConnection);
            mediaScannerConnection.connect();


    特别注意,可以出现 has leaked ServiceConnection android.media.MediaScannerConnecti 类似的系统错误提示,原因是mediaScannerConnection是null
    onScanCompleted()不能被调用,activity就结束。

    但是调用MediaScannerConnection之后,在gallery 仍然没有看到最近保存的图片,原因在于gallery,并不是时时update的,需要重启gallery甚至是关机才能搞定。
    这样很麻烦,在网上还有另一种方式
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.toString())));
    这种方式只能扫描具体文件,不能扫描文件夹,重要的是通过尝试,其效果与 MediaScannerConnection 方式差不多

    必杀技:
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
    这种方式扫描系统默认路徑下的文件夹

    sendBroadcast 这样的系统广播,最好不要随便发,会带来意想不到的问题,推荐使用 MediaScannerConnection 
    sendBroadcast 详细分析,看以下这篇文章:
    http://www.iteye.com/topic/697492
    最近好懒,要多写写阿~~~~~~~~

你可能感兴趣的:(Scanner)