AndroidAPN開(kāi)發(fā)流程分析知識(shí)講解_第1頁(yè)
AndroidAPN開(kāi)發(fā)流程分析知識(shí)講解_第2頁(yè)
AndroidAPN開(kāi)發(fā)流程分析知識(shí)講解_第3頁(yè)
AndroidAPN開(kāi)發(fā)流程分析知識(shí)講解_第4頁(yè)
AndroidAPN開(kāi)發(fā)流程分析知識(shí)講解_第5頁(yè)
已閱讀5頁(yè),還剩54頁(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、Good is good, but better carries it.精益求精,善益求善。AndroidAPN開(kāi)發(fā)流程分析-AndroidAPN開(kāi)發(fā)流程分析2DataConnect流程分析Android的數(shù)據(jù)連接是基于PPP方式的,主要步驟為:首先通過(guò)AT命令激活PDP連接,然后利用pppd通過(guò)數(shù)據(jù)端口完成撥號(hào)連接;數(shù)據(jù)連接的核心控制類是DataConnectionTracker,存在于GSMPhone里,數(shù)據(jù)連接不需要用戶的干預(yù),在APN設(shè)置好之后,在適當(dāng)?shù)那闆r下就會(huì)自動(dòng)激活,激活的入口點(diǎn)是:DataConnectionTracker.trySetupDatasetupDataPdpCon

2、nection.connetcCommandsInterface.setupDefaultPDP,通過(guò)PdpConnection訪問(wèn)GSMPhone中的RIL層的setupDefaultPDP實(shí)現(xiàn),setupDefaultPDP的結(jié)果由EVENT_SETUP_PDP_DONE返回,如果成功,則開(kāi)始調(diào)用pppd完成實(shí)際連接,這是通過(guò)DataLink.connect實(shí)現(xiàn)的;DataLink只是抽象基類,此處它的實(shí)現(xiàn)類是PppLink,實(shí)現(xiàn)DataLinkInterface接口,所以DataLink.connect實(shí)際上調(diào)用PppLink.connect,它通過(guò)SystemService.start

3、(SERVICE_PPPD_GPRS)開(kāi)始pppd服務(wù),并通過(guò)checkPPP函數(shù)訪問(wèn)Linux的sys文件系統(tǒng)來(lái)查詢pppd的連接狀態(tài),如果成功,便可以將LINKUP的消息通知出去以完成連接流程。2DataConnect流程分析Android的數(shù)據(jù)連接是基于PPP方式的,主要步驟為:首先通過(guò)AT命令激活PDP連接,然后利用pppd通過(guò)數(shù)據(jù)端口完成撥號(hào)連接;數(shù)據(jù)連接的核心控制類是DataConnectionTracker,存在于GSMPhone里,數(shù)據(jù)連接不需要用戶的干預(yù),在APN設(shè)置好之后,在適當(dāng)?shù)那闆r下就會(huì)自動(dòng)激活,激活的入口點(diǎn)是:DataConnectionTracker.trySetu

4、pDatasetupDataPdpConnection.connetcCommandsInterface.setupDefaultPDP,通過(guò)PdpConnection訪問(wèn)GSMPhone中的RIL層的setupDefaultPDP實(shí)現(xiàn),setupDefaultPDP的結(jié)果由EVENT_SETUP_PDP_DONE返回,如果成功,則開(kāi)始調(diào)用pppd完成實(shí)際連接,這是通過(guò)DataLink.connect實(shí)現(xiàn)的;DataLink只是抽象基類,此處它的實(shí)現(xiàn)類是PppLink,實(shí)現(xiàn)DataLinkInterface接口,所以DataLink.connect實(shí)際上調(diào)用PppLink.connect,它通

5、過(guò)SystemService.start(SERVICE_PPPD_GPRS)開(kāi)始pppd服務(wù),并通過(guò)checkPPP函數(shù)訪問(wèn)Linux的sys文件系統(tǒng)來(lái)查詢pppd的連接狀態(tài),如果成功,便可以將LINKUP的消息通知出去以完成連接流程。3.3RILD源碼分析RIL對(duì)對(duì)消息的處理是將消息通過(guò)LocalSocket發(fā)送到以rild為名稱的有名端口。這個(gè)有名Socket的創(chuàng)建在ril.cpp代碼中。s_fdListen=android_get_control_socket(SOCKET_NAME_RIL)RILD是守護(hù)進(jìn)程,執(zhí)行的過(guò)程為:獲取參數(shù)打開(kāi)功能庫(kù)建立事件循環(huán)執(zhí)行RIL_InitRIL_r

