安卓APN强制执行

3
有没有一种程序化的方法可以在设备上使用特定定义的APN,而不是默认的APN?
谢谢。

1
这个回答解决了你的问题吗?使用代码创建网络访问点名称 - James Moore
2个回答

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。

针对Android 4.0以上版本的更新

随着Android 4.0(ICS)的发布,这个功能被禁用了。启用WRITE_APN_SETTINGS权限对于允许您设置APN不再起作用。请参见此问题以获取一些相关链接。在API页面上,现在明确指出此权限不适用于外部使用,并且内部已执行此规定。


感谢您提供的解决方案。这是否意味着在运行此代码后,设备上的所有应用程序都将使用特定的APN? - Paz
是的。这将设置设备首选APN。 - patthoyts
谢谢您!您制作了哪个giffgaff应用程序? - Liam W
嗯,你知道如何创建一个新的APN吗?@patthoyts - Liam W

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接