本文转自 http://www.cnmsdn.com/html/201008/1282371656ID7414_2.html
由于Android对于APN的网络API没有公开,不过我们可以阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭APN。
大家可以研究一下frameworks/base/core/java/android/provider/Telephony.java这个类,
比较重要的就是 URI 和数据库字段: content://telephony/carriers
字段可以在Telephony.java中找到。
其实原理很简单 :
1 、 当开启APN的时候,设置一个正确的移动或者联通的APN
2、 关闭的时候设置一个错误APN就会自动关闭网络
请看代码:Activity:
package com.yuan;
import java.util.ArrayList;
import java.util.List;
import com.yuan.util.APNMatchTools;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class ApnTest extends Activity {
/** Called when the activity is first created. */
Uri uri = Uri.parse("content://telephony/carriers");
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button open= (Button) findViewById(R.id.open);
Button close= (Button) findViewById(R.id.close);
open.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
openAPN();
}
});
close.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closeAPN();
}
});
}
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});
}
}
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()) {
Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + " " + cr.getString(cr.getColumnIndex("apn")) + " " + cr.getString(cr.getColumnIndex("type"))+ " " + cr.getString(cr.getColumnIndex("current")));
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"));
list.add(a);
}
if(cr!=null){
cr.close();
}
return list;
}
public static class APN{
String id;
String apn;
String type;
public String toString(){
return this.id+":"+this.apn+":"+this.type;
}
}
}
package com.yuan.util;
public class APNMatchTools {
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 return "";
}
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";
}
}
最后不要忘记加上修改APN的权限:
Xml代码
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
经过测试在G1 上联通和移动卡均是成功的。
推荐地址:http://www.cnmsdn.com/
分享到:
相关推荐
Android开发之系统信息【5】——获取APN列表Android开发之系统信息【5】——获取APN列表
通过修改androidprovider。java源码,实现修改和获取APN的接口
本文实例讲述了Android基于APN获取手机号的方法。分享给大家供大家参考。具体如下: 之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用APN的方式...
NULL 博文链接:https://104zz.iteye.com/blog/1680860
android判断网络状态、获取网络运营商、网络类型的工具类,并提供打开网络设置界面接口
在绝大多数android机器etc路径下存放一个的apns-conf.xml文件,表示当前机器使用的apn信息通过root机器可以push出来看看,具体路径可以上网搜下 代码如下: static Uri PREFERRED_APN_URI = Uri.parse(“content://...
Android APN get list code , 示例代码。文档,包含获取和设置。
获取本机手机号以及服务运营商并显示的DEMO,代码简洁明了,供大家学习交流
代码如下:/** * 获取当前的接入点是ctwap还是ctnet * @author <a>yejiurui</a> * @version 1.0 2013-5-17 下午5:46:05 2013 */ private String CTWAP=”ctwap”; private String CTNET=”ctnet”; private...
android BitMap、Drawable、inputStream及byte[] 互转,dp和px之间转换,还原短信,横竖屏切换,获取各种窗体高度,禁用home键盘,开机启动,开机启动应用,挪动dialog的位置,判断网络状态,权限列表,设置apn,调节屏幕亮度,...
本文实例讲述了Android编程获取网络连接方式及判断手机卡所属运营商的方法。分享给大家供大家参考,具体如下: 问题:项目中写的网络模块,感觉有点乱:两套代码 –模拟器、真机,维护起来十分麻烦。 解决办法:代码...
|--系统信息之获取动态内存RAM信息 |--系统信息之获取可用内存 |--系统信息之获得mac地址 |--系统信息之获得手机sim卡序列号 |--缓存优化之几种方案lastModified |--缓存优化之本地缓存优化(超过规定值或SD卡容量...
Java版水果管理系统源码 HopesUtils,安卓常见问题处理集合及工具类 --Activity不允许横竖屏切换 |--Activity常用小技巧 |--Activity按返回直接回到桌面 ...设置apn |--android 调节屏幕亮度 |--android 资
请查看以获取更多信息。安装使用npm: npm install @capacitor-community/fcm 使用纱: yarn add @capacitor-community/fcm 同步本机文件: npx cap sync注意此插件旨在与Capacitor API结合使用以进行。 电容器仅...
移动推 将推送通知发送到移动设备。... 要将通知推送到Android设备,您必须首先从提供商(Google或Amazon)获取API密钥。 要接收通知,移动设备必须首先在您的通知服务器上注册。 进行设置超出了该库
gps定位,APN设置,当前电量,获取手机中心号码,呼叫转移,内存容量及占用率,移动数据开关,wifi开关,基站位置,限信号发射功率及噪音干扰比,信号接受强度,mac地址,BSSID,手机软件列表,CGI,手机MSISDN,...