2-4 通話+信息功能技術(shù)_第1頁(yè)
2-4 通話+信息功能技術(shù)_第2頁(yè)
2-4 通話+信息功能技術(shù)_第3頁(yè)
2-4 通話+信息功能技術(shù)_第4頁(yè)
2-4 通話+信息功能技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.:.;PAGE 20目錄 TOC o 1-3 h z u HYPERLINK l _Toc292956344 1根本要求 PAGEREF _Toc292956344 h 1 HYPERLINK l _Toc292956345 2打流程 PAGEREF _Toc292956345 h 1 HYPERLINK l _Toc292956346 2.11 OutgoingCallBroadcaster.java PAGEREF _Toc292956346 h 2 HYPERLINK l _Toc292956347 2.22 OutgoingCallReceiver.java PAGEREF _Toc

2、292956347 h 2 HYPERLINK l _Toc292956348 2.33 InCallScreen.java擔(dān)任通話的那一個(gè)界面 PAGEREF _Toc292956348 h 2 HYPERLINK l _Toc292956349 ) onCreate(第一次) PAGEREF _Toc292956349 h 2 HYPERLINK l _Toc292956350 ) onNewIntent(非第一次)。 PAGEREF _Toc292956350 h 3 HYPERLINK l _Toc292956351 ) onResume

3、 PAGEREF _Toc292956351 h 3 HYPERLINK l _Toc292956352 2.44 Profiler.java該類(lèi)對(duì)通話各個(gè)時(shí)間點(diǎn)進(jìn)展記錄。 PAGEREF _Toc292956352 h 3 HYPERLINK l _Toc292956353 2.55 PhoneUtils.java擔(dān)任Phone對(duì)象的生成 PAGEREF _Toc292956353 h 3 HYPERLINK l _Toc292956354 ) placeCall(Phone phone, String number, Uri contactRef) PAGEREF _Toc

4、292956354 h 4 HYPERLINK l _Toc292956355 ) placeCallVia(Context context,Phone phone,String number,Uri contactRef,Uri gatewayUri) PAGEREF _Toc292956355 h 4 HYPERLINK l _Toc292956356 2.66 PhoneApp.java擔(dān)任Phone對(duì)象頂層運(yùn)用的生成 PAGEREF _Toc292956356 h 4 HYPERLINK l _Toc292956357 2.77 CallNotifier.java監(jiān)聽(tīng)P

5、hone形狀改動(dòng)和telephony層事件,觸發(fā)UI行為 PAGEREF _Toc292956357 h 4 HYPERLINK l _Toc292956358 3部分 PAGEREF _Toc292956358 h 5 HYPERLINK l _Toc292956359 3.1判別接通形狀 PAGEREF _Toc292956359 h 6 HYPERLINK l _Toc292956360 3.2刪除通話記錄 PAGEREF _Toc292956360 h 6 HYPERLINK l _Toc292956361 4短信部分 PAGEREF _Toc292956361 h 8 HYPERLI

6、NK l _Toc292956362 4.1發(fā)送短信 PAGEREF _Toc292956362 h 8 HYPERLINK l _Toc292956363 4.2發(fā)送彩信 PAGEREF _Toc292956363 h 8 HYPERLINK l _Toc292956364 4.3刪除短信 PAGEREF _Toc292956364 h 8 HYPERLINK l _Toc292956365 4.4監(jiān)聽(tīng)短信收發(fā) PAGEREF _Toc292956365 h 10 HYPERLINK l _Toc292956366 4.4.1利用廣播 PAGEREF _Toc292956366 h 10 H

7、YPERLINK l _Toc292956367 4.4.2利用數(shù)據(jù)庫(kù) PAGEREF _Toc292956367 h 11 HYPERLINK l _Toc292956368 4.5收到短信不頂欄通知 PAGEREF _Toc292956368 h 12 HYPERLINK l _Toc292956369 4.6獲取短信內(nèi)容 PAGEREF _Toc292956369 h 12根本要求要求可以向指定的號(hào)碼發(fā)起呼叫;可以監(jiān)視呼入事件,并得到呼入的號(hào)碼;嘗試對(duì)呼入事件進(jìn)展處置顯示給用戶或者直接回絕;通話記錄的獲取以及刪除;上述技術(shù)點(diǎn)都涉及到運(yùn)用程序平安授權(quán)問(wèn)題,研討Android在保證運(yùn)用程序平

