项目中需求,应用开通的云存储过期,导致用户之前的报警消息不可预览查看,因此,需求把应用中设备产生的报警图片和视频保存到相册,那么问题来了,用网上的一些方案扫描或者广播方式通知更新相册,对于一些手机(三星、华为mate8等部分8.0系统手机)结果就是失败,看下面一个例子
广播更新:
public void refreshAlbum(String fileAbsolutePath) {
File imgFile = new File(fileAbsolutePath);
Uri uri = Uri.fromFile(imgFile);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(uri);
mContext.sendBroadcast(mediaScanIntent);
}
不建议使用,会通知图库整个进行更新
扫描更新:
public void refreshAlbum(String fileAbsolutePath) {
MediaScannerConnection mMediaScanner = new MediaScannerConnection(this, null);
mMediaScanner.connect();
if (mMediaScanner.isConnected()) {
mMediaScanner.scanFile(fileAbsolutePath, Constants.VIDEO_MIME_TYPE_MP4);
} else {
Elog.i(TAG, " 连接失败 ")
}
}
上面的例子,极有可能会走“连接失败”,因为connect()执行需要时间,不可能立刻就会连接成功,所以扫描不了,也无法刷新,怎么解决呢!需要下面的优化,通过MediaScannerConnectionClient回调监听,确定MediaScannerConnection已经连接上,再进行扫描更新
public void refreshAlbum(String fileAbsolutePath, boolean isVideo) {
mMediaScanner = new MediaScannerConnection(mContext, new MediaScannerConnection.MediaScannerConnectionClient() {
@Override
public void onMediaScannerConnected() {
if (mMediaScanner.isConnected()) {
Elog.i(TAG, " 连接成功 ")
if (isVideo) {
mMediaScanner.scanFile(fileAbsolutePath, "video/mp4");
} else {
mMediaScanner.scanFile(fileAbsolutePath, "image/jpeg");
}
} else {
ELog.e(TAG, " refreshAlbum() 无法更新图库,未连接,广播通知更新图库,异常情况下 ");
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
ELog.i(TAG, " 扫描完成 path: ", path, " uri: ", uri);
}
});
mMediaScanner.connect();
}
使用上面的优化方案就可以很完美的解决保存相册中的数据资源(图片、视频)不显示的问题。