6、egister;事件循環(huán)式核心,通過(guò)Select多路復(fù)用機(jī)制,讀取來(lái)自上層的Socket接口的具體操作命令,同時(shí)一些命令Timeout喚醒機(jī)制,也通過(guò)Select實(shí)現(xiàn);1.Request流程命令下發(fā)流程:首先從JAVA層通過(guò)Socket將命令發(fā)送到RIL層的RILD守護(hù)進(jìn)程,RILD中負(fù)責(zé)監(jiān)聽(tīng)的ril_event_loop消息循環(huán)中的Select發(fā)現(xiàn)RILDSocket有了請(qǐng)求連接信號(hào),建立一個(gè)record_stream,打通與上層的數(shù)據(jù)通道并開(kāi)始接收請(qǐng)求數(shù)據(jù),數(shù)據(jù)通道的回調(diào)函數(shù)processCommandsCallback()會(huì)保證收到一個(gè)完整的Request后,將其送達(dá)processCom

7、mandBuffer()函數(shù);解析過(guò)程:processCommandBuffer()從Socket中序列化的數(shù)據(jù)流里還原信息,將其組織到RequestInfo中;RequestInfo數(shù)據(jù)結(jié)構(gòu)如下(存在于ril.cpp中):typedefstructRequestInfoint32_ttoken;/thisisnotRIL_TokenCommandInfo*pCI;structRequestInfo*p_next;charcancelled;charlocal;/responsestolocalcommandsdonotgobacktocommandprocessRequestInfo;RIL

8、層以Request號(hào)為基礎(chǔ)采用表驅(qū)動(dòng)方式分發(fā)請(qǐng)求,CommandInfo結(jié)構(gòu)表示命令的信息,關(guān)聯(lián)了Request號(hào)和實(shí)際的請(qǐng)求函數(shù),以及響應(yīng)函數(shù)之間的關(guān)系;分發(fā)流程:s_callback.onRequest()完成分發(fā)操作,s_callback獲取自libreference-ril的RIL_RadioFunction結(jié)構(gòu)指針,Request請(qǐng)求在這里轉(zhuǎn)入底層的libreference-ril處理,handler是reference-ril.cpp中的Request。onRequest根據(jù)Request號(hào)進(jìn)行簡(jiǎn)單的switch分發(fā),然后將命令和參數(shù)轉(zhuǎn)換成對(duì)應(yīng)的AT命令,由writeline()完

9、成驅(qū)動(dòng)層的發(fā)送,writeline通過(guò)驅(qū)動(dòng)程序節(jié)點(diǎn)的文件描述符進(jìn)行寫操作實(shí)現(xiàn)控制。2.Response流程Response有兩類:unsolicited表示主動(dòng)上報(bào)的消息,如來(lái)電,來(lái)短信等,而solicited是AT命令的響應(yīng),判斷是否是solicited的依據(jù)有兩點(diǎn):一是當(dāng)前用AT命令正在等待響應(yīng);二是讀取的響應(yīng)符合該AT命令的響應(yīng)格式。對(duì)于Response流程來(lái)講,流程是從Modem設(shè)備發(fā)回響應(yīng)數(shù)據(jù)開(kāi)始的。RIL通過(guò)readerLoop函數(shù),利用readline逐行讀取響應(yīng)數(shù)據(jù),隨后通過(guò)processLine進(jìn)行分析,主動(dòng)上報(bào)的一般以+XXXX的形式出現(xiàn),而AT命令的響應(yīng)格式則有一行或多行

10、之分,但最終一定以O(shè)K或者ERROR結(jié)尾,于是PrcessLine有以下幾種情況:1)、沒(méi)有AT命令等待響應(yīng)或不符合AT響應(yīng)格式,一般是主動(dòng)上報(bào)行,由handleUnsolicited處理,handleUnsolicitedonUnsolicetdRIL_onUnsolicitedResponse;2)、isFinalResponseSucess/isFinalResponseError是最終響應(yīng)行,轉(zhuǎn)到handleFinalResponse處理,handleFInalResponse會(huì)發(fā)送線程同步信號(hào),激活等到的發(fā)送線程;3)、符合當(dāng)前AT命令響應(yīng)格式的行,解析并獲取數(shù)據(jù),這是響應(yīng)處理的中間