8、安上采用的方法。打流程 HYPERLINK apps.hi.baidu/share/detail/30388064 apps.hi.baidu/share/detail/303880641 OutgoingCallBroadcaster.java點(diǎn)擊撥號(hào)盤(pán)撥打按鈕后,進(jìn)入通話的Phone包。此時(shí)首先進(jìn)入的函數(shù)OutgoingCallBroadcaster.java,該類(lèi)是一個(gè)Activity。由activity的生命周期可知,第一次進(jìn)入時(shí)應(yīng)調(diào)用onCreate()函數(shù)。(在該類(lèi)中也只實(shí)現(xiàn)了這個(gè)函數(shù)。)解析一下這個(gè)函數(shù):1.1) 首先獲取Intent對(duì)象,獲取撥出的號(hào)碼。1.2) 接著判別號(hào)碼能

9、否為緊急號(hào)碼,假設(shè)是緊急號(hào)碼,將callNow變量賦值為true,啟動(dòng)InCallScreen,并發(fā)送廣播。而在receiver里面判別callNow為ture就直接finish,而不再反復(fù)啟動(dòng)InCallScreen;假設(shè)不是緊急號(hào)碼,將callNow變量賦值為false,發(fā)送廣播“Intent.ACTION_NEW_OUTGOING_CALL。2 OutgoingCallReceiver.java廣播發(fā)送后OutgoingCallReceiver將會(huì)收到該息。該類(lèi)是一個(gè)內(nèi)部類(lèi),在類(lèi)OutgoingCallBroadcaster里面,作用是接納OutgoingCallBroadcaster發(fā)

10、送的廣播,判別能否曾經(jīng)啟動(dòng)InCallScreen。沒(méi)有啟動(dòng)的話就進(jìn)展一些初始化,如:對(duì)OTA進(jìn)展初始化。接納到廣播之后,從Intent里面取出號(hào)碼及其URi。然后,設(shè)置Intent為ACTION_CALL,并帶上號(hào)碼和uri。啟動(dòng)InCallScreen。封鎖該Activity。OTA:Over-the-Air Technology空中下載技術(shù),是經(jīng)過(guò)挪動(dòng)通訊(GSM或CDMA)的空中接口對(duì)SIM卡數(shù)據(jù)及運(yùn)用進(jìn)展遠(yuǎn)程管理的技術(shù)??罩薪涌诳梢圆捎肳AP、GPRS、CDMA1X及短音訊技術(shù)。OTA技術(shù)的運(yùn)用,使得挪動(dòng)通訊不僅可以提供語(yǔ)音和數(shù)據(jù)效力,而且還能提供新業(yè)務(wù)下載。GSM:Global S

11、ystem for Mobile Communications,中文為全球挪動(dòng)通訊系統(tǒng),俗稱(chēng)全球通。CDMA:Code Division Multiple Access,又稱(chēng)碼分多址,是在無(wú)線通訊上運(yùn)用的技術(shù),CDMA允許一切的運(yùn)用者同時(shí)運(yùn)用全部頻帶(1.2288Mhz),并且把其他運(yùn)用者發(fā)出的訊號(hào)視為雜訊,完全不用思索到訊號(hào)碰撞 (collision) 的問(wèn)題。CDMA的優(yōu)點(diǎn)包括:CDMA中所提供的語(yǔ)音編碼技術(shù),其通話質(zhì)量比目前的GSM好,而且可以把用戶對(duì)話時(shí)周?chē)h(huán)境的噪音降低,使通話更為明晰。3 InCallScreen.java擔(dān)任通話的那一個(gè)界面該類(lèi)extends了Acitivity,

12、并且implements了OnClickListener,OnTouchListener和OnQueryCompleteListener。該類(lèi)主要是擔(dān)任通話的那一個(gè)界面,并且還擔(dān)任菜單項(xiàng)各種按鍵事件和觸摸時(shí)間的處置。同時(shí)本類(lèi)還復(fù)寫(xiě)的finish()方法,所以普通不會(huì)被finish掉,調(diào)用這個(gè)方法時(shí)它又把本人放回棧中。InCallScreen可以接納這個(gè)Intent并啟動(dòng)。3.1) onCreate(第一次)3.1.1) callScreenOnCreate獲得通話界面被創(chuàng)建的時(shí)間。3.1.2) PhoneApp喚醒后臺(tái)的效力程序。3.1.3) 判別當(dāng)前的通話形狀I(lǐng)DLE =沒(méi)有通話行為,RIN

