[英]Android check for valid video file
如何在不检查其扩展名(.mp3 或 .3gp 等)的情况下检查视频文件是否有效。 意思是如何检查设备是否支持SD卡上的视频文件?
在 android 4.0 及更高版本中是否有任何 api 来验证视频文件?
我的场景:我下载视频后在 VideoView 上播放,下载成功后从本地 SD 卡播放。 下次请求相同的视频时,则检查 SD 卡,如果找到则开始播放(在这种情况下不下载)。 但有时网络错误或应用程序终止会中断下载(在这种情况下,视频文件未完全下载),因此下载的文件已损坏,VideoView 无法播放此文件。 那么如何检测这个损坏的文件。
这是对我有用的代码:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(context, Uri.fromFile(fileToTest));
String hasVideo = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO);
boolean isVideo = "yes".equals(hasVideo);
@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);
}
我认为这会很有用,该方法是一种较旧的方法,我用于其他目的只是稍微修改了一下供您使用,试试看,可能有用
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.