在使用无线网络的情况下,如果我们并未打开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卡在公司的测试手机上拔来拔去的,希望大家谅解。)