13、GING =正在通話或呼叫等待,OFFHOOK = The phone is off hook. At least one call exists that is dialing, active or holding and no calls are ringing or waiting.,假設(shè)正在通話,不會(huì)出現(xiàn)鍵盤(pán)鎖。接著設(shè)置mPhone and mForegroundCall/mBackgroundCall/mRingingCall。3.1.4) getBluetoothHandsfree設(shè)置藍(lán)牙耳機(jī),假設(shè)存在藍(lán)牙耳機(jī),那么安裝該設(shè)備。3.1.5) initInCallScreen加載各種

14、view組建。3.1.6) 對(duì)通話的各種形狀進(jìn)展廣播。(registerForPreciseCallStateChanged,registerForDisconnect,registerForMmiInitiateregisterForMmiComplete,registerForCallWaiting,registerForSuppServiceFailed,registerForCdmaOtaStatusChange)3.1.7) internalResolveIntent判別能否運(yùn)用了OTA技術(shù),經(jīng)過(guò)該判別設(shè)置通話界面的款式。3.1.8) callScreenCreated記錄通話界面創(chuàng)

15、建完成后的時(shí)間3.2) onNewIntent(非第一次)。我們重新啟動(dòng)一個(gè)Intent時(shí)調(diào)用該函數(shù)。由于我們圍繞獨(dú)一的一個(gè)InCallScreen實(shí)例來(lái)完成經(jīng)過(guò)的這個(gè)過(guò)程,那么除了第一次被創(chuàng)建的InCallScreen,只需有來(lái)電或者去電,該程序就會(huì)發(fā)生。假設(shè)InCallScreen曾經(jīng)在前臺(tái),該程序也會(huì)發(fā)生。3.2.1) setIntent保管該Intent,以致于未來(lái)我們可以獲得該intent。3.2.2) internalResolveIntent3.3) onResume進(jìn)展一些初始化操作,如:獲取一個(gè)PhoneApp對(duì)象,解開(kāi)Keyguard Notification的status

16、Bar給Disable。還內(nèi)置了一個(gè)Handler可以回調(diào)處置一些事件,比如:PHONE_STATE_CHANGED,PHONE_DISCONNECT,EVENT_HEADSET_PLUG_STATE_CHANGED。同時(shí)有一個(gè)獨(dú)立的BroadcastReceiver處置ACTION_HEADSET_PLUG,比如插入耳機(jī)等。3.3.1) 首先對(duì)鎖屏情況下的來(lái)電除了處置。3.3.2) disableStatusBar當(dāng)正在通話界面時(shí),使得形狀欄可用。3.3.3) setIgnoreTouchUserActivity忽略通話過(guò)程中無(wú)意的觸碰事件,使得這些無(wú)意的觸碰不會(huì)阻止設(shè)備進(jìn)入休眠。3.3.4

17、) registerReceiver監(jiān)聽(tīng)廣播3.3.5) startDialerSession當(dāng)在前臺(tái)是,堅(jiān)持一個(gè)dialer session。首先判別時(shí)候需求播放本地鈴聲,假設(shè)需求,那么判別雙音多頻能否可用,假設(shè)可用,那么創(chuàng)建一個(gè)聲音播放器。3.3.6) isBluetoothAudioConnected做一個(gè)能否藍(lán)牙銜接的判別。3.3.7) 假設(shè)是cdma通話,那么初始化OTA形狀,進(jìn)而假設(shè)是采用了OTA,那么設(shè)置InCallScreenMode為OTA通話模型。3.3.8) clearDisconnected在檢查該通話形狀之前,切斷其他網(wǎng)絡(luò)銜接。3.3.9) syncWithPhone

18、State同步通話界面與Phone的當(dāng)前形狀。假設(shè)沒(méi)有同步勝利,那么dismissAllDialogs();終了當(dāng)前的所以通話,endInCallScreenSession();封鎖通話界面的顯示。3.3.10) updateWakeState設(shè)置基于當(dāng)前Phone的喚醒形狀和屏幕超時(shí),以及通話界面的當(dāng)前形狀。3.3.11) enableTouchLock當(dāng)onresume時(shí)“觸摸鎖“疊加是不可見(jiàn)的,尤其是這個(gè)檢查可確保用戶通話按MUNU來(lái)喚醒屏幕后將不會(huì)被鎖。但假設(shè)撥號(hào)盤(pán)是翻開(kāi)的,而又需求通話計(jì)時(shí),那么培育了“觸摸鎖“覆蓋。4 Profiler.java該類(lèi)對(duì)通話各個(gè)時(shí)間點(diǎn)進(jìn)展記錄。該類(lèi)對(duì)通

