描述:app的列表内需要显示手机本地的照片、图片或者本地的视频。我的方案是使用图片异步加载,使用的是Github上面大名顶顶的图片异步加载工具:universal-image-loader,基于这个前提,对于我来说就是使用图片的uri来显示才最最方便。
解决问题的历程:开始由于项目着急且对MediaStore确实有过头疼的经历,因此明智的选择了直接开启线程并通过文件名的匹配来寻找本地的视频或者图片文件。速度叫一个慢,效率叫一个低,总之一个字:弱。好在公司里没有人有异议。不过毕竟不是最优方案,头上就像有一把达摩克利斯之剑,项目大难题都解决完了以后,杀了一个回马枪。
目前解决方案:直接使用MediaStore来获取信息。用来显示视频和图片
MediaStore中提供的媒体数据有很多垃圾数据,媒体文件已经不存在了,但是手机的媒体数据库文件却依然还有该媒体的信息。解决方案就是将每一个媒体文件的路径拿出来后,先去判断该媒体文件是否存在,不存在就跳过去,只拿存在的数据。
这个问题不大,下一个问题比较头疼。
就是有很多的视频都没有缩略图... ...
找过两个解决方案,其中方案以是使用:MediaScannerConnection。结果某些低端山寨手机上面没办法解决问题,而且问题趋势与手机低端程度成正比关系。凑活点的手机能够扫描出部分视频缩略图,低端到一定程度的时候干脆就什么都没有扫描到。
整理了一下相关代码:
package com.example.mediastoreproject.mediatools;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
public class MediaScanner {
private MediaScannerConnection mediaScanConn = null;
private MusicSannerClient client = null;
private String filePath = null;
private String fileType = null;
private String[] filePaths = null;
public MediaScanner(Context context) {
if (client == null) {
client = new MusicSannerClient();
}
if (mediaScanConn == null) {
mediaScanConn = new MediaScannerConnection(context, client);
}
}
class MusicSannerClient implements
MediaScannerConnection.MediaScannerConnectionClient {
public void onMediaScannerConnected() {
if (filePath != null) {
mediaScanConn.scanFile(filePath, fileType);
}
if (filePaths != null) {
for (String file : filePaths) {
mediaScanConn.scanFile(file, fileType);
}
}
filePath = null;
fileType = null;
filePaths = null;
}
public void onScanCompleted(String path, Uri uri) {
mediaScanConn.disconnect();
}
}
public void scanFile(String filepath, String fileType) {
this.filePath = filepath;
this.fileType = fileType;
mediaScanConn.connect();
}
public void scanFile(String[] filePaths, String fileType) {
this.filePaths = filePaths;
this.fileType = fileType;
mediaScanConn.connect();
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
}
找了不少资料都不怎么样,我要使用的是图片的uri,很多人都给出来获取Bitmap的方法,还有一个项目甚至提供了一个看起来很不错的方案,把所有的video的bitmap都生成一遍然后使用,程序推出后就bitmap就没了。
最方便的就是让android系统自己去针对指定的视频生成缩略图。其实方法就是
MediaStore.Video.Thumbnails.getThumbnail(ContentResolver cr, long origId, int kind, Options options)
我在启动程序的 时候进行检查,对没有缩略图的视频,记录下其MediaStore.Video.Media._ID,这个就是getThumbnail方法中的 long origId参数
暂时将一个半完整的项目作为资源备用下,方便以后温习和使用。