添加附件。
在ComposeMessageActivity里
addAttachment(int type) 函数
根据type的不同,分成6个case
case A:
MediaSelectListActivity.ADD_IMAGE 用gallery选图片:
MessageUtils.selectImage(this, REQUEST_CODE_ATTACH_IMAGE);
起一个intent:
Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
innerIntent.setType(contentType); //image type
Intent wrapperIntent = Intent.createChooser(innerIntent, null);
startActivityForResult(wrapperIntent,requestCode);
createChooser 函数new 一个 Intent intent = new Intent(ACTION_CHOOSER);
也就是起来一个ACTION_CHOOSER的 activity
case B:
MediaSelectListActivity.TAKE_PICTURE
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent
.putExtra(MediaStore.EXTRA_OUTPUT,
Mms.ScrapSpace.CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
起一个照相机来拍照了,
case C:
MediaSelectListActivity.ADD_VIDEO
很像case A
只有在type那里,从image换成video
case D:
MediaSelectListActivity.RECORD_VIDEO
和case B一样起一个录像机,不过这次有空间大小计算:给文本留1024Byte。
按一条彩信300k算,录像最多使用299k。也即299*1024byte
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
case E:
MediaSelectListActivity.ADD_SOUND
MessageUtils.selectAudio(this, REQUEST_CODE_ATTACH_SOUND);
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
case F:
MediaSelectListActivity.RECORD_SOUND
像B那样,七个录音机。 这次type是aution
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(ContentType.AUDIO_AMR);
intent.setClassName("com.android.soundrecorder",
"com.android.soundrecorder.SoundRecorder");
case G:
MediaSelectListActivity.ADD_SLIDESHOW
幻灯片slideshow比较尴尬。因为整个彩信附件也叫slideshow,而这里的slideshow是多张图片拼凑在一起的意思。彩信的附件也经常是若干张图片。。。 这里从起名开始就绕的要死了。
Uri dataUri = mWorkingMessage.saveAsMms(false);
Intent intent = new Intent(this, SlideshowEditActivity.class);
intent.setData(dataUri);
startActivityForResult(intent, REQUEST_CODE_CREATE_SLIDESHOW);
saveAsMms函数里面有几个事情:首先把短信强制变成彩信,把短信的内容封装到PduPersister中(可以理解为彩信body)去,new一个SendReq也就是彩信头。生成包含彩信头和body的uri。
最后起一个尴尬的SlideshowEditActivity。 这个东西太麻烦。不看。。
然后是到了onActivityResult函数。 那些从外面的activity读取媒体数据的应用返回的时候都回到这里。
A。图片
图片在onActivityReuslt会得到uri,调用 addImage(uri, false); 这个函数会调用mWorkingMessage.setAttachment(WorkingMessage.IMAGE, uri,
false);也就是非append模式添加图片。
如果图片太大,会启用异步的图片压缩函数。
B 拍照片
也是返回一个uri到onActivityReuslt函数。也是调用 addImage(uri, false),同上。
C 选录像文件 D 拍录像
都是调用addVideo(data.getData(), false);
data.getData()也是得到uri,addVideo调用mWorkingMessage.setAttachment(WorkingMessage.VIDEO,
uri, append);
跟图片处理一样的。
E 选录音文件 F 录音
都是addAudio -->
mWorkingMessage.setAttachment(WorkingMessage.AUDIO, uri,
false);
不多说
删除附件
AttachmentEditor里面有个handler,用来给composeMessageActivity传消息。
所有删除附件操作的按钮都在AttachmentEditor上。对不同的媒体类型有不同的按钮,但是按下之后出口是一样的:
Message msg = Message.obtain(mHandler, MSG_REMOVE_ATTACHMENT);
msg.sendToTarget();
就是这么个操作。
之所以一样是因为所有的附近都存在SlideshowModel里,而这个SlideshowModel是:
ArrayList<SlideModel> mSlides; 一列儿slide组成的。
每个slide可以包含video,image,audio,text, 其中前三者一般不能两两同时存在,唯一的例外是image和audio。
(其实我觉得如果,如果每个slide只能包含三者中的一种,即不处理上面那个例外,逻辑可能更清晰)
说回到那个remove操作。。
composeMessageActivity的Handler里的handleMessage函数,接到这个删除msg之后的操作是:
mWorkingMessage.setAttachment(WorkingMessage.TEXT, null, false);
最后一位false表示非append模式,即从新修改附件。
mWorkingMessage是什么呢?
是短信(包括彩信)的所有的状态所有操作所有数据的现状,主要有几个成员:
mMmsState 彩信状态,是不是彩信,为啥是彩信,是有附件有标题,或者强制彩信等
mAttachmentType 附件类型。如果mSlideshow是多页:slide类型。 单页:图片|声音|录像|文本。 如果mSlideshow是空,就是文本类型。
mSlideshow 附件数据数组。就是那个ArrayList<SlideModel> mSlides。
现在回头看那个删除操作。
setAttachment里面最主要的函数是changeMedia(type, dataUri),这里传入的参数type是TEXT,dataUri是null。
这个函数进去:
SlideModel slide = mSlideshow.get(0);
MediaModel media;
// Remove any previous attachments.
slide.removeImage();
slide.removeVideo();
slide.removeAudio();
// If we're changing to text, just bail out.
if (type == TEXT) {
return;
}
// Make a correct MediaModel for the type of attachment.
if (type == IMAGE) {
media = new ImageModel(mContext, uri, mSlideshow.getLayout()
.getImageRegion());
} else if (type == VIDEO) {
media = new VideoModel(mContext, uri, mSlideshow.getLayout()
.getImageRegion());
} else if (type == AUDIO) {
media = new AudioModel(mContext, uri);
} else {
throw new IllegalArgumentException("changeMedia type=" + type
+ ", uri=" + uri);
}
// Add it to the slide.
slide.add(media);
// For video and audio, set the duration of the slide to
// that of the attachment.
if (type == VIDEO || type == AUDIO) {
slide.updateDuration(media.getDuration());
}
看到第一个return我们就可以return了。。
多干净利落!直接把彩信原来的附件看都不堪直接一刀删完,类型回归到WorkingMessage.TEXT,把uri置空。
另外,说一些题外的。
这个changeMedia函数,来来回回,都是改的mSlideshow.get(0)那个
在setAttachment的时候,如果是用的append模式,到时候就会用appendMedia而不是changeMedia函数。
对于append模式,
如果最后一页包含了图片image或者录像vedio, 那么append的时候必须加到下一张。
感觉源码里这个判断有点写复杂了。。你看我一句话就能归纳出来的,他代码写半天~
不过我写不出更好的~~
还有SlideModel的add函数。 很多情况叠在一起了,所以有点复杂。
添加的关键函数是下面这个,第一个参数是对应格式的原来媒体(比如你想添加录像,那这个就是原来的录像,可以是null),第二个是添加的新媒体
private void internalAddOrReplace(MediaModel old, MediaModel media) {
int addSize = media.getMediaSize();
int removeSize;
if (old == null) {
if (null != mParent) {
mParent.checkMessageSize(addSize);
}
mMedia.add(media);
increaseSlideSize(addSize);
increaseMessageSize(addSize);
} else {
removeSize = old.getMediaSize();
if (addSize > removeSize) {
if (null != mParent) {
mParent.checkMessageSize(addSize - removeSize);
}
increaseSlideSize(addSize - removeSize);
increaseMessageSize(addSize - removeSize);
} else {
decreaseSlideSize(removeSize - addSize);
decreaseMessageSize(removeSize - addSize);
}
mMedia.set(mMedia.indexOf(old), media);
old.unregisterAllModelChangedObservers();
}
for (IModelChangedObserver observer : mModelChangedObservers) {
media.registerModelChangedObserver(observer);
}
}
还有个附件太大时的异步缩小功能,是下面这个函数
public static void resizeImageAsync(final Context context,
final Uri imageUri, final Handler handler,
final ResizeImageResultCallback cb, final boolean append) {
// Show a progress toast if the resize hasn't finished
// within one second.
// Stash the runnable for showing it away so we can cancel
// it later if the resize completes ahead of the deadline.
final Runnable showProgress = new Runnable() {
public void run() {
Toast.makeText(context, R.string.compressing,
Toast.LENGTH_SHORT).show();
}
};
// Schedule it for one second from now.
handler.postDelayed(showProgress, 1000);
new Thread(new Runnable() {
public void run() {
final PduPart part;
try {
UriImage image = new UriImage(context, imageUri);
part = image.getResizedImageAsPart(MmsConfig
.getMaxImageWidth(), MmsConfig.getMaxImageHeight(),
MmsConfig.getMaxMessageSize() - MESSAGE_OVERHEAD);
} finally {
// Cancel pending show of the progress toast if necessary.
handler.removeCallbacks(showProgress);
}
handler.post(new Runnable() {
public void run() {
cb.onResizeResult(part, append);
}
});
}
}).start();
}
图片被缩放到最大640*480,如果还是大于300*1024-5000字节(差不多295k),那么缩放到295k。
这个大小是源码编写程序员凭感觉写死的。
这里的cb.onResizeResult是调用的ComposeMessageActivity的ResizeImageResultCallback里的函数。
处理大小结束后,会拿新的图片去再次setAttachment,
也就更新了附件。
分享到:
相关推荐
总结,实现Android彩信附件的添加与删除功能涉及到多媒体文件的选择、操作、容量控制、数据持久化等多个方面。通过理解Android的多媒体API和生命周期管理,开发者可以创建功能强大的彩信应用,满足用户发送丰富...
1. 附件添加:在`ComposeMessageActivity`中,`addAttachment`函数根据传入的类型(例如图片、视频等)调用不同的方法,如拍照、选择本地媒体或录制视频,将附件添加到彩信中。 2. 附件删除:用户可以随时删除已...
`AttachmentEditor.java`管理已添加的彩信附件,根据附件类型动态显示不同视图,例如音频、图片、幻灯片和视频附件。 对于彩信的解析和附件,`Mms/src/org/w3c/dom`目录下的类库主要处理MMS的XML格式和多媒体内容。...
这包括设置收件人、添加多媒体附件(如照片、音频片段或短视频)、编写文本消息以及设置发送参数。 2. **接收和解析MMS**:MMSAPI-1.0也支持接收MMS消息,并能解析其中的多媒体内容。开发者可以利用这些功能来显示...
`AttachmentEditor.java`是用于管理彩信附件的类,包括添加、删除和编辑附件。它管理四个视图(Audio、Image、SlideShow、Video)的显示,根据附件类型动态选择显示哪个视图。 5. 消息数据: `MessageItem.java`...
彩信的发送涉及更复杂的流程,包括创建多媒体消息、添加附件、设置收件人等。 7. **短信拦截与过滤**:通过注册BroadcastReceiver监听`ACTION_SMS_RECEIVED`意图,开发者可以实现短信的拦截和过滤功能,例如阻止...
6. **AttachmentEditor**:管理彩信附件的显示,根据附件类型动态切换不同的视图,如`AudioAttachmentView`、`ImageAttachmentView`、`SlideshowAttachmentView`和`VideoAttachmentView`,这些视图都是布局管理器,...
首先要越狱,越狱后到附件区下载"preferences.rar",解压"preferences.rar"得出"preferences.list"文件,传送到手机目录//private/var/preferences/SystemConfiguration/,替换原文件,设置 - 通用 - 网络 - 蜂窝...
3. **短信彩信测试**:这部分测试涵盖发送、接收、存储、删除短信和彩信的功能,以及多用户交互、彩信格式兼容性和彩信大小限制等方面。 4. **电子邮件测试**:包括验证登录、收发邮件、添加附件、管理联系人、设置...
通过短信应用,用户可以发送包含图片、音频、视频等多媒体内容的彩信,只需选择“新建彩信”并添加附件。 以上内容仅是Android系统使用手册的一部分,实际操作中还涉及更多功能,如Wi-Fi设置、蓝牙连接、位置服务、...
- **彩信**:发送包含图片或音频的多媒体消息。 - **消息列表选项**:管理消息列表的工具。 - **受S/MIME保护的消息**:加密电子邮件提高安全性。 - **受PGP保护的消息**:使用PGP加密技术保障消息安全。 - **消息...
- **彩信**:指导用户发送包含图片、音频等多媒体内容的消息。 - **消息列表选项**:提供了一系列消息管理选项。 - **消息快捷方式**:介绍快速操作消息的方法。 - **键入内容基础**:提供基本的文本输入指南。 - **...
- **彩信**:发送带有图片、音频等多媒体内容的消息。 - **消息列表选项**:管理已收发消息的选项。 - **受S/MIME保护的消息**:使用S/MIME协议加密消息的方法。 - **受PGP保护的消息**:使用PGP加密技术保障信息...
- **彩信**: 发送包含图像、音频等多媒体内容的消息。 - **消息列表选项**: 对消息进行筛选、排序等操作。 - **消息快捷方式**: 参见快捷方式部分。 - **消息疑难解答**: 解决常见的消息问题。 #### 键入功能 - **...
- 类似于发送短信,但在消息应用中选择添加附件即可发送包含图片、音频等多媒体内容的彩信。 - **1.2.2 彩信是否受文件大小/视频格式/分辨率等因素限制** - 是的,彩信的发送通常受限于文件大小、视频格式和...
- **彩信**:发送包含图片、音频等内容的信息。 - **消息列表选项**:管理已收发的消息。 - **消息疑难解答**:解决无法接收或发送消息等问题。 #### 键入 - **键入内容基础**:学习使用QWERTY键盘输入文本。 - **...
7. 使用MessageUI框架发送短信和彩信:展示如何利用iOS提供的API发送短信和彩信。 8. 在地图上获取方向和绘制路线:集成地图服务,提供路径规划和导航功能。 9. 使用本地搜索搜索附近的兴趣点:利用iOS的地图API...
- 消息功能:包括短信、彩信的发送、接收、存储、删除等操作的测试,确保信息传递无误。 - 电话本:验证联系人添加、编辑、查找、导入/导出等功能,确保数据安全和易用性。 - 增值服务:如VoIP、彩铃、彩信订阅等...
- 消息功能:涵盖短信、彩信的发送、接收、存储和删除,以及格式兼容性和错误处理。 - 电话本:验证联系人添加、编辑、查找、同步和导入导出的准确性。 - 增值服务:如彩铃、彩信、WAP浏览、下载等,测试其功能...
1. 邮件功能:如何添加和删除电子邮件帐户,自定义帐户设置,以及发送和查看电子邮件。 2. 建立连接:介绍如何开启数据服务、使用无线局域网、互联网、蓝牙功能和手机作为调制解调器使用。 五、娱乐功能介绍 1. ...