19、話各個(gè)時(shí)間點(diǎn)進(jìn)展記錄。static long sTimeCallScreenRequested;/通話界面被懇求的時(shí)間static long sTimeCallScreenOnCreate;/通話界面被創(chuàng)建的時(shí)間static long sTimeCallScreenCreated;/通話界面創(chuàng)建完成后的時(shí)間static long sTimeIncomingCallPanelRequested;/正在通話時(shí),通話界面被懇求的時(shí)間static long sTimeIncomingCallPanelOnCreate;/正在通話時(shí),通話界面被創(chuàng)建的時(shí)間static long sTimeIncoming

20、CallPanelCreated;/正在通話時(shí),通話界面創(chuàng)建完成后的時(shí)間5 PhoneUtils.java擔(dān)任Phone對(duì)象的生成擔(dān)任Phone對(duì)象的生成,主要調(diào)用phone.getForegroundCall(),phone.getBackgroundCall(),phone.getRingingCall(),phone.dial()。5.1) placeCall(Phone phone, String number, Uri contactRef)撥打傳入的號(hào)碼,該函數(shù)被InCallScreen中的placeCall調(diào)用。參數(shù)phone手機(jī)對(duì)象;參數(shù)number用戶要撥打的號(hào)碼;參數(shù)con

21、tactRef要么是“:,要么是“contentcontacts,取決于通話初始化,該參數(shù)引發(fā)呼叫;前往CALL_STATUS_DIALED,CALL_STATUS_DIALED_MMI,或CALL_STATUS_FAILED。5.2) placeCallVia(Context context,Phone phone,String number,Uri contactRef,Uri gatewayUri)運(yùn)用第三方提供的網(wǎng)關(guān)撥打號(hào)碼,該函數(shù)被InCallScreen中的placeCall調(diào)用。假設(shè)號(hào)碼是緊急號(hào)碼,GSM MMI碼或者CDMA碼那么不能被呼叫。假設(shè)銜接成立,這個(gè)方法發(fā)出一個(gè)同步伐

22、用阻止查詢來(lái)電信息,使本地采用異步查詢。參數(shù)phone手機(jī)對(duì)象;參數(shù)context執(zhí)行CallerInfo查詢;參數(shù)number用戶要撥打的號(hào)碼,假設(shè)號(hào)碼不能建立銜接,那么僅被用于建立卡,并更新通話記錄;參數(shù)contactRef要么是“:,要么是“contentcontacts,該參數(shù)引發(fā)呼叫;參數(shù)gatewayUri用于設(shè)置銜接的地址;前往CALL_STATUS_DIALED或CALL_STATUS_FAILED。6 PhoneApp.java擔(dān)任Phone對(duì)象頂層運(yùn)用的生成該類(lèi)是一個(gè)普通的java類(lèi),主要擔(dān)任Phone對(duì)象頂層運(yùn)用的生成。這是一個(gè)虛擬的Phone對(duì)象,它從framework

23、層獲得一個(gè)Phone對(duì)象。該類(lèi)承繼自Application,同時(shí)能常駐內(nèi)存,他和PhoneUtils一同處置操作。在oncreate方法里面進(jìn)展各種全局的初始化:獲取Phone對(duì)象 NotificationMgr對(duì)象,PowerManager對(duì)象,SimCard對(duì)象等。同時(shí)內(nèi)置的Handler可以回調(diào)處置各種事件,如:EVENT_SIM_ABSENT,EVENT_SIM_NETWORK_LOCKED,EVENT_UPDATE_INCALL_NOTIFICATION等。7 CallNotifier.java監(jiān)聽(tīng)Phone形狀改動(dòng)和telephony層事件,觸發(fā)UI行為監(jiān)聽(tīng)Phone形狀的改動(dòng)和t