11、過(guò)程,然后繼續(xù)收到最終響應(yīng)行,然后進(jìn)入2)流程最后的發(fā)送動(dòng)作由sendResponsesendResponseRawblockingWrite通過(guò)Socket回傳給上層來(lái)完成,響應(yīng)解析由上層完成。AndroidMMS源碼流程(一)2010-06-2508:21概述MMS的收發(fā)操作借助于手機(jī)的短信機(jī)制,實(shí)際收發(fā)過(guò)程需要網(wǎng)絡(luò)的APN支持,使用特定的APN接入點(diǎn)實(shí)現(xiàn)MMS數(shù)據(jù)的真實(shí)發(fā)送和接收;源碼流程1)Telephpony.javagetOrCreateThreadId()函數(shù):目錄:frameworksbasecorejavaandroidprovider說(shuō)明:這個(gè)函數(shù)根據(jù)接收者列表和未保存的消

12、息返回一個(gè)線程ID,如果這個(gè)消息開(kāi)始一個(gè)新的線程,那么函數(shù)分配一個(gè)線程ID,否則返回一個(gè)適當(dāng)?shù)囊呀?jīng)存在的線程ID;2)MmsMessageSender.javasendMessage()函數(shù):目錄:packagesappsmmssrccomandroidmmstransaction說(shuō)明:對(duì)Mms進(jìn)行封包3)再一次調(diào)用第一步函數(shù)4)ConnectivityService.javastartUsingNetworkFeature()函數(shù):目錄:frameworkbaseservicesjavacomandroidserver說(shuō)明:該函數(shù)為實(shí)現(xiàn)Mms網(wǎng)絡(luò)連接的關(guān)鍵函數(shù),下面我們?cè)敿?xì)分析:A、enfo

13、rceChangePermission():判斷調(diào)用的進(jìn)程是否具有操作權(quán)限,如果不具有,拋出一個(gè)SecurityException異常,并強(qiáng)制準(zhǔn)許權(quán)限B、ConnectivityManager.isNetworkTypeValid(networkType)來(lái)判斷networkType是否合法,如果不合法返回一個(gè)APN_REQUEST_FAILED,在這里用到了最重要的ConnectivityManager類:publicclassConnectivityManager定義在frameworksbasecorejavaandroidnet的ConnectivityManager.java里,其主

