Android - управление изменением соединения apn - PullRequest
4 голосов
/ 20 декабря 2011

Мне было интересно, как Android это делает.

Пример :

  1. WAP Push указывает входящее MMS.
  2. Изменить APNв MMS.
  3. Скачать MMS.
  4. Восстановление подключения к APN по умолчанию.

Итак, как осуществляется это изменение APN?

Почему : я хочу использовать другой APN для подключения к Интернету вместо стандартного или MMS-APN.

1 Ответ

6 голосов
/ 09 марта 2012

Следующее действие решает вашу проблему изменения 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);
    }

}
}
...