大家好,又见面了,我是全栈君。
【測试结果】:加入时弹出提示“unsupported video format”
该问题主要提如今手机彩信视频附件不支持该AVI格式的视频,因此我们通过操作流程对代码进行追踪,查找“unsupported video format”产生的位置。
我们从加入附件界面ComposeMessageActivity类的onActivityResult()方法開始。
–》onActivityResult()调用代码例如以下:
case REQUEST_CODE_ATTACH_VIDEO:
if (data != null) {
mAttachFileUri = data.getData();
addVideoAsync(mAttachFileUri, false);
}
break;
–》addVideo()–》setAttachment()<WorkingMessage.java> 调用代码例如以下:
result = append ? appendMedia(type, dataUri, slideShowEditor)
: changeMedia(type, dataUri, slideShowEditor);
–》changeMedia()–》internalChangeMedia()–》changeVideo()<SlideshowEditor.java>
–》new VideoModel()<TAG 1-1>
public VideoModel(Context context, Uri uri, RegionModel region)
throws MmsException {
this(context, null, null, uri, region);
initModelFromUri(uri);
checkContentRestriction();
}
–》initModelFromUri()<VideoModel.java> 调用代码例如以下:
private void initModelFromUri(Uri uri) throws MmsException {
String scheme = uri.getScheme();
if (scheme.equals(“content”)) {
initFromContentUri(uri);
} else if (uri.getScheme().equals(“file”)) {
initFromFile(uri);
}
initMediaDuration();
}
上述代码通过加入Log进行输出,这里的scheme的值为“file”。
–》initFromFile()
private void initFromFile(Uri uri) throws MmsException {
String path = uri.getPath();
mSrc = path.substring(path.lastIndexOf(‘/’) + 1);
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
String extension = MimeTypeMap.getFileExtensionFromUrl(mSrc);
if (TextUtils.isEmpty(extension)) {
// getMimeTypeFromExtension() doesn’t handle spaces in filenames nor can it handle
// urlEncoded strings. Let’s try one last time at finding the extension.
int dotPos = mSrc.lastIndexOf(‘.’);
if (0 <= dotPos) {
extension = mSrc.substring(dotPos + 1);
}
}
mContentType = mimeTypeMap.getMimeTypeFromExtension(extension.toLowerCase());
// It’s ok if mContentType is null. Eventually we’ll show a toast telling the
// user the video couldn’t be attached.
if (TextUtils.isEmpty(mContentType)) {
throw new MmsException(“Type of media is unknown.”);
}
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
Log.v(TAG, “New VideoModel initFromFile created:”
+ ” mSrc=” + mSrc
+ ” mContentType=” + mContentType
+ ” mUri=” + uri);
}
}
上述代码中对mContentType进行赋值,这里我们通过Log输出,mContentType的值为“video/x-msvideo”。
接下来接着进行构造函数<TAG1-1>中的方法checkContentRestriction()。
protected void checkContentRestriction() throws ContentRestrictionException {
ContentRestriction cr = ContentRestrictionFactory.getContentRestriction();
cr.checkVideoContentType(mContentType);
}
–》checkVideoContentType()<CarrierContentRestriction.java>
public void checkAudioContentType(String contentType)
throws ContentRestrictionException {
if (null == contentType) {
throw new ContentRestrictionException(“Null content type to be check”);
}
if (!sSupportedAudioTypes.contains(contentType)) {
throw new UnsupportContentTypeException(“Unsupported audio content type : “
+ contentType);
}
}
上述代码中加粗标识的代码就是測试描写叙述的问题。我们接着分析本类中静态语句快中的代码。
sSupportedVideoTypes = ContentType.getVideoTypes();
终于我们终于到ContentType.java类,而且发现该类中没有加入对该视频格式的支持。因此加入下面代码进行支持。
……
public static final String VIDEO_UNSPECIFIED = “video/*”;
public static final String VIDEO_3GPP = “video/3gpp”;
public static final String VIDEO_3G2 = “video/3gpp2”;
public static final String VIDEO_H263 = “video/h263”;
public static final String VIDEO_MP4 = “video/mp4”;
public static final String VIDEO_X_MSVIDEO = “video/x-msvideo”;
……
// add supported video types
sSupportedVideoTypes.add(VIDEO_X_MSVIDEO);
sSupportedVideoTypes.add(VIDEO_3GPP);
sSupportedVideoTypes.add(VIDEO_3G2);
sSupportedVideoTypes.add(VIDEO_H263);
sSupportedVideoTypes.add(VIDEO_MP4);
……
OK!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116200.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...