24、elephony層各種事件,并觸發(fā)任何有關(guān)的UI行為如開(kāi)場(chǎng)的鈴聲和來(lái)電的用戶界面,打在通話音,更新通知,寫(xiě)呼叫記錄條目等。7.1) 在構(gòu)造函數(shù)中,實(shí)現(xiàn)mPhone.registerForNewRingingConnection(this, PHONE_NEW_RINGING_CONNECTION, null);/*當(dāng)有新來(lái)電或等待銜接時(shí)Notifies。收到的訊息是:Message.obj將是一個(gè)AsyncResult,AsyncResult.userObj=obj,AsyncResult.result=a Connection。由于這個(gè)音訊曾經(jīng)過(guò)時(shí),所以經(jīng)過(guò)檢測(cè)Connection.isRi

25、nging()以確保銜接有效。假設(shè)Connection.isRinging()為true,那么Connection.getCall()=Phone.getRingingCall()*/mPhone.registerForPreciseCallStateChanged(this, PHONE_STATE_CHANGED, null);/*為通話形狀的改動(dòng)注冊(cè)notification。經(jīng)過(guò)調(diào)用PreciseCallState以獲取更準(zhǔn)確的通話形狀。*/mPhone.registerForDisconnect(this, PHONE_DISCONNECT, null);/*當(dāng)由于本地或遠(yuǎn)程掛斷或者出

26、現(xiàn)錯(cuò)誤掛斷通話時(shí)Notifies。收到的訊息是:Message.obj will be an AsyncResult,AsyncResult.userObj = obj,AsyncResult.result = a Connection object that is no longer connected.*/mPhone.registerForUnknownConnection(this, PHONE_UNKNOWN_CONNECTION_APPEARED, null);/*當(dāng)以前未跟蹤non-ringing/waiting銜接時(shí)Notifies。這能夠是由于一些其他實(shí)體如SIM卡運(yùn)用發(fā)起呼

27、叫。*/mPhone.registerForIncomingRing(this, PHONE_INCOMING_RING, null);/*當(dāng)有來(lái)響鈴時(shí)Notifies。收到的訊息是:Message.obj will be an AsyncResult,AsyncResult.userObj = obj,AsyncResult.result = a Connection.*/另外假設(shè)是CDMA通訊類(lèi)型,還執(zhí)行:mPhone.registerForCdmaOtaStatusChange(this, EVENT_OTA_PROVISION_CHANGE, null);/*當(dāng)CDMA OTA提供者位

28、置改動(dòng)時(shí)注冊(cè)notification*/mPhone.registerForCallWaiting(this, PHONE_CDMA_CALL_WAITING, null);/*當(dāng)CDMA呼叫等待時(shí)注冊(cè)notification*/mPhone.registerForDisplayInfo(this, PHONE_STATE_DISPLAYINFO, null);/*為網(wǎng)絡(luò)顯示信息通知注冊(cè)。Message.obj將包含一個(gè)AsyncResult。AsyncResult.result將是一個(gè)SuppServiceNotification實(shí)例。*/mPhone.registerForSignalIn

29、fo(this, PHONE_STATE_SIGNALINFO, null);/*為網(wǎng)絡(luò)的信號(hào)信息通知注冊(cè)。Message.obj將包含一個(gè)AsyncResult。AsyncResult.result將是一個(gè)SuppServiceNotification實(shí)例。*/mPhone.registerForInCallVoicePrivacyOn(this, PHONE_ENHANCED_VP_ON, null);/*當(dāng)sInCall VoicePrivacy可用時(shí)注冊(cè)notification*/mPhone.registerForInCallVoicePrivacyOff(this, PHONE_E

30、NHANCED_VP_OFF, null);/*當(dāng)sInCall VoicePrivacy不可用時(shí)注冊(cè)notification*/mPhone.registerForCdmaFwdBurstDtmf(this, PHONE_CDMA_FWD_BURST_DTMF, null);/*為 CDMA Forward Burst DTMF的事件通知設(shè)置處置程序*/mPhone.registerForCdmaFwdContDtmfStart(this, PHONE_CDMA_FWD_CONT_DTMF_START, null);/*為 CDMA Forward Burst DTMF啟動(dòng)的事件通知設(shè)置處置

31、程序*/mPhone.registerForCdmaFwdContDtmfStop(this, PHONE_CDMA_FWD_CONT_DTMF_STOP, null);/*為 CDMA Forward Burst DTMF停頓的事件通知設(shè)置處置程序*/假設(shè)是GSM類(lèi)型,那么執(zhí)行:mPhone.registerForRingbackTone(this, PHONE_RINGBACK_TONE, null);/*當(dāng)帶外回鈴音專(zhuān)業(yè)術(shù)語(yǔ)CRBT:COLOR RING BACK TONE,回鈴音定義:當(dāng)他人打給您時(shí),他(她)聽(tīng)到的聲音叫做回鈴音。回鈴音是指撥打的呼叫方所聽(tīng)到的對(duì)方的聲音,當(dāng)撥通時(shí)聽(tīng)到通

32、話音,通常是長(zhǎng)音;而當(dāng)對(duì)方占線時(shí)那么聽(tīng)到忙音,聲音短促,有時(shí),忙音會(huì)變成人聲語(yǔ)音提示。時(shí)Notifies。收到的訊息是:Message.obj將是一個(gè)AsyncResult,AsyncResult.userObj=obj,AsyncResult.result=true表示開(kāi)場(chǎng)播放回鈴音;=false表示停頓。*/mPhone.registerForResendIncallMute(this, PHONE_RESEND_MUTE, null);/*為復(fù)位上行靜音形狀成上行音頻注冊(cè)處置程序。*/7.2) 整個(gè)類(lèi)由函數(shù)handleMessage串起來(lái)。部分自動(dòng)撥號(hào),判別號(hào)碼正確性與否,平安機(jī)制。we

