3

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

谢谢。

4

2 回答 2

11

您可以使用 uri 以编程方式查询和设置首选 APN content://telephony/carriers/preferapn。要设置新的首选 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。有关一些相关链接,请参阅此问题。在API 页面上,它现在明确声明此权限不供外部使用,并且在内部强制执行。

于 2011-10-23T21:35:05.437 回答
0

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

于 2011-10-23T16:52:06.817 回答