解决:信息中插入avi格式的视频时,提示“unsupported video format”

解决:信息中插入avi格式的视频时,提示“unsupported video format”

大家好,又见面了,我是全栈君。

【測试步骤】:新建信息。加入AVI格式的视频

【測试结果】:加入时弹出提示“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账号...

(0)


相关推荐

  • java构造函数可以重载么_Java 构造函数和函数重载「建议收藏」

    java构造函数可以重载么_Java 构造函数和函数重载「建议收藏」构造函数:⑴方法名和类名相同,而且没有返回类型(包括void也没有);⑵没有返回值;⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数;如果我们手动的创建了其他构造函数,就不会帮我们创建这个不带参数的构造函数了;⑷一般情况下,如果想要实现自己的构造方法,最好重载一个不带参数的构造方法。函数重载:指多个函数可以使用同一个函数名,只要它们参数列表不同,将意义相近…

  • 移动端禁用长按复制js兼容css样式_手机为什么长按不能复制

    移动端禁用长按复制js兼容css样式_手机为什么长按不能复制添加全局禁止选择文本的CSS属性*{-webkit-touch-callout:none;/*系统默认菜单*/-webkit-user-select:none;/*webkit浏览器*//*noinspectionCssUnknownProperty*/-khtml-user-select:none;/*早期浏览器*/-moz-user-select:none;/*火狐浏览器*/-ms-user-select:

  • 统计学 方差分析_python编写计算方差的函数

    统计学 方差分析_python编写计算方差的函数一、理论学习1.0、概念1、方差分析(ANOVA)用于研究一个或多个分类型自变量与一个数值型因变量的关系。方差分析通过检验多个总体(同属于一个大整体)的均值是否相等来判断一个或多个分类型自变量对数值型因变量是否由显著影响。2、方差分析包含的三个重要概念:(以小学六年级的学习成绩为例)因子:分类型自变量。例如:六年级的所有班级水平:某个因子下的不同取值。例如六年级有一班、二班、三班。观测值:每个因子水平下的样本观测值。例如:六年级三个班各自的学生成绩。1.1、单因素方差分析1.1.1

  • STM32之sprintf函数[通俗易懂]

    STM32之sprintf函数[通俗易懂]单片机中Sprint函数:说明1:使用该函数时必须包含stdio.h头文件,否则容易卡死程序说明2:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中(将数值转换成对应字符串形式,就是变换成ASCALL码),而printf函数打印输出到屏幕上。在单片机中将数值转换成字符串是sprintf函数最广的用途。Sprint函数具体形式:intsp

  • setdefault函数的用法及理解

    setdefault函数的用法及理解dict.setdefault(key,default=None)功能:如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于字典中,将读出该键原来对应的值,default的值不会覆盖原来已经存在的键的值。参数:key—-要查找的键default—–查找的键不存在时用于设置的默认值使用方法示例:(以下使用方法是我理解setdefault函…

    2022年10月27日
  • Qt之事件处理机制

    思维导读一、事件简介QT程序是事件驱动的,程序的每个动作都是由内部某个事件所触发。QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。常见的QT事件类型如下:键盘事件:按键按下

    2021年12月29日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号