首页 > 系统 > Android > 正文

android2.3.5 CDMA/EVDO拨号APN解决方案

2019-10-24 21:07:28
字体:
来源:转载
供稿:网友
google提供的android2.3里面,只能在GSM/WCDMA情况下才能从“设置”->“无线和网络”->“移动网络”->“接入点名称”中选择不同的apn帐号进行拨号连接,而CDMA/EVDO则没有这个功能,接下来本文介绍一些方法实现这个功能,感兴趣的朋友可以了解下
 
google提供的android2.3里面,只能在GSM/WCDMA情况下才能从“设置”->“无线和网络”->“移动网络”->“接入点名称”中选择不同的apn帐号进行拨号连接,而CDMA/EVDO则没有这个功能。最近看了一下代码,简单实现了这个功能。 

1、默认的CDMA/EVDO里面连apn列表都不显示,要先把这个挖出来。 
修改packages/apps/Phone/res/xml/cdma_options.xml 
添加如下内容 
复制代码代码如下:

<PreferenceScreen 
android:key="button_apn_key" 
android:title="@string/apn_settings" 
android:persistent="false"> 
<intent android:action="android.intent.action.MAIN" 
android:targetPackage="com.android.settings" 
android:targetClass="com.android.settings.ApnSettings" /> 
</PreferenceScreen> 

还有development/data/etc/apns-conf.xml的version值改为原来的加1,原因代码里面找。 
2、修改frameworks/base/telephony/java/com/android/internal/telephony/cdma/cdmadataconnectiontracker.java的setupData函数 
复制代码代码如下:

private boolean setupData(String reason) { 
CdmaDataConnection conn = findFreeDataConnection(); 
if (conn == null) { 
if (DBG) log("setupData: No free CdmaDataConnection found!"); 
return false; 

mActiveDataConnection = conn; 
String[] types; 
if (mRequestedApnType.equals(Phone.APN_TYPE_DUN)) { 
types = new String[1]; 
types[0] = Phone.APN_TYPE_DUN; 
} else { 
types = mDefaultApnTypes; 

//mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "", 
// 0, types, "IP", "IP"); 
Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); 
ContentResolver cResolver = phone.getContext().getContentResolver(); 
Cursor cr = cResolver.query(PREFERRED_APN_URI, null, null, null, null); 
cr.moveToFirst(); 
String user = cr.getString(cr.getColumnIndex("user")); 
String pass = cr.getString(cr.getColumnIndex("password")); 
String apn = cr.getString(cr.getColumnIndex("apn")); 
Log.e(LOG_TAG, "get apn : apn=" + apn + ", user=" + user + ", password=" + pass); 
mActiveApn = new ApnSetting(0, "", "", apn, "", "", "", "", "", user, pass, 
, types, "IP", "IP"); 
Message msg = obtainMessage(); 
msg.what = EVENT_DATA_SETUP_COMPLETE; 
msg.obj = reason; 
conn.connect(msg, mActiveApn); 
setState(State.INITING); 
phone.notifyDataConnection(reason); 
return true; 

3、修改frameworks/base/telephony/java/com/android/internal/telephony/cdma/cdmadataconnection.java的onConnect函数: 
复制代码代码如下:

phone.mCM.setupDataCall( 
Integer.toString(RILConstants.SETUP_DATA_TECH_CDMA), 
Integer.toString(dataProfile), 
//null, null, null,  //原来传进拨号的参数都是空的!!! 
cp.apn.apn, cp.apn.user, cp.apn.password, 
Integer.toString(RILConstants.SETUP_DATA_AUTH_PAP_CHAP), 
RILConstants.SETUP_DATA_PROTOCOL_IP, msg); 

4、修改frameworks/base/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java中对ApnSetting的定义,将其成员类型全部设为public

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表