国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)彩信附件的添加與刪除功能

2019-12-12 06:08:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了Android實(shí)現(xiàn)彩信附件的添加與刪除功能。分享給大家供大家參考,具體如下:

添加附件

在ComposeMessageActivity里

addAttachment(int type) 函數(shù)

根據(jù)type的不同,分成6個(gè)case

case A:

MediaSelectListActivity.ADD_IMAGE 用gallery選圖片:

MessageUtils.selectImage(this, REQUEST_CODE_ATTACH_IMAGE);

起一個(gè)intent:

Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);innerIntent.setType(contentType); //image typeIntent wrapperIntent = Intent.createChooser(innerIntent, null);startActivityForResult(wrapperIntent,requestCode);

createChooser 函數(shù)new 一個(gè) Intent intent = new Intent(ACTION_CHOOSER);

也就是起來(lái)一個(gè)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);

起一個(gè)照相機(jī)來(lái)拍照了,

case C:

MediaSelectListActivity.ADD_VIDEO

很像case A

只有在type那里,從image換成video

case D:

MediaSelectListActivity.RECORD_VIDEO

和case B一樣起一個(gè)錄像機(jī),不過(guò)這次有空間大小計(jì)算:給文本留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那樣,七個(gè)錄音機(jī)。 這次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比較尷尬。因?yàn)檎麄€(gè)彩信附件也叫slideshow,而這里的slideshow是多張圖片拼湊在一起的意思。彩信的附件也經(jīng)常是若干張圖片。。。 這里從起名開(kāi)始就繞的要死了。

Uri dataUri = mWorkingMessage.saveAsMms(false);Intent intent = new Intent(this, SlideshowEditActivity.class);intent.setData(dataUri);startActivityForResult(intent, REQUEST_CODE_CREATE_SLIDESHOW);

saveAsMms函數(shù)里面有幾個(gè)事情:首先把短信強(qiáng)制變成彩信,把短信的內(nèi)容封裝到PduPersister中(可以理解為彩信body)去,new一個(gè)SendReq也就是彩信頭。生成包含彩信頭和body的uri。
最后起一個(gè)尷尬的SlideshowEditActivity。 這個(gè)東西太麻煩。不看。。

然后是到了onActivityResult函數(shù)。 那些從外面的activity讀取媒體數(shù)據(jù)的應(yīng)用返回的時(shí)候都回到這里。

A。圖片

圖片在onActivityReuslt會(huì)得到uri,調(diào)用:

addImage(uri, false);

這個(gè)函數(shù)會(huì)調(diào)用:

復(fù)制代碼 代碼如下:
mWorkingMessage.setAttachment(WorkingMessage.IMAGE, uri, false);

也就是非append模式添加圖片。

如果圖片太大,會(huì)啟用異步的圖片壓縮函數(shù)。

B 拍照片

也是返回一個(gè)uri到onActivityReuslt函數(shù)。也是調(diào)用 addImage(uri, false),同上。

C 選錄像文件 D 拍錄像

都是調(diào)用:

addVideo(data.getData(), false);

data.getData()也是得到uri,addVideo調(diào)用:

復(fù)制代碼 代碼如下:
mWorkingMessage.setAttachment(WorkingMessage.VIDEO, uri, append);

跟圖片處理一樣的。

E 選錄音文件 F 錄音

都是addAudio -->
mWorkingMessage.setAttachment(WorkingMessage.AUDIO, uri, false);
不多說(shuō)

刪除附件

AttachmentEditor里面有個(gè)handler,用來(lái)給composeMessageActivity傳消息。

所有刪除附件操作的按鈕都在AttachmentEditor上。對(duì)不同的媒體類型有不同的按鈕,但是按下之后出口是一樣的:

Message msg = Message.obtain(mHandler, MSG_REMOVE_ATTACHMENT);msg.sendToTarget();

就是這么個(gè)操作。

之所以一樣是因?yàn)樗械母浇即嬖赟lideshowModel里,而這個(gè)SlideshowModel是:

ArrayList<SlideModel> mSlides; 一列兒slide組成的。

