打算做一个自己的视频播放器,其中第一个功能就是:获取手机里所有的视频文件信息,原本是打算通过 内容提供者,查询媒体库,也就是如下代码
Cursor cursor = context.getContentResolver().query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
结果发现:如果通过网上下载等方式接受视频文件,媒体库不能时时刷新,只能通过重启手机分方式来更新媒体库,这样很不友好,又考虑能否让系统来刷新SD卡,结果发现如果通过发广播sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + context.getExternalFilesDir(null))));
会导致java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED on KitKat only
那么说只有一种方法了:遍历外部存储,找到视频文件
代码如下:
// 递归遍历
public void eachAllMedias(File f) {
if (f != null && f.exists() && f.isDirectory()) {
File[] files = f.listFiles();
if (files != null) {
for (File file : f.listFiles()) {
if (file.isDirectory()) {
eachAllMedias(file);
} else if (file.exists() && file.canRead()
&& FileUtils.isVideoOrAudio(file)) {
list.add(file.getName());
}
}
}
}
}
FileUtils 代码如下
public class FileUtils {
/** 是否是音频或者视频
* @throws Exception */
public static boolean isVideoOrAudio(File f) {
final String ext = getFileExtension(f);
ArrayList<String> list = new ArrayList<String>();
list.add("avi");
list.add("rmvb");
list.add("wmv");
list.add("mkv");
list.add("mp4");
return list.contains(ext);
}
/** 获取文件后缀
* @throws Exception */
public static String getFileExtension(File f) {
if (f != null) {
String filename = f.getName();
int i = filename.lastIndexOf('.');
if (i > 0 && i < filename.length() - 1) {
return filename.substring(i + 1).toLowerCase();
}
}
return null;
}
}
这样通过相对暴力的方法就能获取所有的音视频文件,不知道读者是否有更好的方法?