如果检查视频文件是否有效而不检查其扩展名(.mp3或.3gp等)。是否支持设备支持如何检查SD卡上的视频文件?
在Android 4.0及以上版本中是否有验证视频文件的API?
我的场景:我在下载后在VideoView上播放视频,并在下载成功后从本地SD卡播放。下次当请求相同的视频,然后检查SD卡,如果找到,然后开始播放(在这种情况下没有下载)。但有时网络错误或app kill中断下载(在这种情况下视频文件未完全下载),因此下载的文件已损坏,VideoView无法播放此文件。那么如何检测这个损坏的文件。
答案 0 :(得分:8)
以下代码对我有用:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(context, Uri.fromFile(fileToTest));
String hasVideo = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO);
boolean isVideo = "yes".equals(hasVideo);
答案 1 :(得分:0)
我认为这将是有用的,该方法是一个旧的,我用于其他目的只是修改了一点供你使用,试试看,可以工作
private void checkAndLoadFile(
File currentFile) {
String path = currentFile.getAbsolutePath();
String extension = Utility.getExtension(path);
MimeTypeMap mimeMap = MimeTypeMap.getSingleton();
if(mimeMap.hasExtension(extension))
{
String mimeType = mimeMap.getMimeTypeFromExtension(extension);
Intent viewFile = new Intent(Intent.ACTION_VIEW);
viewFile.setDataAndType(Uri.fromFile(currentFile), mimeType);
PackageManager pm = getPackageManager();
List<ResolveInfo> apps =
pm.queryIntentActivities(viewFile, PackageManager.MATCH_DEFAULT_ONLY);
if (apps.size() > 0)
startActivity(viewFile); //This video is supported and there are apps installed in this device to open the video
else
showAsNotSupported();
} else
showAsNotSupported();
}
答案 2 :(得分:0)
@Alex给出了正确答案,但仍然存在一些问题,例如@Kirill在评论中提到setDataSource经常抛出java.lang.RuntimeException: setDataSource failed
异常。这是有效视频文件的功能检查
private boolean videoFileIsCorrupted(String path){
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(myContext, Uri.parse(path));
}catch (Exception e){
e.printStackTrace();
return false;
}
String hasVideo = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO);
return "yes".equals(hasVideo);
}