有没有一种程序化的方法可以在设备上使用特定定义的APN,而不是默认的APN?
谢谢。
谢谢。
你可以使用uri content://telephony/carriers/preferapn
编程地查询和设置首选APN。要设置新的首选APN,您必须传递现有APN条目的数据库ID。如果您传入APN的显示名称(例如:setPreferredApn(context,"Giffgaff")
),则以下函数可以执行此操作。
public static final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers");
public static final Uri APN_PREFER_URI = Uri.parse("content://telephony/carriers/preferapn");
public static boolean setPreferredApn(Context context, String name) {
boolean changed = false;
String columns[] = new String[] { Carriers._ID, Carriers.NAME };
String where = "name = ?";
String wargs[] = new String[] {name};
String sortOrder = null;
Cursor cur = context.getContentResolver().query(APN_TABLE_URI, columns, where, wargs, sortOrder);
if (cur != null) {
if (cur.moveToFirst()) {
ContentValues values = new ContentValues(1);
values.put("apn_id", cur.getLong(0));
if (context.getContentResolver().update(APN_PREFER_URI, values, null, null) == 1)
changed = true;
}
cur.close();
}
return changed;
}
我想我应该补充说明,您需要WRITE_APN_SETTINGS权限并且需要导入android.provider.Telephony和android.provider.Telephony.Carriers。
针对Android 4.0以上版本的更新
随着Android 4.0(ICS)的发布,这个功能被禁用了。启用WRITE_APN_SETTINGS权限对于允许您设置APN不再起作用。请参见此问题以获取一些相关链接。在API页面上,现在明确指出此权限不适用于外部使用,并且内部已执行此规定。
我认为没有办法,即使有一种方法,运营商也可以通过软件更新将其清除。此外,对于像美国的AT&T这样的某些运营商,使用特定的APN提供特定的功能,例如获取该用户的订阅者号码(它是唯一的ID,而不是电话号码)。因此,强制进行此更改可能不是一个好主意,因为它将影响到手机上安装的众多其他应用程序。