[DESCRIPTION]
如果有需要在apns-conf中配置一个新的read_only字段,并使其生效,比如使得APN不可被编辑。可以最如下的修改。
[SOLUTION]
一、使新添加的字段能成功的读取到telephony.db数据库中
1、TelephonyProvider.java文件中的createCarriersTable方法中添加如下代码:
372 EDITED + " INTEGER DEFAULT " + UNEDITED + "," +
373 USER_VISIBLE + " BOOLEAN DEFAULT 1);";
修改为:
372 EDITED + " INTEGER DEFAULT " + UNEDITED + "," +
READ_ONLY + " BOOLEAN DEFAULT 0," + //添加这一句
373 USER_VISIBLE + " BOOLEAN DEFAULT 1);";
2、Telephony.java中添加如下一句:
3558 public static final String USER_VISIBLE = "user_visible";
@hide //参照USER_VISIBLE ,不能忽略hide
public static final String READ_ONLY = "read_only"; //添加这句
3、在TelephonyProvider.java文件中的getRow()方法中添加如下代码
1293 addBoolAttribute(parser, "carrier_enabled", map, CARRIER_ENABLED);
1294 addBoolAttribute(parser, "modem_cognitive", map, MODEM_COGNITIVE);
1295 addBoolAttribute(parser, "user_visible", map, USER_VISIBLE);
++ addBoolAttribute(parser, "read_only", map, READ_ONLY); //添加这一句
二、从数据库中读取出对应字段,并判断
1、ApnSettings.java中添加如下静态常量
102 private static final int SOURCE_TYPE_INDEX = 6;
++ private static final int READ_ONLY_INDEX = 7;
2、filllist()方法中修改查询条件
361 Cursor cursor = getContentResolver().query(
362 Telephony.Carriers.CONTENT_URI,
363 new String[] { "_id", "name", "apn", "type", "mvno_type", "mvno_match_data",
364 "sourcetype" }, where, null, order);
修改为:
Cursor cursor = getContentResolver().query(
Telephony.Carriers.CONTENT_URI,
new String[] { "_id", "name", "apn", "type", "mvno_type", "mvno_match_data",
"sourcetype", "read_only" }, where, null, order);
3、根据数据库中读取的值,修改APN能否被编辑的判断条件
414 /// M: for [Read Only APN]
415 pref.setApnEditable(mApnExt.isAllowEditPresetApn(type, apn, mccmnc, sourcetype));
修改为:
boolean isEdit = mApnExt.isAllowEditPresetApn(type, apn, mccmnc, sourcetype); //true 表示允许编辑
boolean isReadOnly = cursor.getInt(READ_ONLY_INDEX) < 1; //true表示允许编辑
pref.setApnEditable(isEdit && isReadOnly);