Android - 处理不断变化的 apn 连接

标签 android connection apn

我想知道 Android 是如何做到这一点的。

示例:

  1. WAP Push 表示传入的彩信。
  2. 将 APN 更改为 MMS。
  3. 下载彩信。
  4. 将连接恢复到默认 APN。

那么这个APN的变化是如何完成的呢?

为什么: 我想使用其他 APN 连接到互联网,而不是默认或 MMS APN。

最佳答案

以下 Activity 解决了您更改默认 APN 的问题,而不是恢复为原始状态。

package com.slk.apnapp;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;

public class NewAPNActivity extends Activity {
/*
 * Information of all APNs Details can be found in
 * com.android.providers.telephony.TelephonyProvider
 */
public static final Uri APN_TABLE_URI = Uri
        .parse("content://telephony/carriers");
/*
 * Information of the preferred APN
 */
public static final Uri PREFERRED_APN_URI = Uri
        .parse("content://telephony/carriers/preferapn");
private static final String TAG = "CHANGE_APN";
public static final String NEW_APN = "NewAPN";

private int getDafaultAPN() {
    Cursor c = this.getContentResolver().query(PREFERRED_APN_URI,
            new String[] { "_id", "name" }, null, null, null);
    int id = -1;
    if (c != null) {
        try {
            if (c.moveToFirst())
                id = c.getInt(c.getColumnIndex("_id"));
        } catch (SQLException e) {
            Log.d(TAG, e.getMessage());
        }
        c.close();
    }
    return id;

}

/*
 * Set an apn to be the default apn for web traffic Require an input of the
 * apn id to be set
 */
public boolean setDefaultAPN(int id) {
    boolean res = false;
    ContentResolver resolver = this.getContentResolver();
    ContentValues values = new ContentValues();

    // See /etc/apns-conf.xml. The TelephonyProvider uses this file to
    // provide
    // content://telephony/carriers/preferapn URI mapping
    values.put("apn_id", id);
    try {
        resolver.update(PREFERRED_APN_URI, values, null, null);
        Cursor c = resolver.query(PREFERRED_APN_URI, new String[] { "name",
                "apn" }, "_id=" + id, null, null);
        if (c != null) {
            res = true;
            c.close();
        }
    } catch (SQLException e) {
        Log.d(TAG, e.getMessage());
    }
    return res;
}

private int checkNewAPN() {
    int id = -1;
    Cursor c = this.getContentResolver().query(APN_TABLE_URI,
            new String[] { "_id", "name" }, "name=?",
            new String[] { NEW_APN }, null);
    if (c == null) {
        id = -1;
    } else {
        int record_cnt = c.getCount();
        if (record_cnt == 0) {
            id = -1;
        } else if (c.moveToFirst()) {
            if (c.getString(c.getColumnIndex("name")).equalsIgnoreCase(
                    NEW_APN)) {
                id = c.getInt(c.getColumnIndex("_id"));
            }
        }
        c.close();
    }
    return id;
}

public int addNewAPN() {
    int id = -1;
    ContentResolver resolver = this.getContentResolver();
    ContentValues values = new ContentValues();
    values.put("name", NEW_APN);
    values.put("apn", NEW_APN);

    /*
     * The following three field values are for testing in Android emulator
     * only The APN setting page UI will ONLY display APNs whose 'numeric'
     * filed is TelephonyProperties.PROPERTY_SIM_OPERATOR_NUMERIC. On
     * Android emulator, this value is 310260, where 310 is mcc, and 260
     * mnc. With these field values, the newly added apn will appear in
     * system UI.
     */
    values.put("mcc", "310");
    values.put("mnc", "260");
    values.put("numeric", "310260");

    Cursor c = null;
    try {
        Uri newRow = resolver.insert(APN_TABLE_URI, values);
        if (newRow != null) {
            c = resolver.query(newRow, null, null, null, null);

            // Obtain the apn id
            int idindex = c.getColumnIndex("_id");
            c.moveToFirst();
            id = c.getShort(idindex);
            Log.d(TAG, "New ID: " + id + ": Inserting new APN succeeded!");
        }
    } catch (SQLException e) {
        Log.d(TAG, e.getMessage());
    }

    if (c != null)
        c.close();
    return id;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    int id = checkNewAPN();
    int default_id = getDafaultAPN();

    if (id == -1) {
        id = addNewAPN();
    }

    if (setDefaultAPN(id)) {
        Log.i(TAG, NEW_APN
                + " set new default APN successfully and Default id is "
                + id);
    }
    if (setDefaultAPN(default_id)) {
        Log.i(TAG,
                NEW_APN
                        + " set previous default APN successfully and Default id is "
                        + default_id);
    }

}
}

关于Android - 处理不断变化的 apn 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575717/

相关文章:

java.rmi.ConnectException : Connection refused to host: 异常

c# - 使用 C# 与 ASPX 网站的 MYSQL 数据库连接

android - 通过蓝牙将 Android Wear watch 和 Raspberry Pi 配对

android - onLayoutChange() 未调用

azure - 如何通过 Terraform 部署状态为 'connected' 的 Azure API 连接

java - 无法从我的应用程序连接到 IMS apn

android - 当前使用的 APN?

应用计费中的 Android 市场 - 新信用卡失败,然后好吗?

android - 手机重启后谷歌地图应用程序崩溃

sim-card - 如何根据网络提供商自动设置 APN?