每個(gè)slide可以包含video,image,audio,text, 其中前三者一般不能兩兩同時(shí)存在,唯一的例外是image和audio。

(其實(shí)我覺(jué)得如果,如果每個(gè)slide只能包含三者中的一種,即不處理上面那個(gè)例外,邏輯可能更清晰)
說(shuō)回到那個(gè)remove操作。。

composeMessageActivity的Handler里的handleMessage函數(shù),接到這個(gè)刪除msg之后的操作是:

mWorkingMessage.setAttachment(WorkingMessage.TEXT, null, false);

最后一位false表示非append模式,即從新修改附件。

mWorkingMessage是什么呢?

是短信(包括彩信)的所有的狀態(tài)所有操作所有數(shù)據(jù)的現(xiàn)狀,主要有幾個(gè)成員:

mMmsState 彩信狀態(tài),是不是彩信,為啥是彩信,是有附件有標(biāo)題,或者強(qiáng)制彩信等

mAttachmentType 附件類型。如果mSlideshow是多頁(yè):slide類型。 單頁(yè):圖片|聲音|錄像|文本。   如果mSlideshow是空,就是文本類型。

mSlideshow 附件數(shù)據(jù)數(shù)組。就是那個(gè)ArrayList<SlideModel> mSlides。

現(xiàn)在回頭看那個(gè)刪除操作。

setAttachment里面最主要的函數(shù)是changeMedia(type, dataUri),這里傳入的參數(shù)type是TEXT,dataUri是null。
這個(gè)函數(shù)進(jìn)去:

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());}

看到第一個(gè)return我們就可以return了。。

多干凈利落!直接把彩信原來(lái)的附件看都不堪直接一刀刪完,類型回歸到WorkingMessage.TEXT,把uri置空。

另外,說(shuō)一些題外的。

這個(gè)changeMedia函數(shù),來(lái)來(lái)回回,都是改的mSlideshow.get(0)那個(gè)

在setAttachment的時(shí)候,如果是用的append模式,到時(shí)候就會(huì)用appendMedia而不是changeMedia函數(shù)。

對(duì)于append模式,

如果最后一頁(yè)包含了圖片image或者錄像vedio, 那么append的時(shí)候必須加到下一張。

感覺(jué)源碼里這個(gè)判斷有點(diǎn)寫(xiě)復(fù)雜了。。你看我一句話就能歸納出來(lái)的,他代碼寫(xiě)半天~

不過(guò)我寫(xiě)不出更好的~~

還有SlideModel的add函數(shù)。 很多情況疊在一起了,所以有點(diǎn)復(fù)雜。

添加的關(guān)鍵函數(shù)是下面這個(gè),第一個(gè)參數(shù)是對(duì)應(yīng)格式的原來(lái)媒體(比如你想添加錄像,那這個(gè)就是原來(lái)的錄像,可以是null),第二個(gè)是添加的新媒體

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);  }}

還有個(gè)附件太大時(shí)的異步縮小功能,是下面這個(gè)函數(shù)

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字節(jié)(差不多295k),那么縮放到295k。

這個(gè)大小是源碼編寫(xiě)程序員憑感覺(jué)寫(xiě)死的。

這里的cb.onResizeResult是調(diào)用的ComposeMessageActivity的ResizeImageResultCallback里的函數(shù)。

處理大小結(jié)束后,會(huì)拿新的圖片去再次setAttachment,也就更新了附件。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android數(shù)據(jù)庫(kù)操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開(kāi)發(fā)之SD卡操作方法匯總》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 如东县| 花垣县| 南开区| 南雄市| 大厂| 班戈县| 安化县| 石屏县| 车险| 祁门县| 长寿区| 阳谷县| 大田县| 崇仁县| 庆安县| 汉沽区| 滕州市| 蒲城县| 左权县| 榆中县| 宜黄县| 巴东县| 台州市| 兴仁县| 赤城县| 垦利县| 长沙市| 新兴县| 长武县| 蒲江县| 茂名市| 临夏县| 汉沽区| 新闻| 赤峰市| 宽城| 习水县| 长丰县| 宜章县| 荣昌县| 台北县|