您的位置:首页 > 理论基础 > 计算机网络

教你如何开关Android的APN网络

2011-07-13 13:41 316 查看
版权所有,转载请注明来自Mobile Developer (http://mdev.cc ) 作者 : SinFrancis

说明:此程序需要将手机上的数据连接的按钮(下图)打开,才好使。(怎么用程序去打开这个按钮呢?各位大牛请不吝赐教!!!)



由于Android对于APN的网络API没有公开,不过我们可以阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭APN。

大家可以研究一下frameworks/base/core/java/android/provider/Telephony.java这个类,

比较重要的就是 URI 和数据库字段: content://telephony/carriers

字段可以在Telephony.java中找到。

其实原理很简单 :

1 、 当开启APN的时候,设置一个正确的移动或者联通的APN

2、 关闭的时候设置一个错误APN就会自动关闭网络

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class OpenApnActivity extends Activity {

Uri uri = Uri.parse("content://telephony/carriers");

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button open = (Button) findViewById(R.id.btnOpen);
Button close = (Button) findViewById(R.id.btnClose);
Button btnGoto = (Button) findViewById(R.id.btnGoto);

open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openAPN();
}
});
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeAPN();
}
});

btnGoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(OpenApnActivity.this, EX05_17.class);
// 调用一个新的Activity
startActivity(intent);
}
});

}

public void openAPN() {
List<APN> list = getAPNList();
for (APN apn : list) {
ContentValues cv = new ContentValues();
cv.put("apn", APNMatchTools.matchAPN(apn.apn));
cv.put("type", APNMatchTools.matchAPN(apn.type));
getContentResolver().update(uri, cv, "_id=?",
new String[] { apn.id });
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
check3GNetWork();
}

private void check3GNetWork() {
ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
.getState();
// 如果3G网络未连接,且不是出于正在连接状态
if (mobile == State.CONNECTED || mobile == State.CONNECTING) {
return;
}
Toast.makeText(getApplicationContext(), "网络未连接上...", Toast.LENGTH_LONG)
.show();
}

public void closeAPN() {
List<APN> list = getAPNList();
for (APN apn : list) {
ContentValues cv = new ContentValues();
cv.put("apn", APNMatchTools.matchAPN(apn.apn) + "mdev");
cv.put("type", APNMatchTools.matchAPN(apn.type) + "mdev");
getContentResolver().update(uri, cv, "_id=?",
new String[] { apn.id });
}
}

private List<APN> getAPNList() {
String tag = "Main.getAPNList()----------->";
// current不为空表示可以使用的APN
String projection[] = { "_id,apn,type,current" };
Cursor cr = this.getContentResolver().query(uri, projection, null,
null, null);
List<APN> list = new ArrayList<APN>();
while (cr != null && cr.moveToNext()) {
APN a = new APN();
a.id = cr.getString(cr.getColumnIndex("_id"));
a.apn = cr.getString(cr.getColumnIndex("apn"));
a.type = cr.getString(cr.getColumnIndex("type"));
Log.d(tag,
cr.getString(cr.getColumnIndex("_id")) + "  "
+ cr.getString(cr.getColumnIndex("apn")) + "  "
+ cr.getString(cr.getColumnIndex("type")) + "  "
+ cr.getString(cr.getColumnIndex("current")));
list.add(a);
}
if (cr != null)
cr.close();
return list;
}

public static class APN {
String id;
String apn;
String type;
}
}

public final class APNMatchTools {
public static class APNNet {
/*** 中国移动cmwap*/
public static String CMWAP = "cmwap";

/*** 中国移动cmnet*/
public static String CMNET = "cmnet";

/** 中国联通3GWAP设置 中国联通3G因特网设置 中国联通WAP设置 中国联通因特网设置*/
/** 3gwap 3gnet uniwap uninet*/
/**3G wap 中国联通3gwap APN*/
public static String GWAP_3 = "3gwap";

/*** 3G net 中国联通3gnet APN*/
public static String GNET_3 = "3gnet";

/** uni wap 中国联通uni wap APN*/
public static String UNIWAP = "uniwap";
/** uni net 中国联通uni net APN*/
public static String UNINET = "uninet";
/**  中国电信net APN*/
public static String CTNET = "ctnet";
}

public static String matchAPN(String currentName) {
if ("".equals(currentName) || null == currentName) {
return "";
}
currentName = currentName.toLowerCase();
if (currentName.startsWith(APNNet.CMNET))
return APNNet.CMNET;
else if (currentName.startsWith(APNNet.CMWAP))
return APNNet.CMWAP;
else if (currentName.startsWith(APNNet.GNET_3))
return APNNet.GNET_3;
else if (currentName.startsWith(APNNet.GWAP_3))
return APNNet.GWAP_3;
else if (currentName.startsWith(APNNet.UNINET))
return APNNet.UNINET;
else if (currentName.startsWith(APNNet.UNIWAP))
return APNNet.UNIWAP;
else if (currentName.startsWith("default"))
return "default";
else if (currentName.startsWith(APNNet.CTNET))
return APNNet.CTNET;
else
return "";
/** return currentName.substring(0, currentName.length() -
SUFFIX.length());*/
}
}

<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: