MMs. uri 到 MediaModel . 彩信的各种mediaModel

本文详细阐述了彩信中附件的存储结构与操作方法,包括MediaModel类的构造函数和关键成员变量,如Tag、Src、ContentType、Uri、Data和Size。重点介绍了如何创建MediaModel对象,并解释了Tag、Src、ContentType、Uri、Data和Size的作用。
 彩信的媒体大概是这样:
WorkingMessage里有个SlideshowModel
SlideshowModel里一队列SlideModel
SlideModel 是一个队列的MediaModel
MediaModel,可以衍生出AudioModel,RegionMediaModel。
RegionMediaModel包含TextModel,ImageModel,VideoModel这三个分类。

创建MediaModel的构造函数
Java代码 复制代码  收藏代码
  1. public MediaModel(Context context, String tag, String contentType,   
  2.         String src, Uri uri) throws MmsException {   
  3.     mContext = context;   
  4.     mTag = tag;   
  5.     mContentType = contentType;   
  6.     mSrc = src;   
  7.     mUri = uri;   
  8.     initMediaSize();   
  9.     mMediaActions = new ArrayList<MediaAction>();   
  10. }   
  11.   
  12.   
  13. public MediaModel(Context context, String tag, String contentType,   
  14.         String src, byte[] data) {   
  15.     if (data == null) {   
  16.         throw new IllegalArgumentException("data may not be null.");   
  17.     }   
  18.   
  19.     mContext = context;   
  20.     mTag = tag;   
  21.     mContentType = contentType;   
  22.     mSrc = src;   
  23.     mData = data;   
  24.     mSize = data.length;   
  25.     mMediaActions = new ArrayList<MediaAction>();   
  26. }   
  27.   
  28.   
  29. public MediaModel(Context context, String tag, String contentType,   
  30.         String src, DrmWrapper wrapper) throws IOException {   
  31.     mContext = context;   
  32.     mTag = tag;   
  33.     mContentType = contentType;   
  34.     mSrc = src;   
  35.     mDrmObjectWrapper = wrapper;   
  36.     mUri = DrmUtils.insert(context, wrapper);   
  37.     mSize = wrapper.getOriginalData().length;   
  38.     mMediaActions = new ArrayList<MediaAction>();   
  39. }  
    public MediaModel(Context context, String tag, String contentType,
            String src, Uri uri) throws MmsException {
        mContext = context;
        mTag = tag;
        mContentType = contentType;
        mSrc = src;
        mUri = uri;
        initMediaSize();
        mMediaActions = new ArrayList<MediaAction>();
    }


    public MediaModel(Context context, String tag, String contentType,
            String src, byte[] data) {
        if (data == null) {
            throw new IllegalArgumentException("data may not be null.");
        }

        mContext = context;
        mTag = tag;
        mContentType = contentType;
        mSrc = src;
        mData = data;
        mSize = data.length;
        mMediaActions = new ArrayList<MediaAction>();
    }


    public MediaModel(Context context, String tag, String contentType,
            String src, DrmWrapper wrapper) throws IOException {
        mContext = context;
        mTag = tag;
        mContentType = contentType;
        mSrc = src;
        mDrmObjectWrapper = wrapper;
        mUri = DrmUtils.insert(context, wrapper);
        mSize = wrapper.getOriginalData().length;
        mMediaActions = new ArrayList<MediaAction>();
    }


mediaModel里面比较重要的的几个成员:
Java代码 复制代码  收藏代码
  1. protected String mTag;   
  2. protected String mSrc;   
  3. protected String mContentType;   
  4. private Uri mUri;   
  5. private byte[] mData;   
  6. protected int mSize;  
protected String mTag;
protected String mSrc;
protected String mContentType;
private Uri mUri;
private byte[] mData;
protected int mSize;


Tag是类型标签。在SmilHelper里。
Java代码 复制代码  收藏代码
  1. public static final String ELEMENT_TAG_TEXT = "text";   
  2. public static final String ELEMENT_TAG_IMAGE = "img";   
  3. public static final String ELEMENT_TAG_AUDIO = "audio";   
  4. public static final String ELEMENT_TAG_VIDEO = "video";   
  5. public static final String ELEMENT_TAG_REF = "ref";  
    public static final String ELEMENT_TAG_TEXT = "text";
    public static final String ELEMENT_TAG_IMAGE = "img";
    public static final String ELEMENT_TAG_AUDIO = "audio";
    public static final String ELEMENT_TAG_VIDEO = "video";
    public static final String ELEMENT_TAG_REF = "ref";

mSrc 文件名
mContentType在frameworks/base/core/java/com/google/android/mms/ContentType里定义,比如
public static final String TEXT_PLAIN        = "text/plain";
    public static final String TEXT_HTML         = "text/html";
public static final String IMAGE_JPEG        = "image/jpeg";
    public static final String IMAGE_JPG         = "image/jpg";
public static final String VIDEO_UNSPECIFIED = "video/*";
    public static final String VIDEO_3GPP        = "video/3gpp";

uri不说了。
data 是byte[] 的数据
size是文件长度。


彩信的单个附件的uri,
从onActivityResult得到。


像拍照片的uri来的最容易,是Uri uri = Uri.fromFile(file);
  是已经有了file,再来得到uri..太邪恶了!

### Android 中 `Uri.Parse()` 的使用及替代方案 在 Android 开发中,`Android.Net.Uri.Parse()` 是一个常用方法,用于将字符串转换为 `Android.Net.Uri` 对象。此方法广泛应用于意图调用、内容提供者访问、文件路径解析等场景。例如: ```csharp Android.Net.Uri uri = Android.Net.Uri.Parse("https://example.com"); ``` 该方法在构建意图时非常常见,例如用于播放本地文件或启动其他应用进行授权登录等操作: ```csharp Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("file:///sdcard/download/everything.mp3")); ``` 此用法在实际开发中稳定且被广泛支持[^3]。 然而,`Android.Net.Uri` 与 `Java.Net.URI` 是不同的类,不能直接互换使用。若需将 `Android.Net.Uri` 转换为 `Java.Net.URI`,直接调用 `toString()` 并构造 `Java.Net.URI` 可能会导致异常,尤其是在 URI 包含特殊字符(如空格)时。正确的做法是先对字符串进行编码: ```java Java.Net.URI huri = new Java.Net.URI(Java.Net.URLEncoder.Encode(auri.ToString(), "UTF-8")); ``` 此方法确保了 URI 字符串在构造 `Java.Net.URI` 实例前已正确编码,避免了因非法字符导致的解析失败问题[^1]。 在某些高级场景中,例如通过 URI 实现应用间通信(如类似微信的授权登录),开发者需在 `AndroidManifest.xml` 中注册自定义 URI Scheme,并在目标应用中解析传入的 URI 数据。例如,应用 A 可通过如下方式调起应用 B: ```java Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("myapp://login?token=abc123")); startActivity(intent); ``` 目标应用需配置对应的 `<intent-filter>` 以接收该请求,并提取 URI 中的参数完成授权流程[^2]。 对于内容解析场景,如匹配特定内容 URI,可使用 `UriMatcher` 进行匹配: ```java Uri uri = Uri.Parse("content://com.yfz.Lesson/people"); int match = matcher.Match(uri); ``` 根据匹配结果返回相应的 MIME 类型,实现内容提供者的访问控制[^4]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值