一、关于APN
1、Android的APN(Access Point Name)数据预置在/system/etc/apns-conf.xml中:
2、源码:apns-conf.xml来自apns-full-conf.xml,编译系统的时候Copy到/system/etc/目录下:
-
PRODUCT_COPY_FILES += -
device/sample/etc/apns-full-conf.xml:system/etc/apns-conf.xml

二、APN加载过程
1、系统检查到SIM卡正常后从/system/etc/apns-conf.xml解析数据,存放到数据库:telephony.db
-
/data/data/com.android.providers.telephony/databases/telephony.db -
sqlite> select * from carriers where numeric='46001'; -
1113|China Unicom 3G|46001|460|01|3gnet|||||80||||-1|default,supl|1|IP|IP|1|0|| -
1114|中国联通 3g 彩信 (China Unicom)|46001|460|01|3gwap||||||10.0.0.172|80|http://mmsc.myuni.com.cn|-1|mms|1|IP|IP|1|0|| -
1115|China Unicom MMS|46001|460|01|uniwap||||||10.0.0.172|80|
telephony.db数据库的建立对应TelephonyProvider.java文件:
-
packages\providers\telephonyprovider\src\com\android\providers\telephony\TelephonyProvider.java -
public class TelephonyProvider extends ContentProvider{ -
private static final String DATABASE_NAME = "telephony.db"; -
private static class DatabaseHelper extends SQLiteOpenHelper { -
public DatabaseHelper(Context context) { -
super(context, DATABASE_NAME, null, getVersion(context)); -
mContext = context; -
} -
@Override -
public void onCreate(SQLiteDatabase db) { -
// Set up the database schema -
db.execSQL("CREATE TABLE " + CARRIERS_TABLE + -
"(_id INTEGER PRIMARY KEY," + -
"name TEXT," + -
"numeric TEXT," + -
"mcc TEXT," + -
"mnc TEXT," + -
"apn TEXT," + -
"user TEXT," + -
"server TEXT," + -
"password TEXT," + -
"proxy TEXT," + -
"port TEXT," + -
"mmsproxy TEXT," + -
"mmsport TEXT," + -
"mmsc TEXT," + -
"authtype INTEGER," + -
"type TEXT," + -
"current INTEGER," + -
"protocol TEXT," + -
"roaming_protocol TEXT," + -
"carrier_enabled BOOLEAN," + -
"bearer INTEGER," + -
"mvno_type TEXT," + -
"mvno_match_data TEXT);"); -
initDatabase(db); -
} -
private void initDatabase(SQLiteDatabase db) { -
// Read internal APNS data -
// Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system". -
File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH); -
loadApns(db, confparser); -
} -
} -
}
2、检索APN,根据MCC、MNC的值组合(46001)来查询telephony.db数据库:
http://www.gpsspg.com/bs/mnc.htm

-
frameworks\opt\telephony\src\java\com\android\internal\telephony\dataconnection\DcTracker.java -
/** -
* Based on the sim operator numeric, create a list for all possible -
* Data Connections and setup the preferredApn. -
*/ -
private void createAllApnList() { -
mAllApnSettings = new ArrayList<ApnSetting>(); -
IccRecords r = mIccRecords.get(); -
// getOperatorNumeric()返回MCC+MNC的组合值 -
String operator = (r != null) ? r.getOperatorNumeric() : ""; -
if (operator != null) { -
String selection = "numeric = '" + operator + "'"; -
// query only enabled apn. -
// carrier_enabled : 1 means enabled apn, 0 disabled apn. -
selection += " and carrier_enabled = 1"; -
if (DBG) log("createAllApnList: selection=" + selection); -
Cursor cursor = mPhone.getContext().getContentResolver().query( -
Telephony.Carriers.CONTENT_URI, null, selection, null, null); -
if (cursor != null) { -
Rlog.e(LOG_TAG, "cursor != null"); -
Rlog.e(LOG_TAG, "cursor.getCount(): " + cursor.getCount()); -
if (cursor.getCount() > 0) { -
mAllApnSettings = createApnList(cursor); -
} -
cursor.close(); -
} -
} -
}
这样,在Setting界面就可以看到设备的APN信息;若APN缺少,4G、3G等移动网络异常!
转自: https://blog.youkuaiyun.com/u013686019/article/details/51283594
本文详细介绍了Android系统中APN(Access Point Name)的配置文件位置、加载过程及数据库存储方式,并展示了如何根据SIM卡运营商信息查询合适的APN设置。
3287

被折叠的 条评论
为什么被折叠?