14、要作用為:1、監(jiān)視網(wǎng)絡(luò)連接,如WIFI、GPRS、UMTS等2、當(dāng)網(wǎng)路連接出現(xiàn)變化的時(shí)候,發(fā)送廣播intents3、當(dāng)一個(gè)網(wǎng)絡(luò)連接丟失之后,嘗試連接另一個(gè)網(wǎng)絡(luò)4、為App提供粗粒度、細(xì)粒度的有效網(wǎng)絡(luò)狀態(tài)查詢C、FeatureUserf=newFeatureUser(networkType,feature,binder);新建一個(gè)FeatureUser類變量,該類實(shí)現(xiàn):當(dāng)調(diào)用進(jìn)程died時(shí)發(fā)送一個(gè)Notice,這樣就可以自我老化D、intusedNetworkType=networkType;if(networkType=ConnectivityManager.TYPE_MOBILE)if(Te

15、xtUtils.equals(feature,Phone.FEATURE_ENABLE_MMS)usedNetworkType=ConnectivityManager.TYPE_MOBILE_MMS;elseif(TextUtils.equals(feature,Phone.FEATURE_ENABLE_SUPL)usedNetworkType=ConnectivityManager.TYPE_MOBILE_SUPL;elseif(TextUtils.equals(feature,Phone.FEATURE_ENABLE_DUN)usedNetworkType=ConnectivityMana

16、ger.TYPE_MOBILE_DUN;elseif(TextUtils.equals(feature,Phone.FEATURE_ENABLE_HIPRI)usedNetworkType=ConnectivityManager.TYPE_MOBILE_HIPRI;這段代碼獲取使用的網(wǎng)絡(luò)類型;E、NetworkStateTrackernetwork=mNetTrackersusedNetworkType;NetworkStateTracker類在NetworkStateTracker.java里:每個(gè)子類保持跟蹤一個(gè)網(wǎng)絡(luò)接口的連接狀態(tài),一個(gè)網(wǎng)絡(luò)的狀態(tài)信息由一個(gè)Tracker類保持,基類管理ne

17、twork-type-independent網(wǎng)絡(luò)狀態(tài)F、mFeatureUsers.add(f);列表操作,將f添加到列表的endG、if(!mNetRequestersPidsusedNetworkType.contains(currentPid)/thisgetsusedforper-piddnswhenconnectedmNetRequestersPidsusedNetworkType.add(currentPid);判斷網(wǎng)絡(luò)操作需要的Pid是否包含當(dāng)前Pid,如果不包含就添加進(jìn)去H、mHandler.sendMessageDelayed(mHandler.obtainMessage(N

18、etworkStateTracker.EVENT_RESTORE_DEFAULT_NETWORK,f),getRestoreDefaultNetworkDelay();消息發(fā)送,問(wèn)題:消息的Handle函數(shù)也在該文件本地,?I、if(ni.isConnectedOrConnecting()=true)&!network.isTeardownRequested()if(ni.isConnected()=true)/addthepid-specificdnsLog.d(TAG,fanyltest+beforehandleDnsConfigurationChange);handleDnsConfig

19、urationChange();if(DBG)Log.d(TAG,specialnetworkalreadyactive);returnPhone.APN_ALREADY_ACTIVE;if(DBG)Log.d(TAG,specialnetworkalreadyconnecting);returnPhone.APN_REQUEST_STARTED;這里判斷網(wǎng)絡(luò)是正在連接還是已經(jīng)連接完成,如果是已經(jīng)連接完成,就去設(shè)置Dns,并返回already狀態(tài)J、network.reconnect()如果網(wǎng)絡(luò)不是已經(jīng)連接完成的狀態(tài)的話,這里觸發(fā)一個(gè)重新連接,直到網(wǎng)絡(luò)狀態(tài)變成isConnected;Andro

20、idMMS源碼流程(二)2010-06-2508:215)接下來(lái)的操作存在于DataConnectionTracker.java里:publicsynchronizedintenableApnType(Stringtype):該函數(shù)確保用指定的類型連接APN,成功返回APN_ALREADY_ACTIVE或者APN_REQUEST_STARTEDprivatevoidsetEnabled(intid,booleanenable):發(fā)送EVENT_ENABLE_NEW_APN事件protectedsynchronizedvoidonEnableApn(intapnId,intenabled)該實(shí)例

21、主要功能是判斷目前是enable還是disableAPN,如果是enable的話,調(diào)用onEnableNewApn();實(shí)現(xiàn)enableAPN,如果是disable的話,根據(jù)enabledCount,onCleanUpConnection關(guān)閉APN或者改為默認(rèn)連接6)publicvoidhandleMessage(Messagemsg),ConnectivityService.java里進(jìn)入到對(duì)事件EVENT_STATE_CHANGED的處理,state=CONNECTED,old=CONNECTING,reason=apnChanged,apnTypeList=mms,應(yīng)該是最后調(diào)用了han

22、dleConnect(info);發(fā)送一個(gè)廣播事件7)MobileDataStateTracker.java:MobileDataStateReceiver類的publicvoidonReceive(Contextcontext,Intentintent)函數(shù)里處理caseCONNECTED處理;調(diào)用setDetailedState(NetworkStateTracker類實(shí)例)發(fā)送了EVENT_STATE_CHANGED事件8)然后又跳回ConnectivityService.java里的handleMessage函數(shù)EVENT_STATE_CHANGED事件的CONNECTED狀態(tài)處理9)

23、handleConnect里最后調(diào)用updateNetworkSettings(實(shí)現(xiàn)在NetworkStateTracker類里),并發(fā)送sendConnectedBroadcast(info);廣播事件10)ConnectivityService.javahandleDnsConfigurationChange配置DNS信息,并在handleConnect函數(shù)調(diào)用addPrivateDnsRoutes添加路由信息11)接下來(lái)調(diào)用了GpsLocationProvider.java里的updateNetworkState和runLocked,原因不明?12)接下來(lái)返回去調(diào)用startUsingN

24、etworkFeature(ConnectivityService.java),又一次adddns?,然后返回APN_ALREADY_ACTIVE狀態(tài)13)ensureRouteToHost()(/packages/apps/Mms/src/com/android/mms/transaction/Transaction.java)調(diào)用了ConnectivityManager類里的requestRouteToHost至此關(guān)于Mms的Apn網(wǎng)絡(luò)連接就建立起來(lái)了,下面的步驟是在RILJ層以及RILD層實(shí)現(xiàn)數(shù)據(jù)和AT命令與modem的數(shù)據(jù)通信,省去下面分析disableAPN的流程,基本上就是Star

