本文转自 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 获取 APN 列表的系统信息 Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point ...
Android APN 开发流程分析 Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 ...
1. **读取APN信息**:首先,你需要获取到设备上已存在的APN列表。这可以通过调用`ContentResolver.query()`方法,传入APN的ContentProvider Uri(`content://telephony/carriers`)来实现。查询结果将包含所有APN的...
通过调用`TelephonyManager`的`setDataEnabled()`和`setDataNetworkType()`方法,结合APN信息,可以在代码层面实现切换。 5. **安全考虑**:由于修改APN设置可能影响用户的网络服务,因此在编写相关功能时,开发者...
由于Android的APN配置信息存储在一个文本文件中,通常命名为“apn.conf”或“apns-conf.xml”,而WP8系统则需要在系统设置内手动创建每个APN条目,这在APN数量众多的情况下非常不便。因此,有一个工具或方法能将...
7. **用户界面**:如果应用需要用户交互来输入APN信息,那么需要设计一个用户友好的界面,让用户能够方便地输入和保存APN设置。 8. **网络恢复**:在更改APN设置后,可能需要重新启动网络连接服务,或者通过调用...
"获取和修改手机当前APN" ...获取和修改手机当前 APN 需要使用 Android 提供的 ContentResolver 对象和 URI mechanism 来查询和修改 APN。同时,需要注意 APN 的状态和网络连接的稳定性,以确保手机的网络连接稳定。
在Android系统中,获取地理位置信息是开发者经常遇到的需求。标题提到的“基于基站,APN,GPS,WiFi,Network 根据不同手机SIM卡获取经纬度”涉及了多种定位技术,每种都有其特性和应用场景。下面将详细介绍这些技术...
### Android的APN开发源码分析 #### 一、Android数据连接原理 Android的数据连接机制主要是基于PPP(Point-to-Point Protocol)的方式实现的。PPP协议是一种广泛使用的串行链路通信协议,它允许用户通过拨号或其他...
APN是设备连接到移动网络时使用的配置信息,它定义了网络类型、服务器地址以及用于数据传输的协议等。不同的运营商可能有不同的APN设置,用户通常可以在手机的设置中手动调整,但通过小部件实现一键切换则更加便捷。...
这段代码展示了如何获取APN信息,然后修改和保存新的APN设置。请注意,这只是一个简化的示例,实际应用可能需要处理权限问题,例如请求`ACCESS_NETWORK_STATE`和`WRITE_APN_SETTINGS`权限,以及适配不同的Android...
本文实例讲述了Android基于APN获取手机号的方法。分享给大家供大家参考。具体如下: 之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用APN的方式...
本篇文章将深入探讨如何获取Android设备的网络连接信息,以便于开发者能够判断网络的状态、类型,并根据这些信息来优化应用程序的功能。 首先,要获取网络连接信息,我们需要使用`ConnectivityManager`这个系统服务...
在Android开发中,有时我们需要获取用户的手机硬件信息,如手机号码和服务运营商,这些信息对于实现特定功能,如发送短信验证、个性化服务等至关重要。本文将详细介绍如何在Android应用中获取本机手机号及服务运营商...
2. **安卓获取APN信息**: - APN是设备连接到移动网络的配置信息,通常用于数据通信。我们可以通过查询`ContentResolver`和`TelephonyManager`来获取APN设置。首先,获取APN表的内容提供者,然后通过查询获取APN...
需要获取`Settings.Secure.APN_SETTINGS`内容提供者的URI,并使用ContentResolver进行增删改查操作。在AndroidManifest.xml中声明权限,如`WRITE_APN_SETTINGS`,以允许修改APN。 2. **权限申请**:由于自定义APN...
在实际开发中,这些功能通常会与系统的ContentResolver和ContentProvider交互,通过SQL语句来操作存储APN信息的系统表。例如,使用`ContentResolver.query()`获取APN,`ContentResolver.insert()`和`ContentResolver...
- 不同运营商的APN设置可能会有所不同,用户应根据SIM卡的运营商获取正确的APN信息,错误的设置可能导致无法正常上网或使用特定服务。 - 修改APN设置时需谨慎,不正确的设置可能导致数据连接问题。 - 部分Android...