<Android>如何添加3G的APN并设置为默认APN

 

在使用无线网络的情况下,如果我们并未打开wifi的时候,手机会使用到3G网络,当然前提是必须有3G的SIM卡。下面是介绍如何通过代码来添加自定义的APN,并设置为默认的APN(即当前3G上网使用的APN)。

废话不多说,上代码了。

public class YiApnActivity extends Activity {
 
 private static final String TAG = YiApnActivity.class.getCanonicalName();
 
 final String APN_URI = "content://telephony/carriers";                             //apn列表uri
 final String MAIN_APN = "content://telephony/carriers/preferapn";        //主apn的uri
 
 final String MY_APN = "my apn";
 
 int myId = -1;
 int defaultId = -1;
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 
  Button addMyApn = (Button)findViewById(R.id.add_my_apn);
  Button setMyApn = (Button)findViewById(R.id.set_my_apn);
  Button goApn = (Button)findViewById(R.id.go_apn);
  Button defaultApn = (Button)findViewById(R.id.set_default_apn);
 
  OnClickListener listener = new View.OnClickListener() {
  
   @Override
   public void onClick(View v) {
    if (v.getId() == R.id.add_my_apn) {
     if (hasMyApn()) {
      Log.i(TAG, "has my apn:" + myId);
     }else {
      myId = getAPNId();
      Log.i(TAG, "add my apn:" + myId);
     }
    }else
    if (v.getId() == R.id.set_my_apn) {
     if (myId != -1) {
      ContentResolver resolver = getContentResolver();
      Cursor c = resolver.query(Uri.parse(MAIN_APN), null, null, null, null);
      if (c.getCount() > 0) {
       int idIndex = c.getColumnIndex("_id");
       c.moveToFirst();
       defaultId = c.getShort(idIndex);
      }
      Log.i(TAG, "set my apn, default id:" + defaultId);
     
      setMainAPN(myId);
     }
    }else
    if (v.getId() == R.id.go_apn) {
     Intent intent = new Intent(android.content.Intent.ACTION_MAIN);
     intent.setClassName("com.android.settings", "com.android.settings.ApnSettings");
     startActivity(intent);
    }else
    if (v.getId() == R.id.set_default_apn) {
     if (defaultId != -1) {
      Log.i(TAG, "set default id:" + defaultId);
      setMainAPN(defaultId);
     }
    }
   }
  };
 
  addMyApn.setOnClickListener(listener);
  setMyApn.setOnClickListener(listener);
  goApn.setOnClickListener(listener);
  defaultApn.setOnClickListener(listener);
 }

 public void setApn(View v) {
  final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  if (adapter.isEnabled()) {
   adapter.disable();
  } else {
   setMainAPN(getAPNId());
  }
 }

 private int getAPNId() {
  int id = -1;
  ContentValues values = new ContentValues();
  values.put("name", MY_APN);
  values.put("apn", "3gnet");
  values.put("numeric", "46001");
  ContentResolver resolver = getContentResolver();
  Cursor c = null;
  Uri newRow = resolver.insert(Uri.parse(APN_URI), values);
  if (newRow != null) {
   c = resolver.query(newRow, null, null, null, null);
   int idIndex = c.getColumnIndex("_id");
   c.moveToFirst();
   id = c.getShort(idIndex);
  }
  if (c != null) {
   c.close();
  }
  return id;
 }
 
 private void setMainAPN(int id) {
  ContentResolver resolver = getContentResolver();
  ContentValues values = new ContentValues();
  values.put("apn_id", id);
  resolver.update(Uri.parse(MAIN_APN), values, null, null);
 }
 
 private boolean hasMyApn() {
  ContentResolver resolver = getContentResolver();
  Cursor cursor = resolver.query(Uri.parse(APN_URI),  new String[]{"_id", "name"}, null, null, null);
  for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){
   int nameIndex = cursor.getColumnIndex("name");
   int idIndex = cursor.getColumnIndex("_id");
   String name = cursor.getString(nameIndex);
   Log.i(TAG, name);
   if (MY_APN.equals(name)) {
    myId = cursor.getShort(idIndex);
    return true;
   }
  }
  return false;
 }
}

这只是个实例代码,可以给大家提供一些启发。

在hasMyApn() 方法中,有打印所有的APN name,发现Android系统手机在出厂时已经内置了不少APN,但是好像有个属性决定它是否可以在ApnSettings显示,所以进入ApnSettings界面只有几个APN,也有可能是因为SIM卡上APN信息有关联才会显示。

在未插入SIM卡的手机上测试过,发现有的手机没有默认的APN,造成

 ContentResolver resolver = getContentResolver();
 Cursor c = resolver.query(Uri.parse(MAIN_APN), null, null, null, null);

 if (c.getCount() > 0) {
      ......

}

这样的判断,不知道是不是插上SIM卡就会绑定卡上的APN信息并自动设置为默认APN了。(实在懒得拿自己的SIM卡在公司的测试手机上拔来拔去的,希望大家谅解。)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值