25、t的反過(guò)程:1)數(shù)據(jù)通信完畢,SendTransaction.java里的run函數(shù)給出數(shù)據(jù)通信完成之后的狀態(tài)2)stopUsingNetworkFeature()(ConnectivityService實(shí)例);這個(gè)就是startUsingNetworkFeature的反過(guò)程3)disableApnType(mms),DataConnectionTracker類4)setEnabled,DataConnectionTracker類Android平臺(tái)中Wifi的初始化收藏1.WIFIJAVAlayer:1.1.當(dāng)android系統(tǒng)啟動(dòng)WIFI模塊時(shí),它將調(diào)用Wifiserver類的setWifi

26、EnabledBlocking函數(shù)。1.2.在該函數(shù)中,如果是使能WIFI,它將做四件事:a.loadwifidriver.b.啟動(dòng)wpa_supplicant.c.啟動(dòng)eventloop.d.更新wifi的狀態(tài).2.WIFINativelayer:2.1.當(dāng)java層調(diào)用loadDriver時(shí),它實(shí)際上是通過(guò)JNI來(lái)調(diào)用Native函數(shù),JNI-android_net_wifi_loadDriver-wifi_load_driver。在wifi_load_driver函數(shù)中,它將首先通過(guò)systemproperty-wlan.driver.status的狀態(tài)來(lái)判斷驅(qū)動(dòng)是否已經(jīng)加載。如果沒(méi)有加

27、載,將會(huì)加載該驅(qū)動(dòng)。2.2.當(dāng)java層調(diào)用startSupplicant時(shí),它實(shí)際上是通過(guò)JNI調(diào)用到wifi_start_supplicant函數(shù),在wifi_start_supplicant函數(shù)里,首先確定wpasupplicant的配置文件存在,如果不存在,將默認(rèn)配置文件拷貝到相應(yīng)目錄下,下面是配置文件的默認(rèn)路徑和工作路徑:staticconstcharSUPP_CONFIG_TEMPLATE=/system/etc/wifi/wpa_supplicant.conf;staticconstcharSUPP_CONFIG_FILE=/data/misc/wifi/wpa_supplica

28、nt.conf;然后,調(diào)用control_supplicant函數(shù),如果這時(shí)wpa_supplicant還沒(méi)有啟動(dòng),將會(huì)啟動(dòng)wpa_supplicant.2.3.java層通過(guò)connectToSupplicant調(diào)用wifi_connect_to_supplicant函數(shù),在該函數(shù)中,將通過(guò)wpa_ctrl_open函數(shù)分別創(chuàng)建兩個(gè)AF_UNIX地址族和數(shù)據(jù)報(bào)方式的socket,一個(gè)是ctrl_conn,用于向wpa_supplicant發(fā)送命令并接收response,另一個(gè)是monitor_conn,它一直阻塞等待從wpa_supplicant過(guò)來(lái)的event。最后,通過(guò)monitor_c

29、onn向wpa_supplicant發(fā)送命令A(yù)TTACH,用于將自己的socket信息注冊(cè)到wpa_supplicant,由于socket是數(shù)據(jù)報(bào)方式的,這一步是必須的,對(duì)于存在于wpa_supplicant的服務(wù)器端,它是所有客戶端共享的,由于它需要主動(dòng)向monitor_conn客戶端發(fā)送事件,所以它必須先記錄下該客戶端的詳細(xì)信息,wpa_supplicant就可以將EVENT發(fā)向該socket。在完成上面這些操作后,java層會(huì)通過(guò)jni方式調(diào)用函數(shù)android_net_wifi_waitForEvent(應(yīng)該是起一個(gè)線程,在線程里調(diào)用),該函數(shù)會(huì)調(diào)用wifi_wait_for_even

30、t,在wifi_wait_for_event函數(shù)里,會(huì)阻塞接收從wpa_supplicant模塊傳來(lái)的事件,一旦wpa_supplicant模塊有事件發(fā),wifi_wait_for_event接收到后,會(huì)將包含事件的buf通過(guò)函數(shù)參數(shù)的方式回傳到j(luò)ava層,java收到事件后,再繼續(xù)調(diào)用wifi_wait_for_event函數(shù)進(jìn)行阻塞等待接收,從而完成一個(gè)循環(huán)。2.4.以上的流程完成以后,WIFIjavalayer調(diào)用的WIFInativeapi就和wpa_supplicant進(jìn)程就建立了聯(lián)系,WIFIjavalayer就可以向wpa_supplicant發(fā)送命令和接收response,并且

