Android APN执行

时间:2011-10-23 15:31:10

标签: android apn enforcement

有人知道是否有一种以编程方式在设备上使用特定定义的APN的方法,而不是默认的APN?

感谢。

2 个答案:

答案 0 :(得分:11)

您可以使用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

更新4.0 +

随着Android 4.0(ICS)的发布,该工具被禁用。启用WRITE_APN_SETTINGS权限对允许您再设置APN没有影响。有关相关链接,请参阅this question。在API page上,它现在明确声明此权限不是外部使用,而是在内部强制执行。

答案 1 :(得分:-1)

我认为有一种方法,即使有一种方式,运营商也可以通过软件更新来消除它。此外,对于像美国的AT& T这样的一些运营商,使用特定的APN提供特定功能,例如获取该用户的订户号(其唯一ID,而不是电话号码)。因此强制进行此更改可能不是一个好主意,因为它会影响手机上安装的众多其他应用程序。