33、nku.baidu/view/c63b69791711cc7931b71628.html撥打過(guò)程:一自動(dòng)撥號(hào)是Intent.ACTION_CALL,另一種是Intent.ACTION_DIAl(只是到按鍵盤(pán)的界面,需求再手動(dòng)撥打)以下為CALL的代碼Xml代碼AndroidManifest.xmlJava代碼Intentintent=newIntent(ent.action.CALL,Uri.parse(:+inputStr);startActivity(intent);判別接通形狀eoeandroid/thread-30383-1-1.html刪除通話記錄擔(dān)任存放呼叫記

34、錄的內(nèi)容提供者源碼在ContactsProvider工程下:源碼途徑:comandroidproviderscontactsCallLogProvider.java運(yùn)用到的數(shù)據(jù)庫(kù)在:/data/data/viders.contacts/databases/contacts2.db表名:calls呼叫記錄有三種類(lèi)型:來(lái)電:CallLog.Calls.INCOMING_TYPE常量值:1已撥:CallLog.Calls.OUTGOING_TYPE常量值:2未接:CallLog.Calls.MISSED_TYPE常量值:3查看源碼中的聲明:3.需求聲明的權(quán)限4.系統(tǒng)的通

35、話記錄,是經(jīng)過(guò)ContentProvider來(lái)對(duì)外共享的5. UriCallLog.Calls.CONTENT_URI :等價(jià)于:Uri.parse(contentcall_log/calls);6.查詢出一切記錄ContentResolver resolver = getContentResolver();resolver.query(CallLog.Calls.CONTENT_URI, null, null, new Strin null);7.查詢某一個(gè)聯(lián)絡(luò)人的一切記錄按號(hào)碼resolver.query(CallLog.Calls.CONTENT_URI, nu

36、ll, number=?, new Strin null);8.查詢某一個(gè)聯(lián)絡(luò)人的一切未接記錄按號(hào)碼resolver.query(CallLog.Calls.CONTENT_URI, null, number=? and type=3, new Strin null);8.刪除某聯(lián)絡(luò)人最近的一次來(lái)電/*本代碼由于在Activity中,所以可以直接調(diào)用getContentResolver()。這個(gè)方法實(shí)踐上是Context中定義的。*/ContentResolverresolver=getContentResolver();/*這里涉及到內(nèi)容提

37、供者的知識(shí),其實(shí)這里是直接在操作Android的數(shù)據(jù)庫(kù),非??喑?/Cursorcursor=resolver.query(CallLog.Calls.CONTENT_URI,newString_id,number=?and(type=1ortype=3),newStrin_iddesclimit1);if(cursor.moveToFirst()intid=cursor.getInt(0);resolver.delete(CallLog.Calls.CONTENT_URI,_id=?,newStringid+);短信部分Android設(shè)備接納到的SMS是以pdu方式

38、的(protocol description unit)計(jì)算機(jī)網(wǎng)絡(luò)的概念A(yù) PDU is a protocol discription unit, which is the industry format for an SMS message. because SMSMessage reads/writes them you shouldnt need to disect them. A large message might be broken into many, which is why it is an array of objects.android.telephony.gsm.Sm

39、sMessage這個(gè)類(lèi)可以儲(chǔ)存SMS的相關(guān)信息,我們也可以從接納到的pdu中創(chuàng)建新的SmsMessage實(shí)例SmsMessage的運(yùn)用比較特殊,并不直接實(shí)例化,而是利用靜態(tài)方法getDefault()獲得smsmanager對(duì)象發(fā)送短信用戶權(quán)限設(shè)置發(fā)送部分 PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this,MainActivity.class), 0); SmsManager sms = (SmsManager.getDefault(); sms.sendTextMessage(phoneno, null

40、, context, pi, null);public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)destinationAddress: 收件人地址scAddress: 短信中心號(hào)碼,空為默許中心號(hào)碼sentIntent: 當(dāng)音訊發(fā)出時(shí),勝利或者失敗的信息報(bào)告經(jīng)過(guò)PendingIntent來(lái)廣播。假設(shè)該參數(shù)為空,那么發(fā)信程序會(huì)被一切位置程序檢查一遍,這樣會(huì)導(dǎo)致發(fā)送時(shí)間延

41、伸。deliveryIntent: 當(dāng)音訊發(fā)送到收件人時(shí),該P(yáng)endingIntent會(huì)被廣播。pdu數(shù)據(jù)在形狀報(bào)告的extended data (“pdu)中。拋出 IllegalArgumentException 假設(shè)收件人或者信息為空。出錯(cuò)時(shí)思索是不是text長(zhǎng)度太長(zhǎng)的問(wèn)題! 吃過(guò)兩次虧了。= =發(fā)送彩信 HYPERLINK eoeandroid/thread-21150-1-1.html eoeandroid/thread-21150-1-1.html HYPERLINK wenku.baidu/view/e2506ed850e2524de5187e54.html wenku.baid

42、u/view/e2506ed850e2524de5187e54.html HYPERLINK hi.baidu/lizhengjun2021/blog/item/3bb6c51fde5353e0af5133d9.html hi.baidu/lizhengjun2021/blog/item/3bb6c51fde5353e0af5133d9.html刪除短信未嘗試package pega.android.socket2;import android.database.Cursor;import .Uri;import android.util.Log;public class DeleteMess

43、age private PegaSocket2 deleteMessage;private int idelete;private Cursor eventCursor, remindersCursor;private int column = new int1;private String threadid = new String1;private Cursor querymessage;DeleteMessage(PegaSocket2 deleteMessage, int id) this.deleteMessage = deleteMessage;idelete = id;Strin

44、g uriInbox = contentsms;String projection = new String thread_id ;Uri uriSms = Uri.parse(uriInbox);String where = _id = + Integer.toString(idelete);querymessage = deleteMessage.getContentResolver().query(uriSms,projection, where, null, null);private void MoveToFirst() querymessage.moveToFirst();publ

45、ic int DeleteShortMessage() if (querymessage.getCount() != 0) MoveToFirst();threadid0 = thread_id;column0 = querymessage.getColumnIndex(thread_id);threadid0 = querymessage.getString(column0);/ delete messageint number = deleteMessage.getContentResolver().delete(Uri.parse(contentsms/conversations/ +

46、threadid0),_id = + idelete, null);Log.e(delete_number, Integer.toString(number);if (number != 0)return 1;elsereturn 0; else Log.e(number, cannt fine the message!);return 0;經(jīng)過(guò)主鍵id來(lái)找到他對(duì)應(yīng)的thread_id。然后進(jìn)展刪除就可以了2: HYPERLINK HYPERLINK bingtian.javaeye/blog/641553 bingtian.javaeye/blog/641553監(jiān)聽(tīng)短信收發(fā)兩種方式利用廣播缺

47、陷:查看BroadReceiver sdk reference , 可以了解到一切的BroadReceiver對(duì)短信的接納是無(wú)順序的形狀 ,即使是運(yùn)用了Ordered broadcasts對(duì)于同等優(yōu)先級(jí)別的BroadReceiver ,也會(huì)產(chǎn)生無(wú)順序的行為。流程了解:用bundle從intent.getExtras中得到,再用object從bundle.get(pdus)得到,此時(shí)為pdu方式,接著用SmsMessage.createFromPdu (byte) pdusObji)一位位的讀到SmsMessage msg中每個(gè)i表示的是一條短信,此時(shí)為 smsmessage格式,接著再對(duì)每個(gè)m

48、sgi.getMessageBody()得到短信的內(nèi)容string public class receive extends BroadcastReceiver String receiveMsg = ;public void onReceive(Context context, Intent intent)SmsMessage msg= null;if (intent.getAction().equals(vider.Telephony.SMS_RECEIVED) Bundle bundle = intent.getExtras();if (bundle != null

49、) Object pdusObj = (Object) bundle.get(pdus); / bundle 中存儲(chǔ)了信息,有傳送的作用,既然有g(shù)et.,前面一定有存入以這個(gè)字符串一個(gè)鍵值對(duì)的方式儲(chǔ)存了values!把pdus了解為一種標(biāo)識(shí)符!msg= new SmsMessagepdusObj.length;for (int i = 0; i pdusObj.length; i+)msgi = SmsMessage.createFromPdu (byte) pdusObji);for(int i = 0; i msg.length; i+)String msgTxt = msgi.getMe

50、ssageBody(); if (msgTxt.equals(Testing!)Toast.makeText(context, success!, Toast.LENGTH_LONG).show();return;elseToast.makeText(context, msgTxt, Toast.LENGTH_LONG).show();return;return;利用數(shù)據(jù)庫(kù)/如下 主要用于內(nèi)部數(shù)據(jù)庫(kù)改動(dòng),向外面的界面(Activity)做反響class SMSHandler extends Handlerpublic void handleMessage(Message msg)/Handle

51、 message/ 對(duì)收到短音訊后,做出的處置,這里直接刪除,并沒(méi)有反響到界面,所以上面的handleMessage是空的。class SMSObserver extends ContentObserverprivate Handle m_handle = null;public SMSObserver(Handle handle)super(handle);m_handle = handle;public void onChange(boolean bSelfChange)super.onChange(bSelfChange);/Send message to ActivityMessage

52、 msg = new Message();msg.obj = xxxxxxxxxx;m_handle.sendMessage(msg);String strUriInbox = contentsms/inbox;Uri uriSms = Uri.parse(strUriInbox);/If you want to access all SMS, just replace the uri string to contentsms/Cursor c = mContext.getContentResolver().query(uriSms, null, null, null, null);/ del

53、ete all sms here when every new sms occures.while (c.moveToNext()/Read the contents of the SMS;for(int i; i c.getColumnCount(); i+)String strColumnName = c.getColumnName(i);String strColumnValue = c.getString(i);/Delete the SMSString pid = c.getString(1);/Get thread id;String uri = contentsms/conver

54、sations/ + pid;mContext.getContentResolver().delete(Uri.parse(uri), null, null);/把根本類(lèi)功能性地運(yùn)用起來(lái)ContentResolver contentResolver = getContentResolver();/ Context 環(huán)境下getContentResolver()Handler handler = new SMSHandler();ContentObserver m_SMSObserver = new SMSObserver(handler);contentResolver.registerCon

55、tentObserver(Uri.parse(contentsms/inbox),true, m_SMSObserver);/Register to observe SMS in outbox,we can observe SMS in other location by changing Uri string, such as inbox, sent, draft, outbox, etc.)/ some Available Uri stringfor sms.REMEBER: must request following permission1) Read SMS2) Delete/Mod

56、ify/Send SMSin AndroidManifest.xml 1. public class ScreenTest extends Activity 2. 3. class SmsContent extends ContentObserver 4. private Cursor cursor = null; 5. public SmsContent(Handler handler) 6. super(handler); 7. 8. 9. /* 10. * Description 當(dāng)短信表發(fā)送改動(dòng)時(shí),調(diào)用該方法11. * 需求兩種權(quán)限 12. * android.permission.R

57、EAD_SMS讀取短信 13. * android.permission.WRITE_SMS寫(xiě)短信 14. * Author Snake 15. * Date 2021-1-12 16. */17. Override18. public void onChange(boolean selfChange) 19. / TODO Auto-generated method stub20. super.onChange(selfChange);21. /讀取收件箱中指定號(hào)碼的短信22. cursor = managedQuery(Uri.parse(contentsms/inbox), new St

58、ring_id, address, read, address=? and read=?, new String12345678901, 0, date desc);23. 24. if (cursor != null)25. ContentValues values = new ContentValues();26. values.put(read, 1); /修正短信為已讀方式27. cursor.moveToFirst();28. while (cursor.isLast()29. /更新當(dāng)前未讀短信形狀為已讀30. getContentResolver().update(Uri.par

59、se(contentsms/inbox), values, _id=?, new String+cursor.getInt(0);31. cursor.moveToNext();32. 33. 34. 35. 36. 37. /* Called when the activity is first created. */38. Override39. public void onCreate(Bundle savedInstanceState) 40. super.onCreate(savedInstanceState);41. setContentView(R.layout.main);42. SmsContent content = new SmsContent(new Handler();43. /注冊(cè)短信變化監(jiān)聽(tīng)44. this.getContentResolver().registerContentObserver(Uri.parse(contentsms/), true, content); 收到短信不頂欄通知 HYPERLINK elexcon/Item/55.html elexcon/Item/55.html獲取短信內(nèi)容android 的短信都保管在數(shù)據(jù)庫(kù)中,經(jīng)過(guò)操作數(shù)據(jù)庫(kù)即可獲得短信的信息用android數(shù)據(jù)庫(kù)編程嗎,直接調(diào)用provider很方便的。短信的是c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論