31、wpa_supplicant也可以主動(dòng)向WIFIjavalayer發(fā)送事件了。本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:HYPERLINK/zhaohc_nj/archive/2010/08/30/5849536.aspx/zhaohc_nj/archive/2010/08/30/5849536.aspxandroid新建一個(gè)Apn后的數(shù)據(jù)連接的調(diào)試過(guò)程HYPERLINK/tag-android.htmlt_blankandroid,HYPERLINK/tag-Apn.htmlt_blankApn,HYPERLINK/tag-%E6%95%B0%E6%8D%AE.htmlt_blank數(shù)據(jù),HYP

32、ERLINK/tag-%E8%B0%83%E8%AF%95.htmlt_blank調(diào)試當(dāng)我新建了一個(gè)APN保存信息后,系統(tǒng)發(fā)現(xiàn)APN發(fā)生了改變就會(huì)去進(jìn)行數(shù)據(jù)連接.我查看調(diào)試信息發(fā)現(xiàn)第一次發(fā)送setup_data_call請(qǐng)求后,底層做出了響應(yīng),數(shù)據(jù)連接成功了狀態(tài)為CONNECTED,卻出現(xiàn)了PREFEREDAPNisnull,然后又監(jiān)聽(tīng)到了Apn發(fā)生了改變,所以就將狀態(tài)改變?yōu)镈ISCONNECTING,接著就發(fā)送一個(gè)DEACTIVATE_DATA_CALL的請(qǐng)求要求斷開(kāi)數(shù)據(jù)連接,然后又發(fā)送一個(gè)setup_data_call去進(jìn)行數(shù)據(jù)連接,第二次就連接成功了并在屏幕上顯示出來(lái)了G標(biāo)志.其中讓我非

33、常納悶的是:為什么檢測(cè)到兩次APN發(fā)生了改變?當(dāng)?shù)谝淮芜B接狀態(tài)已經(jīng)為CONNECTED了卻又監(jiān)聽(tīng)到了APN發(fā)生了改變.添加APN網(wǎng)絡(luò)接入點(diǎn),設(shè)置指定網(wǎng)絡(luò)為默認(rèn)網(wǎng)絡(luò)收藏網(wǎng)上看了很多資料,再加上自己的理解和探索,終于實(shí)現(xiàn)了添加接入點(diǎn)設(shè)置和將當(dāng)前網(wǎng)絡(luò)設(shè)置為自己指定的網(wǎng)絡(luò)接入點(diǎn)。廢話不多說(shuō),上源碼,大家分享下:(在moto-xt800,CDMA下進(jìn)行了測(cè)試)1.準(zhǔn)備工作:AndroidManifest。xml文件里添加以下三個(gè)權(quán)限設(shè)置:開(kāi)始上代碼了,很期待吧?2.新建一個(gè)類ApnNode,算是屬性設(shè)置吧publicclassApnNodeprivateStringname;privateStringa

34、pn;privateStringproxy;privateStringport;privateStringuser;privateStringserver;privateStringpassword;privateStringmmsc;privateStringmmsproxy;privateStringmmsport;privateStringmcc;privateStringmnc;privateStringnumeric;privateStringtype;/*returnthename*/publicStringgetName()returnname;/*paramnamethenam

35、etoset*/publicvoidsetName(Stringname)=name;/*returntheapn*/publicStringgetApn()returnapn;/*paramapntheapntoset*/publicvoidsetApn(Stringapn)this.apn=apn;/*returntheproxy*/publicStringgetProxy()returnproxy;/*paramproxytheproxytoset*/publicvoidsetProxy(Stringproxy)xy=proxy;/*returntheport*/publicString

36、getPort()returnport;/*paramporttheporttoset*/publicvoidsetPort(Stringport)this.port=port;/*returntheuser*/publicStringgetUser()returnuser;/*paramusertheusertoset*/publicvoidsetUser(Stringuser)this.user=user;/*returntheserver*/publicStringgetServer()returnserver;/*paramservertheservertoset*/publicvoi

37、dsetServer(Stringserver)this.server=server;/*returnthepassword*/publicStringgetPassword()returnpassword;/*parampasswordthepasswordtoset*/publicvoidsetPassword(Stringpassword)this.password=password;/*returnthemmsc*/publicStringgetMmsc()returnmmsc;/*parammmscthemmsctoset*/publicvoidsetMmsc(Stringmmsc)

38、this.mmsc=mmsc;/*returnthemmsproxy*/publicStringgetMmsproxy()returnmmsproxy;/*parammmsproxythemmsproxytoset*/publicvoidsetMmsproxy(Stringmmsproxy)this.mmsproxy=mmsproxy;/*returnthemmsport*/publicStringgetMmsport()returnmmsport;/*parammmsportthemmsporttoset*/publicvoidsetMmsport(Stringmmsport)this.mm

