如何检测机器人上的多媒体文件属于音频,视频还是图片?要判断扩展名?
如果原生android不支持的媒体文件或者经过修改framework,添加了支持的媒体文件,还要添加扩展名的判断吗?
经过查看android源码发现,framework中有标记为hide的注解,这说明我们的Application layer不能调用这些类以及类下的方法和属性,那么我们只能通过反射机制来调用。那么看一下以下的实现方式。
公共类JudgeMultiMediaType {
<?>类mMediaFile,mMediaFileType;
方法getFileTypeMethod,isAudioFileTypeMethod,isVideoFileTypeMethod,isImageFileTypeMethod;
字符串方法名=“getBoolean”;
串getFileType =“getFileType”;
串isAudioFileType =“isAudioFileType”;
串isVideoFileType =“isVideoFileType”;
串isImageFileType =“isImageFileType”;
现场的fileType;
公共无效initReflect(){
尝试{
mMediaFile =的Class.forName(“android.media.MediaFile”);
mMediaFileType =的Class.forName(“android.media.MediaFile $ MediaFileType”);
的fileType = mMediaFileType.getField(在“filetype”);
getFileTypeMethod = mMediaFile.getMethod(getFileType,String.class);
isAudioFileTypeMethod = mMediaFile.getMethod(isAudioFileType,int.class);
isVideoFileTypeMethod = mMediaFile.getMethod(isVideoFileType,int.class);
isImageFileTypeMethod = mMediaFile.getMethod(isImageFileType,int.class);
}赶上(NoSuchMethodException E){
e.printStackTrace();
}赶上(ClassNotFoundException异常E){
e.printStackTrace();
}赶上(NoSuchFieldException E){
e.printStackTrace();
}
}
公众诠释getMediaFileType(字符串路径){
int型= 0;
尝试{
对象obj = getFileTypeMethod.invoke(mMediaFile,路径);
如果(OBJ == NULL){
类型= -1;
其他()
类型= fileType.getInt(OBJ);
}
}赶上(IllegalArgumentException异常E){
e.printStackTrace();
}赶上(IllegalAccessException E){
e.printStackTrace();
}赶上(InvocationTargetException E){
e.printStackTrace();
}
返回类型;
}
公共布尔isAudioFile(INT的fileType){
布尔isAudioFile = FALSE;
尝试{
isAudioFile =(布尔)isAudioFileTypeMethod.invoke(mMediaFile,文件类型);
}赶上(IllegalArgumentException异常E){
e.printStackTrace();
}赶上(IllegalAccessException E){
e.printStackTrace();
}赶上(InvocationTargetException E){
e.printStackTrace();
}
返回isAudioFile;
}
公共布尔isVideoFile(INT的fileType){
布尔isVideoFile = FALSE;
尝试{
isVideoFile =(布尔)isVideoFileTypeMethod.invoke(mMediaFile,文件类型);
}赶上(IllegalArgumentException异常E){
e.printStackTrace();
}赶上(IllegalAccessException E){
e.printStackTrace();
}赶上(InvocationTargetException E){
e.printStackTrace();
}
返回isVideoFile;
}
公共布尔isImageFile(INT的fileType){
布尔isImageFile = FALSE;
尝试{
isImageFile =(布尔)isImageFileTypeMethod.invoke(mMediaFile,文件类型);
}赶上(IllegalArgumentException异常E){
e.printStackTrace();
}赶上(IllegalAccessException E){
e.printStackTrace();
}赶上(InvocationTargetException E){
e.printStackTrace();
}
返回isImageFile;
}
}