`

获取andrid apn信息(转)

阅读更多

本文转自  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 获取 APN 列表的系统信息 Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point ...

    android APN开发流程

    ### Android APN开发流程详解 #### 一、数据连接机制概览 Android设备的数据连接机制主要依赖于PPP(Point-to-Point Protocol)协议,这是一套用于在点对点链路上进行数据传输的标准协议,适用于拨号电话、ISDN、X....

    Android APN开发流程分析.doc

    Android APN 开发流程分析 Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 ...

    android中的APN开发

    1. **读取APN信息**:首先,你需要获取到设备上已存在的APN列表。这可以通过调用`ContentResolver.query()`方法,传入APN的ContentProvider Uri(`content://telephony/carriers`)来实现。查询结果将包含所有APN的...

    android APN 设置

    通过调用`TelephonyManager`的`setDataEnabled()`和`setDataNetworkType()`方法,结合APN信息,可以在代码层面实现切换。 5. **安全考虑**:由于修改APN设置可能影响用户的网络服务,因此在编写相关功能时,开发者...

    Android APN文件装换为windowsphones8 APN文件

    由于Android的APN配置信息存储在一个文本文件中,通常命名为“apn.conf”或“apns-conf.xml”,而WP8系统则需要在系统设置内手动创建每个APN条目,这在APN数量众多的情况下非常不便。因此,有一个工具或方法能将...

    Android端APN实现module

    7. **用户界面**:如果应用需要用户交互来输入APN信息,那么需要设计一个用户友好的界面,让用户能够方便地输入和保存APN设置。 8. **网络恢复**:在更改APN设置后,可能需要重新启动网络连接服务,或者通过调用...

    android 基于基站,apn,gps,wifi,network 根据不同手机sim卡获取经纬度

    在Android系统中,获取地理位置信息是开发者经常遇到的需求。标题提到的“基于基站,APN,GPS,WiFi,Network 根据不同手机SIM卡获取经纬度”涉及了多种定位技术,每种都有其特性和应用场景。下面将详细介绍这些技术...

    获取和修改手机当前APN

    "获取和修改手机当前APN" ...获取和修改手机当前 APN 需要使用 Android 提供的 ContentResolver 对象和 URI mechanism 来查询和修改 APN。同时,需要注意 APN 的状态和网络连接的稳定性,以确保手机的网络连接稳定。

    Android的APN开发源码分析

    ### Android的APN开发源码分析 #### 一、Android数据连接原理 Android的数据连接机制主要是基于PPP(Point-to-Point Protocol)的方式实现的。PPP协议是一种广泛使用的串行链路通信协议,它允许用户通过拨号或其他...

    android widget GRRS/3G(APN)上网开关

    APN是设备连接到移动网络时使用的配置信息,它定义了网络类型、服务器地址以及用于数据传输的协议等。不同的运营商可能有不同的APN设置,用户通常可以在手机的设置中手动调整,但通过小部件实现一键切换则更加便捷。...

    android 设置apn

    这段代码展示了如何获取APN信息,然后修改和保存新的APN设置。请注意,这只是一个简化的示例,实际应用可能需要处理权限问题,例如请求`ACCESS_NETWORK_STATE`和`WRITE_APN_SETTINGS`权限,以及适配不同的Android...

    Android基于APN获取手机号的方法

    本文实例讲述了Android基于APN获取手机号的方法。分享给大家供大家参考。具体如下: 之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用APN的方式...

    Android开发之系统信息【3】——获取Android网络连接信息

    本篇文章将深入探讨如何获取Android设备的网络连接信息,以便于开发者能够判断网络的状态、类型,并根据这些信息来优化应用程序的功能。 首先,要获取网络连接信息,我们需要使用`ConnectivityManager`这个系统服务...

    (安卓)Android获取本机手机号及服务运营商

    在Android开发中,有时我们需要获取用户的手机硬件信息,如手机号码和服务运营商,这些信息对于实现特定功能,如发送短信验证、个性化服务等至关重要。本文将详细介绍如何在Android应用中获取本机手机号及服务运营商...

    安卓获取ip和apn,超链接拨打电话,分享信息

    2. **安卓获取APN信息**: - APN是设备连接到移动网络的配置信息,通常用于数据通信。我们可以通过查询`ContentResolver`和`TelephonyManager`来获取APN设置。首先,获取APN表的内容提供者,然后通过查询获取APN...

    AS 工程自定义 APN 实现.rar

    需要获取`Settings.Secure.APN_SETTINGS`内容提供者的URI,并使用ContentResolver进行增删改查操作。在AndroidManifest.xml中声明权限,如`WRITE_APN_SETTINGS`,以允许修改APN。 2. **权限申请**:由于自定义APN...

    设置APN节点,并切换到当前节点

    在实际开发中,这些功能通常会与系统的ContentResolver和ContentProvider交互,通过SQL语句来操作存储APN信息的系统表。例如,使用`ContentResolver.query()`获取APN,`ContentResolver.insert()`和`ContentResolver...

    新增APN代码

    - 不同运营商的APN设置可能会有所不同,用户应根据SIM卡的运营商获取正确的APN信息,错误的设置可能导致无法正常上网或使用特定服务。 - 修改APN设置时需谨慎,不正确的设置可能导致数据连接问题。 - 部分Android...

Global site tag (gtag.js) - Google Analytics