39、sport=mmsport;/*returnthemcc*/publicStringgetMcc()returnmcc;/*parammccthemcctoset*/publicvoidsetMcc(Stringmcc)this.mcc=mcc;/*returnthemnc*/publicStringgetMnc()returnmnc;/*parammncthemnctoset*/publicvoidsetMnc(Stringmnc)this.mnc=mnc;/*returnthenumeric*/publicStringgetNumeric()returnnumeric;/*paramnum

40、ericthenumerictoset*/publicvoidsetNumeric(Stringnumeric)this.numeric=numeric;/*returnthetype*/publicStringgetType()returntype;/*paramtypethetypetoset*/publicvoidsetType(Stringtype)this.type=type;如果里面的函數(shù)名不清楚的話,網(wǎng)上找APN設(shè)置,一大堆的資料3.主界面里的代碼為:publicclassApnNewextendsActivityprivateButtonsetbtn;privateButton

41、insertbtn;privateButtonapnexist;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.apnnew);setbtn=(Button)this.findViewById(R.id.setApn);setbtn.setOnClickListener(setlis);insertbtn=(Button)this.findViewById(R.id.insertApn);insertbtn.setOnCl

42、ickListener(insertlis);apnexist=(Button)this.findViewById(R.id.Apnexist);apnexist.setOnClickListener(existlis);privateOnClickListenersetlis=newOnClickListener()OverridepublicvoidonClick(Viewv)setCmwapAPN();privateOnClickListenerinsertlis=newOnClickListener()OverridepublicvoidonClick(Viewv)InsetAPN()

