现在开发的系统是和电信合作的,使用电信手机,走的不是普通的互联网,而是电信开辟的专网,其实也就是在联网的时候换个电信的特殊账号而已。大家知道,电信手机默认的net接入点“中国电信互联网设置CTNET”的用户是[email protected]密码是ctnet,也可以使用card/card这个账号。使用这个连接后可以访问互联网。现在我们的项目,电信给我们开辟新的账号:[email protected]。我的做法是 在程序启动时,通过代码新建apn,然后设置首选项为当前建立的。这样一旦成功,就可以直接通过socket连接专网了。关于建立apn的代码,都和网上介绍的差不多,先插入“content://telephnoy/carriers”指向的数据库,然后设置"content://telephony/carriers/preferapn"指向的首选项,最后使用开源代码类NetworkConnectivityListener类监听拨号是否成功。现在问题是,同样的代码在android2.1系统手机上是可以连接网络的,在android2.2及2.3无论如何都连接不上,看了android2.2和2.3的源码,主要看了ConnectivityService.java类,也是一头雾水啊,从日志中观察,结果如下:从日志里可以看到标签为“ConnectivityService”和“MobileDataStateTracker”的项。
 
当在apn接入点里选择系统自带的接入点入“中国电信互联网设置CTNET”的时候,马上能够连接互联网,log会打印如下相关信息:
D/ConnectivityService(  110): ConnectivityChange for mobile: CONNECTED/CONNECTED
D/ConnectivityService(  110): adding dns 61.132.163.68 for mobile
D/ConnectivityService(  110): adding dns 202.102.213.68 for mobile
D/ConnectivityService(  110): ConnectivityChange for mobile: DISCONNECTED/DISCONNECTED

系统监听成功,还设置dns。对比2.1系统,似乎没有设置dns的过程,2.1系统在这2个类里源码就有区别的。
 
但是选择自己建立的接入点时会一直打印:
D/ConnectivityService(  110): Doing network teardown
D/ConnectivityService(  110): ConnectivityChange for mobile: DISCONNECTED/DISCONNECTED
D/ConnectivityService(  110): getMobileDataEnabled returning true
D/ConnectivityService(  110): ConnectivityChange for mobile: CONNECTING/CONNECTING
W/InputManagerService(  110): Got RemoteException sending setActive(false) notification to pid 199 uid 10000
D/ConnectivityService(  110): ConnectivityChange for mobile: DISCONNECTED/DISCONNECTED
D/ConnectivityService(  110): getMobileDataEnabled returning true
D/ConnectivityService(  110): ConnectivityChange for mobile: CONNECTING/CONNECTING
D/ConnectivityService(  110): ignoring stopUsingNetworkFeature - not a live request
D/ConnectivityService(  110): ConnectivityChange for mobile: DISCONNECTED/DISCONNECTED
D/ConnectivityService(  110): getMobileDataEnabled returning true
。。
 
似乎必须使用电信自带的用户名和密码才能连接网络,其他账号就是连接不上。求各位大牛,看下有没有做过在android2.2或2.3系统,自己建立apn连接网络的项目,给指点下,万分感激!