2011-12-20 14 views
4

私はAndroidがこれをどうやっているのだろうと思っていました。Android - ハンドリングの変更apn接続

  1. WAPプッシュは、着信MMSを示します。
  2. APNをMMSに変更します。
  3. MMSをダウンロードします。
  4. デフォルトのAPNへの接続を復元します。

このAPNの変更はどのように行われますか?

なぜ: 私の代わりに、デフォルトまたはMMS APNをインターネットに接続するために、他のAPNを使用したいです。

+0

https://groups.google.com/group/android-developers/browse_thread/thread/4a4d8fbc87d20c/a7abeb949cd8b3ba?lnk=gst&q=3g+WiFi+simultaneously#a7abeb949cd8b3ba – Jens

+0

@Jens、リンクが応答しません問題ははっきりとわかります。私はこの問題の解決策を探しています。 – webgenius

答えて

6

以下のアクティビティでは、デフォルトの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); 
    } 

} 
} 
+2

Rajさん、あなたのコードが私の問題を解決し、賞金があなたに与えられます。 –

+3

@HiteshPatel:[このリンク](http://blogs.msdn.com/b/zhengpei/archive/2009/10/13/managing-apn-data-in-google-android.aspx)をチェックすることもできます。より良い例です。 :) –

+0

APNの新しいポイントが作成され、デフォルトに設定されます。 既に設定済みで利用可能な企業のAPNに変更するだけで済みますが、デフォルトではありません(これは残っていると思われます)。 変更は社内アプリケーションの開始時に行われ、アプリケーションの電源を切った後、デフォルトのAPNに戻ります。 –