43、;if(apnd_id!=0)Toast.makeText(ApnNew.this,String.valueOf(apnd_id),Toast.LENGTH_SHORT).show();elseToast.makeText(ApnNew.this,insertAPNisunsuccess,Toast.LENGTH_SHORT).show();privateOnClickListenerexistlis=newOnClickListener()OverridepublicvoidonClick(Viewv)intri=checkAPN();if(ri=-1)Toast.makeText(ApnN

44、ew.this,不存在此APN,Toast.LENGTH_SHORT).show();elseToast.makeText(ApnNew.this,存在此APN,Toast.LENGTH_SHORT).show();/*入口*設(shè)置指定的APN接入點(diǎn)*/publicvoidsetCmwapAPN()tryif(!isCmwap()intnet_type=getNetWorkType();m_oldNetWorkType=net_type;if(phoneSettedApnID=checkAPN()!=-1)SetDefaultAPN(phoneSettedApnID);elseInsetAPN(

45、);SetDefaultAPN(apnd_id);Thread.sleep(8000L);catch(Exceptione)Log.i(setCmwapAPNerror,e.getMessage();privateintapnd_id=0;intm_oldApnId=-1;intm_oldNetWorkType=-1;privateintphoneSettedApnID=-1;/當(dāng)前APNidprivatestaticfinalUriAPN_TABLE_URI=Uri.parse(content:/telephony/carriers);privatestaticfinalUriPREFERR

46、ED_APN_URI=Uri.parse(content:/telephony/carriers/preferapn);privateStringgetMCC()TelephonyManagertm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);Stringnumeric=tm.getSimOperator();Stringmcc=numeric.substring(0,3);Log.i(MCCis,mcc);returnmcc;privateStringgetMNC()TelephonyManagertm=(Tel

47、ephonyManager)getSystemService(Context.TELEPHONY_SERVICE);Stringnumeric=tm.getSimOperator();Stringmnc=numeric.substring(3,numeric.length();Log.i(MNCis,mnc);returnmnc;privateStringgetSimOperator()TelephonyManagertm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);StringSimOperator=tm.get

48、SimOperator();returnSimOperator;publicApnNodegetDefaultAPN()Stringid=;Stringapn=;Stringproxy=;Stringname=;Stringport=;Stringtype=;Stringmcc=;Stringmnc=;Stringnumeric=;ApnNodeapnNode=newApnNode();/Uriuri=Uri.parse(content:/telephony/carriers/preferapn);CursormCursor=getContentResolver().query(PREFERR

49、ED_APN_URI,null,null,null,null);if(mCursor=null)/thrownewException(Nonpreferapnexist);returnnull;while(mCursor!=null&mCursor.moveToNext()id=mCursor.getString(mCursor.getColumnIndex(_id);name=mCursor.getString(mCursor.getColumnIndex(name);apn=mCursor.getString(mCursor.getColumnIndex(apn).toLowerCase(

50、);proxy=mCursor.getString(mCursor.getColumnIndex(proxy);port=mCursor.getString(mCursor.getColumnIndex(port);mcc=mCursor.getString(mCursor.getColumnIndex(mcc);mnc=mCursor.getString(mCursor.getColumnIndex(mnc);numeric=mCursor.getString(mCursor.getColumnIndex(numeric);Log.d(getDefaultAPN,defaultApninfo

51、:+id+_+name+_+apn+_+proxy+_+proxy);phoneSettedApnID=Integer.valueOf(id);apnNode.setName(name);apnNode.setApn(apn);apnNode.setProxy(proxy);apnNode.setPort(port);apnNode.setMcc(mcc);apnNode.setMnc(mnc);apnNode.setNumeric(numeric);returnapnNode;publicbooleanisCurretApn()ApnNodeapnNode=newApnNode();apnN

52、ode.setName(中國(guó)電信CTNET);apnNode.setApn(ctnet);apnNode.setProxy(00);apnNode.setPort(80);apnNode.setMcc(getMCC();apnNode.setMnc(getMNC();apnNode.setNumeric(getSimOperator();ApnNodecheckApn=getDefaultAPN();if(apnNode.getApn().equals(checkApn.getApn()&apnNode.getMcc().equals(checkApn.getMcc()&apnNode.get

53、Mnc().equals(checkApn.getMnc()&apnNode.getNumeric().equals(checkApn.getNumeric()&(checkApn.getType()=null|default.equals(checkApn.getType()|.equals(checkApn.getType()/|(apnNode.getApn().equals(checkApn.getApn()&checkApn.getProxy().equals()&checkApn.getPort().equals()returntrue;m_oldApnId=phoneSetted

54、ApnID;returnfalse;/*獲得網(wǎng)絡(luò)連接管理*return*/privateConnectivityManagergetConnectManager()ConnectivityManagerm_ConnectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);returnm_ConnectivityManager;/*獲得當(dāng)前聯(lián)網(wǎng)類型wifiormobile*return*/privateintgetNetWorkType()if(getConnectManager()!=

55、null)NetworkInfonetworkInfo=getConnectManager().getActiveNetworkInfo();if(networkInfo!=null)returnnetworkInfo.getType();return-1;elsereturn-1;privatebooleanisCmwap()intnet_type=getNetWorkType();if(net_type=ConnectivityManager.TYPE_MOBILE)returnisCurretApn();elseif(net_type=ConnectivityManager.TYPE_W

56、IFI)returnfalse;returnfalse;publicbooleansetDefaultApn(intapnId)booleanres=false;ContentResolverresolver=getContentResolver();ContentValuesvalues=newContentValues();values.put(apn_id,apnId);tryresolver.update(PREFERRED_APN_URI,values,null,null);Cursorc=resolver.query(PREFERRED_APN_URI,newStringname,

57、apn,_id=+apnId,null,null);if(c!=null)res=true;c.close();catch(SQLExceptione)returnres;publicvoidSetDefaultAPN(intid)setDefaultApn(id);ConnectivityManagercm=(ConnectivityManager)this.getSystemService(CONNECTIVITY_SERVICE);cm.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,*);Cursorcursor=get

58、ContentResolver().query(PREFERRED_APN_URI,null,null,null,null);introws=cursor.getCount();cursor.moveToFirst();Stringapn;for(inti=0;irows;i+)apn=cursor.getString(1);Log.e(-,apn);cursor.moveToNext();/檢查指定APN是否存在publicintcheckAPN()ApnNodecheckApn=newApnNode();checkApn.setName(中國(guó)電信ctnet);checkApn.setApn

59、(ctnet);checkApn.setMcc(getMCC();checkApn.setMnc(getMNC();checkApn.setNumeric(getSimOperator();returnisApnExisted(checkApn);publicintisApnExisted(ApnNodeapnNode)intapnId=-1;/Uriuri=Uri.parse(content:/telephony/carriers/);CursormCursor=getContentResolver().query(APN_TABLE_URI,null,null,null,null);whi

60、le(mCursor!=null&mCursor.moveToNext()apnId=mCursor.getShort(mCursor.getColumnIndex(_id);Stringname=mCursor.getString(mCursor.getColumnIndex(name);Stringapn=mCursor.getString(mCursor.getColumnIndex(apn);Stringtype=mCursor.getString(mCursor.getColumnIndex(type);Stringproxy=mCursor.getString(mCursor.ge

溫馨提示

  • 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)論