`

获取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/

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics