4.4以下可以通过发送广播通知多媒体库自动扫描,filePath是图片保存的完整路径
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filePath)));
4.4 Android把系统广播的权限回收了,只有系统应用才可以发送系统广播 所以4.4以上可以通过 MediaScannerConnection,都会通过这种方式告诉MediaProvider同步媒体数据库。
封装 自定义MediaScanner
public class MediaScanner implements MediaScannerConnection.MediaScannerConnectionClient { /** * 扫描对象 */ private MediaScannerConnection mediaScanConn = null; public MediaScanner(Context context) { //实例化 mediaScanConn = new MediaScannerConnection(context, this); } /**文件路径集合**/ private String[] filePaths; /**文件MimeType集合**/ private String[] mimeTypes; /** * 扫描文件 * @author YOLANDA * @param mimeTypes */ public void scanFiles(String[] filePaths, String[] mimeTypes) { this.filePaths = filePaths; this.mimeTypes = mimeTypes; mediaScanConn.connect();//连接扫描服务 } /** * @author YOLANDA */ @Override public void onMediaScannerConnected() { for (int i = 0; i < filePaths.length; i++) { mediaScanConn.scanFile(filePaths[i], mimeTypes[i]);//服务回调执行扫描 } filePaths = null; mimeTypes = null; } private int scanTimes = 0; /** * 扫描一个文件完成 * @author YOLANDA * @param path * @param uri */ @Override public void onScanCompleted(String path, Uri uri) { scanTimes ++; if(scanTimes == filePaths.length) {//如果扫描完了全部文件 mediaScanConn.disconnect();//断开扫描服务 scanTimes = 0;//复位计数 } } }
当图片保存好后,通过MediaScanner更新媒体库
MediaScanner mediaScanner = new MediaScanner(this); String[] filePaths = new String[]{filePath}; String[] mimeTypes = new String[]{MimeTypeMap.getSingleton().getMimeTypeFromExtension("png")}; mediaScanner.scanFiles(filePaths, mimeTypes);