![AndroidAPN開發(fā)流程分析知識講解_第1頁](http://file4.renrendoc.com/view/9feacc559186b9b236f383133eb2a880/9feacc559186b9b236f383133eb2a8801.gif)
![AndroidAPN開發(fā)流程分析知識講解_第2頁](http://file4.renrendoc.com/view/9feacc559186b9b236f383133eb2a880/9feacc559186b9b236f383133eb2a8802.gif)
![AndroidAPN開發(fā)流程分析知識講解_第3頁](http://file4.renrendoc.com/view/9feacc559186b9b236f383133eb2a880/9feacc559186b9b236f383133eb2a8803.gif)
![AndroidAPN開發(fā)流程分析知識講解_第4頁](http://file4.renrendoc.com/view/9feacc559186b9b236f383133eb2a880/9feacc559186b9b236f383133eb2a8804.gif)
![AndroidAPN開發(fā)流程分析知識講解_第5頁](http://file4.renrendoc.com/view/9feacc559186b9b236f383133eb2a880/9feacc559186b9b236f383133eb2a8805.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。AndroidAPN開發(fā)流程分析-AndroidAPN開發(fā)流程分析2DataConnect流程分析Android的數(shù)據(jù)連接是基于PPP方式的,主要步驟為:首先通過AT命令激活PDP連接,然后利用pppd通過數(shù)據(jù)端口完成撥號連接;數(shù)據(jù)連接的核心控制類是DataConnectionTracker,存在于GSMPhone里,數(shù)據(jù)連接不需要用戶的干預(yù),在APN設(shè)置好之后,在適當(dāng)?shù)那闆r下就會自動激活,激活的入口點是:DataConnectionTracker.trySetupDatasetupDataPdpCon
2、nection.connetcCommandsInterface.setupDefaultPDP,通過PdpConnection訪問GSMPhone中的RIL層的setupDefaultPDP實現(xiàn),setupDefaultPDP的結(jié)果由EVENT_SETUP_PDP_DONE返回,如果成功,則開始調(diào)用pppd完成實際連接,這是通過DataLink.connect實現(xiàn)的;DataLink只是抽象基類,此處它的實現(xiàn)類是PppLink,實現(xiàn)DataLinkInterface接口,所以DataLink.connect實際上調(diào)用PppLink.connect,它通過SystemService.start
3、(SERVICE_PPPD_GPRS)開始pppd服務(wù),并通過checkPPP函數(shù)訪問Linux的sys文件系統(tǒng)來查詢pppd的連接狀態(tài),如果成功,便可以將LINKUP的消息通知出去以完成連接流程。2DataConnect流程分析Android的數(shù)據(jù)連接是基于PPP方式的,主要步驟為:首先通過AT命令激活PDP連接,然后利用pppd通過數(shù)據(jù)端口完成撥號連接;數(shù)據(jù)連接的核心控制類是DataConnectionTracker,存在于GSMPhone里,數(shù)據(jù)連接不需要用戶的干預(yù),在APN設(shè)置好之后,在適當(dāng)?shù)那闆r下就會自動激活,激活的入口點是:DataConnectionTracker.trySetu
4、pDatasetupDataPdpConnection.connetcCommandsInterface.setupDefaultPDP,通過PdpConnection訪問GSMPhone中的RIL層的setupDefaultPDP實現(xiàn),setupDefaultPDP的結(jié)果由EVENT_SETUP_PDP_DONE返回,如果成功,則開始調(diào)用pppd完成實際連接,這是通過DataLink.connect實現(xiàn)的;DataLink只是抽象基類,此處它的實現(xiàn)類是PppLink,實現(xiàn)DataLinkInterface接口,所以DataLink.connect實際上調(diào)用PppLink.connect,它通
5、過SystemService.start(SERVICE_PPPD_GPRS)開始pppd服務(wù),并通過checkPPP函數(shù)訪問Linux的sys文件系統(tǒng)來查詢pppd的連接狀態(tài),如果成功,便可以將LINKUP的消息通知出去以完成連接流程。3.3RILD源碼分析RIL對對消息的處理是將消息通過LocalSocket發(fā)送到以rild為名稱的有名端口。這個有名Socket的創(chuàng)建在ril.cpp代碼中。s_fdListen=android_get_control_socket(SOCKET_NAME_RIL)RILD是守護進程,執(zhí)行的過程為:獲取參數(shù)打開功能庫建立事件循環(huán)執(zhí)行RIL_InitRIL_r
6、egister;事件循環(huán)式核心,通過Select多路復(fù)用機制,讀取來自上層的Socket接口的具體操作命令,同時一些命令Timeout喚醒機制,也通過Select實現(xiàn);1.Request流程命令下發(fā)流程:首先從JAVA層通過Socket將命令發(fā)送到RIL層的RILD守護進程,RILD中負責(zé)監(jiān)聽的ril_event_loop消息循環(huán)中的Select發(fā)現(xiàn)RILDSocket有了請求連接信號,建立一個record_stream,打通與上層的數(shù)據(jù)通道并開始接收請求數(shù)據(jù),數(shù)據(jù)通道的回調(diào)函數(shù)processCommandsCallback()會保證收到一個完整的Request后,將其送達processCom
7、mandBuffer()函數(shù);解析過程: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號為基礎(chǔ)采用表驅(qū)動方式分發(fā)請求,CommandInfo結(jié)構(gòu)表示命令的信息,關(guān)聯(lián)了Request號和實際的請求函數(shù),以及響應(yīng)函數(shù)之間的關(guān)系;分發(fā)流程:s_callback.onRequest()完成分發(fā)操作,s_callback獲取自libreference-ril的RIL_RadioFunction結(jié)構(gòu)指針,Request請求在這里轉(zhuǎn)入底層的libreference-ril處理,handler是reference-ril.cpp中的Request。onRequest根據(jù)Request號進行簡單的switch分發(fā),然后將命令和參數(shù)轉(zhuǎn)換成對應(yīng)的AT命令,由writeline()完
9、成驅(qū)動層的發(fā)送,writeline通過驅(qū)動程序節(jié)點的文件描述符進行寫操作實現(xiàn)控制。2.Response流程Response有兩類:unsolicited表示主動上報的消息,如來電,來短信等,而solicited是AT命令的響應(yīng),判斷是否是solicited的依據(jù)有兩點:一是當(dāng)前用AT命令正在等待響應(yīng);二是讀取的響應(yīng)符合該AT命令的響應(yīng)格式。對于Response流程來講,流程是從Modem設(shè)備發(fā)回響應(yīng)數(shù)據(jù)開始的。RIL通過readerLoop函數(shù),利用readline逐行讀取響應(yīng)數(shù)據(jù),隨后通過processLine進行分析,主動上報的一般以+XXXX的形式出現(xiàn),而AT命令的響應(yīng)格式則有一行或多行
10、之分,但最終一定以O(shè)K或者ERROR結(jié)尾,于是PrcessLine有以下幾種情況:1)、沒有AT命令等待響應(yīng)或不符合AT響應(yīng)格式,一般是主動上報行,由handleUnsolicited處理,handleUnsolicitedonUnsolicetdRIL_onUnsolicitedResponse;2)、isFinalResponseSucess/isFinalResponseError是最終響應(yīng)行,轉(zhuǎn)到handleFinalResponse處理,handleFInalResponse會發(fā)送線程同步信號,激活等到的發(fā)送線程;3)、符合當(dāng)前AT命令響應(yīng)格式的行,解析并獲取數(shù)據(jù),這是響應(yīng)處理的中間
11、過程,然后繼續(xù)收到最終響應(yīng)行,然后進入2)流程最后的發(fā)送動作由sendResponsesendResponseRawblockingWrite通過Socket回傳給上層來完成,響應(yīng)解析由上層完成。AndroidMMS源碼流程(一)2010-06-2508:21概述MMS的收發(fā)操作借助于手機的短信機制,實際收發(fā)過程需要網(wǎng)絡(luò)的APN支持,使用特定的APN接入點實現(xiàn)MMS數(shù)據(jù)的真實發(fā)送和接收;源碼流程1)Telephpony.javagetOrCreateThreadId()函數(shù):目錄:frameworksbasecorejavaandroidprovider說明:這個函數(shù)根據(jù)接收者列表和未保存的消
12、息返回一個線程ID,如果這個消息開始一個新的線程,那么函數(shù)分配一個線程ID,否則返回一個適當(dāng)?shù)囊呀?jīng)存在的線程ID;2)MmsMessageSender.javasendMessage()函數(shù):目錄:packagesappsmmssrccomandroidmmstransaction說明:對Mms進行封包3)再一次調(diào)用第一步函數(shù)4)ConnectivityService.javastartUsingNetworkFeature()函數(shù):目錄:frameworkbaseservicesjavacomandroidserver說明:該函數(shù)為實現(xiàn)Mms網(wǎng)絡(luò)連接的關(guān)鍵函數(shù),下面我們詳細分析:A、enfo
13、rceChangePermission():判斷調(diào)用的進程是否具有操作權(quán)限,如果不具有,拋出一個SecurityException異常,并強制準(zhǔn)許權(quán)限B、ConnectivityManager.isNetworkTypeValid(networkType)來判斷networkType是否合法,如果不合法返回一個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)變化的時候,發(fā)送廣播intents3、當(dāng)一個網(wǎng)絡(luò)連接丟失之后,嘗試連接另一個網(wǎng)絡(luò)4、為App提供粗粒度、細粒度的有效網(wǎng)絡(luò)狀態(tài)查詢C、FeatureUserf=newFeatureUser(networkType,feature,binder);新建一個FeatureUser類變量,該類實現(xiàn):當(dāng)調(diào)用進程died時發(fā)送一個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里:每個子類保持跟蹤一個網(wǎng)絡(luò)接口的連接狀態(tài),一個網(wǎng)絡(luò)的狀態(tài)信息由一個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,如果不包含就添加進去H、mHandler.sendMessageDelayed(mHandler.obtainMessage(N
18、etworkStateTracker.EVENT_RESTORE_DEFAULT_NETWORK,f),getRestoreDefaultNetworkDelay();消息發(fā)送,問題:消息的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ā)一個重新連接,直到網(wǎng)絡(luò)狀態(tài)變成isConnected;Andro
20、idMMS源碼流程(二)2010-06-2508:215)接下來的操作存在于DataConnectionTracker.java里:publicsynchronizedintenableApnType(Stringtype):該函數(shù)確保用指定的類型連接APN,成功返回APN_ALREADY_ACTIVE或者APN_REQUEST_STARTEDprivatevoidsetEnabled(intid,booleanenable):發(fā)送EVENT_ENABLE_NEW_APN事件protectedsynchronizedvoidonEnableApn(intapnId,intenabled)該實例
21、主要功能是判斷目前是enable還是disableAPN,如果是enable的話,調(diào)用onEnableNewApn();實現(xiàn)enableAPN,如果是disable的話,根據(jù)enabledCount,onCleanUpConnection關(guān)閉APN或者改為默認連接6)publicvoidhandleMessage(Messagemsg),ConnectivityService.java里進入到對事件EVENT_STATE_CHANGED的處理,state=CONNECTED,old=CONNECTING,reason=apnChanged,apnTypeList=mms,應(yīng)該是最后調(diào)用了han
22、dleConnect(info);發(fā)送一個廣播事件7)MobileDataStateTracker.java:MobileDataStateReceiver類的publicvoidonReceive(Contextcontext,Intentintent)函數(shù)里處理caseCONNECTED處理;調(diào)用setDetailedState(NetworkStateTracker類實例)發(fā)送了EVENT_STATE_CHANGED事件8)然后又跳回ConnectivityService.java里的handleMessage函數(shù)EVENT_STATE_CHANGED事件的CONNECTED狀態(tài)處理9)
23、handleConnect里最后調(diào)用updateNetworkSettings(實現(xiàn)在NetworkStateTracker類里),并發(fā)送sendConnectedBroadcast(info);廣播事件10)ConnectivityService.javahandleDnsConfigurationChange配置DNS信息,并在handleConnect函數(shù)調(diào)用addPrivateDnsRoutes添加路由信息11)接下來調(diào)用了GpsLocationProvider.java里的updateNetworkState和runLocked,原因不明?12)接下來返回去調(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ò)連接就建立起來了,下面的步驟是在RILJ層以及RILD層實現(xiàn)數(shù)據(jù)和AT命令與modem的數(shù)據(jù)通信,省去下面分析disableAPN的流程,基本上就是Star
25、t的反過程:1)數(shù)據(jù)通信完畢,SendTransaction.java里的run函數(shù)給出數(shù)據(jù)通信完成之后的狀態(tài)2)stopUsingNetworkFeature()(ConnectivityService實例);這個就是startUsingNetworkFeature的反過程3)disableApnType(mms),DataConnectionTracker類4)setEnabled,DataConnectionTracker類Android平臺中Wifi的初始化收藏1.WIFIJAVAlayer:1.1.當(dāng)android系統(tǒng)啟動WIFI模塊時,它將調(diào)用Wifiserver類的setWifi
26、EnabledBlocking函數(shù)。1.2.在該函數(shù)中,如果是使能WIFI,它將做四件事:a.loadwifidriver.b.啟動wpa_supplicant.c.啟動eventloop.d.更新wifi的狀態(tài).2.WIFINativelayer:2.1.當(dāng)java層調(diào)用loadDriver時,它實際上是通過JNI來調(diào)用Native函數(shù),JNI-android_net_wifi_loadDriver-wifi_load_driver。在wifi_load_driver函數(shù)中,它將首先通過systemproperty-wlan.driver.status的狀態(tài)來判斷驅(qū)動是否已經(jīng)加載。如果沒有加
27、載,將會加載該驅(qū)動。2.2.當(dāng)java層調(diào)用startSupplicant時,它實際上是通過JNI調(diào)用到wifi_start_supplicant函數(shù),在wifi_start_supplicant函數(shù)里,首先確定wpasupplicant的配置文件存在,如果不存在,將默認配置文件拷貝到相應(yīng)目錄下,下面是配置文件的默認路徑和工作路徑: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ù),如果這時wpa_supplicant還沒有啟動,將會啟動wpa_supplicant.2.3.java層通過connectToSupplicant調(diào)用wifi_connect_to_supplicant函數(shù),在該函數(shù)中,將通過wpa_ctrl_open函數(shù)分別創(chuàng)建兩個AF_UNIX地址族和數(shù)據(jù)報方式的socket,一個是ctrl_conn,用于向wpa_supplicant發(fā)送命令并接收response,另一個是monitor_conn,它一直阻塞等待從wpa_supplicant過來的event。最后,通過monitor_c
29、onn向wpa_supplicant發(fā)送命令A(yù)TTACH,用于將自己的socket信息注冊到wpa_supplicant,由于socket是數(shù)據(jù)報方式的,這一步是必須的,對于存在于wpa_supplicant的服務(wù)器端,它是所有客戶端共享的,由于它需要主動向monitor_conn客戶端發(fā)送事件,所以它必須先記錄下該客戶端的詳細信息,wpa_supplicant就可以將EVENT發(fā)向該socket。在完成上面這些操作后,java層會通過jni方式調(diào)用函數(shù)android_net_wifi_waitForEvent(應(yīng)該是起一個線程,在線程里調(diào)用),該函數(shù)會調(diào)用wifi_wait_for_even
30、t,在wifi_wait_for_event函數(shù)里,會阻塞接收從wpa_supplicant模塊傳來的事件,一旦wpa_supplicant模塊有事件發(fā),wifi_wait_for_event接收到后,會將包含事件的buf通過函數(shù)參數(shù)的方式回傳到j(luò)ava層,java收到事件后,再繼續(xù)調(diào)用wifi_wait_for_event函數(shù)進行阻塞等待接收,從而完成一個循環(huán)。2.4.以上的流程完成以后,WIFIjavalayer調(diào)用的WIFInativeapi就和wpa_supplicant進程就建立了聯(lián)系,WIFIjavalayer就可以向wpa_supplicant發(fā)送命令和接收response,并且
31、wpa_supplicant也可以主動向WIFIjavalayer發(fā)送事件了。本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:HYPERLINK/zhaohc_nj/archive/2010/08/30/5849536.aspx/zhaohc_nj/archive/2010/08/30/5849536.aspxandroid新建一個Apn后的數(shù)據(jù)連接的調(diào)試過程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)我新建了一個APN保存信息后,系統(tǒng)發(fā)現(xiàn)APN發(fā)生了改變就會去進行數(shù)據(jù)連接.我查看調(diào)試信息發(fā)現(xiàn)第一次發(fā)送setup_data_call請求后,底層做出了響應(yīng),數(shù)據(jù)連接成功了狀態(tài)為CONNECTED,卻出現(xiàn)了PREFEREDAPNisnull,然后又監(jiān)聽到了Apn發(fā)生了改變,所以就將狀態(tài)改變?yōu)镈ISCONNECTING,接著就發(fā)送一個DEACTIVATE_DATA_CALL的請求要求斷開數(shù)據(jù)連接,然后又發(fā)送一個setup_data_call去進行數(shù)據(jù)連接,第二次就連接成功了并在屏幕上顯示出來了G標(biāo)志.其中讓我非
33、常納悶的是:為什么檢測到兩次APN發(fā)生了改變?當(dāng)?shù)谝淮芜B接狀態(tài)已經(jīng)為CONNECTED了卻又監(jiān)聽到了APN發(fā)生了改變.添加APN網(wǎng)絡(luò)接入點,設(shè)置指定網(wǎng)絡(luò)為默認網(wǎng)絡(luò)收藏網(wǎng)上看了很多資料,再加上自己的理解和探索,終于實現(xiàn)了添加接入點設(shè)置和將當(dāng)前網(wǎng)絡(luò)設(shè)置為自己指定的網(wǎng)絡(luò)接入點。廢話不多說,上源碼,大家分享下:(在moto-xt800,CDMA下進行了測試)1.準(zhǔn)備工作:AndroidManifest。xml文件里添加以下三個權(quán)限設(shè)置:開始上代碼了,很期待吧?2.新建一個類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接入點*/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(中國電信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(中國電信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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 推動高標(biāo)準(zhǔn)辦學(xué)水平提升的實操方案
- 出售叉車門架子合同范例
- 出售塔吊電纜合同范本
- 利于甲方合同范例
- 買賣牛肉合同范本
- 2025年P(guān)LC行業(yè)市場趨勢分析報告
- 出售高欄貨車合同范本
- 農(nóng)村房屋框架購買合同范本
- 2025年度水利工程合同索賠預(yù)防與糾紛處理機制
- 傳媒公司主播簽約合同范本
- 危險物品管理制度
- 門靜脈炎護理課件
- 重慶八中2024屆高三12月高考適應(yīng)性月考卷(四) 語文試卷(含答案)
- 基礎(chǔ)研究成果向臨床轉(zhuǎn)化的實踐與挑戰(zhàn)
- 建筑構(gòu)造(下冊)
- 電流互感器試驗報告
- 蔣中一動態(tài)最優(yōu)化基礎(chǔ)
- 華中農(nóng)業(yè)大學(xué)全日制專業(yè)學(xué)位研究生實踐單位意見反饋表
- 付款申請英文模板
- 七年級英語閱讀理解10篇(附答案解析)
- 抖音來客本地生活服務(wù)酒旅商家代運營策劃方案
評論
0/150
提交評論