Android實(shí)現(xiàn)彩信附件的添加與刪除功能
本文實(shí)例講述了Android實(shí)現(xiàn)彩信附件的添加與刪除功能。分享給大家供大家參考,具體如下:
添加附件
在ComposeMessageActivity里
addAttachment(int type) 函數(shù)
根據(jù)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 函數(shù)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);
起一個照相機(jī)來拍照了,
case C:
MediaSelectListActivity.ADD_VIDEO
很像case A
只有在type那里,從image換成video
case D:
MediaSelectListActivity.RECORD_VIDEO
和case B一樣起一個錄像機(jī),不過這次有空間大小計(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那樣,七個錄音機(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)檎麄€彩信附件也叫slideshow,而這里的slideshow是多張圖片拼湊在一起的意思。彩信的附件也經(jīng)常是若干張圖片。。。 這里從起名開始就繞的要死了。
Uri dataUri = mWorkingMessage.saveAsMms(false); Intent intent = new Intent(this, SlideshowEditActivity.class); intent.setData(dataUri); startActivityForResult(intent, REQUEST_CODE_CREATE_SLIDESHOW);
saveAsMms函數(shù)里面有幾個事情:首先把短信強(qiáng)制變成彩信,把短信的內(nèi)容封裝到PduPersister中(可以理解為彩信body)去,new一個SendReq也就是彩信頭。生成包含彩信頭和body的uri。
最后起一個尷尬的SlideshowEditActivity。 這個東西太麻煩。不看。。
然后是到了onActivityResult函數(shù)。 那些從外面的activity讀取媒體數(shù)據(jù)的應(yīng)用返回的時候都回到這里。
A。圖片
圖片在onActivityReuslt會得到uri,調(diào)用:
addImage(uri, false);
這個函數(shù)會調(diào)用:
也就是非append模式添加圖片。
如果圖片太大,會啟用異步的圖片壓縮函數(shù)。
B 拍照片
也是返回一個uri到onActivityReuslt函數(shù)。也是調(diào)用 addImage(uri, false),同上。
C 選錄像文件 D 拍錄像
都是調(diào)用:
addVideo(data.getData(), false);
data.getData()也是得到uri,addVideo調(diào)用:
跟圖片處理一樣的。
E 選錄音文件 F 錄音
都是addAudio -->
mWorkingMessage.setAttachment(WorkingMessage.AUDIO, uri, false);
不多說
刪除附件
AttachmentEditor里面有個handler,用來給composeMessageActivity傳消息。
所有刪除附件操作的按鈕都在AttachmentEditor上。對不同的媒體類型有不同的按鈕,但是按下之后出口是一樣的:
Message msg = Message.obtain(mHandler, MSG_REMOVE_ATTACHMENT); msg.sendToTarget();
就是這么個操作。
之所以一樣是因?yàn)樗械母浇即嬖赟lideshowModel里,而這個SlideshowModel是:
ArrayList<SlideModel> mSlides; 一列兒slide組成的。
每個slide可以包含video,image,audio,text, 其中前三者一般不能兩兩同時存在,唯一的例外是image和audio。
(其實(shí)我覺得如果,如果每個slide只能包含三者中的一種,即不處理上面那個例外,邏輯可能更清晰)
說回到那個remove操作。。
composeMessageActivity的Handler里的handleMessage函數(shù),接到這個刪除msg之后的操作是:
mWorkingMessage.setAttachment(WorkingMessage.TEXT, null, false);
最后一位false表示非append模式,即從新修改附件。
mWorkingMessage是什么呢?
是短信(包括彩信)的所有的狀態(tài)所有操作所有數(shù)據(jù)的現(xiàn)狀,主要有幾個成員:
mMmsState 彩信狀態(tài),是不是彩信,為啥是彩信,是有附件有標(biāo)題,或者強(qiáng)制彩信等
mAttachmentType 附件類型。如果mSlideshow是多頁:slide類型。 單頁:圖片|聲音|錄像|文本。 如果mSlideshow是空,就是文本類型。
mSlideshow 附件數(shù)據(jù)數(shù)組。就是那個ArrayList<SlideModel> mSlides。
現(xiàn)在回頭看那個刪除操作。
setAttachment里面最主要的函數(shù)是changeMedia(type, dataUri),這里傳入的參數(shù)type是TEXT,dataUri是null。
這個函數(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()); }
看到第一個return我們就可以return了。。
多干凈利落!直接把彩信原來的附件看都不堪直接一刀刪完,類型回歸到WorkingMessage.TEXT,把uri置空。
另外,說一些題外的。
這個changeMedia函數(shù),來來回回,都是改的mSlideshow.get(0)那個
在setAttachment的時候,如果是用的append模式,到時候就會用appendMedia而不是changeMedia函數(shù)。
對于append模式,
如果最后一頁包含了圖片image或者錄像vedio, 那么append的時候必須加到下一張。
感覺源碼里這個判斷有點(diǎn)寫復(fù)雜了。。你看我一句話就能歸納出來的,他代碼寫半天~
不過我寫不出更好的~~
還有SlideModel的add函數(shù)。 很多情況疊在一起了,所以有點(diǎn)復(fù)雜。
添加的關(guān)鍵函數(shù)是下面這個,第一個參數(shù)是對應(yīng)格式的原來媒體(比如你想添加錄像,那這個就是原來的錄像,可以是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); } }
還有個附件太大時的異步縮小功能,是下面這個函數(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。
這個大小是源碼編寫程序員憑感覺寫死的。
這里的cb.onResizeResult是調(diào)用的ComposeMessageActivity的ResizeImageResultCallback里的函數(shù)。
處理大小結(jié)束后,會拿新的圖片去再次setAttachment,也就更新了附件。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- 簡單掌握Android開發(fā)中彩信的發(fā)送接收及其附件的處理
- Android編程之非調(diào)用系統(tǒng)界面實(shí)現(xiàn)發(fā)送彩信的方法(MMS)
- Android實(shí)現(xiàn)帶附件的郵件發(fā)送功能
- Android開發(fā)中怎樣調(diào)用系統(tǒng)Email發(fā)送郵件(多種調(diào)用方式)
- Android中發(fā)送Http請求(包括文件上傳、servlet接收)的實(shí)例代碼
- Android HTTP發(fā)送請求和接收響應(yīng)的實(shí)例代碼
- Android發(fā)送GET與POST請求的DEMO詳解
- Android中Webview打開網(wǎng)頁的同時發(fā)送HTTP頭信息方法
- android實(shí)現(xiàn)藍(lán)牙文件發(fā)送的實(shí)例代碼,支持多種機(jī)型
- Android發(fā)送短信功能代碼
- Android 后臺發(fā)送郵件示例 (收集應(yīng)用異常信息+Demo代碼)
- android中可以通過兩種方式調(diào)用接口發(fā)送短信
- Android下通過httpClient發(fā)送GET和POST請求的實(shí)例代碼
- Android實(shí)現(xiàn)將已發(fā)送的短信寫入短信數(shù)據(jù)庫的方法
相關(guān)文章
分析Android 11.0Settings源碼之主界面加載
這篇文章主要介紹了分析Android 11.0Settings源碼之主界面加載,對Android源碼感興趣的同學(xué),可以著重看一下2021-04-04app 請求服務(wù)器json數(shù)據(jù)實(shí)例代碼
下面小編就為大家分享一篇app 請求服務(wù)器json數(shù)據(jù)實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android 實(shí)現(xiàn)微信長按菜單 -FloatMenu
在日常開發(fā)中,長按某個view出現(xiàn)個菜單是很常見的需求,下面小編給大家?guī)砹薃ndroid 實(shí)現(xiàn)微信長按菜單 -FloatMenu的實(shí)現(xiàn)思路及具體實(shí)現(xiàn)代碼,感興趣的朋友跟隨腳本之家小編一起看看吧2018-07-07Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼
本篇文章主要介紹了Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06Android用戶輸入自動提示控件AutoCompleteTextView使用方法
這篇文章主要為大家詳細(xì)介紹了Android用戶輸入自動提示控件AutoCompleteTextView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08android實(shí)現(xiàn)動態(tài)顯隱進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)動態(tài)顯隱進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Android Studio 3.0 原生支持kotlin 例子詳解
這篇文章主要介紹了 Android Studio 3.0 原生支持kotlin 例子詳解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05Android ToolBar整合實(shí)例使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android ToolBar整合實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02