如何檢測機器人上的多媒體文件屬於音頻,視頻還是圖片?要判斷擴展名?
如果原生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;
}
}