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

Android通过代码打开和关闭网络连接

2013-05-10 08:37 513 查看
我们都知道,要打开网络连接是要有相应的权限的,但是目前Android中并没有直接打开和关闭网络连接的权限,因此我们只能通过APN来实现:

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

 

其实原理很简单 :

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

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

下面是源代码:

package com.mandr.network.demo;

import java.util.ArrayList;

import java.util.List;

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 OpenNetworkActivity extends Activity {

 private Button open, close;

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

 @Override

 public void onCreate(Bundle savedInstanceState){

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  open = (Button)findViewById(R.id.open);

  close = (Button)findViewById(R.id.close);

  open.setOnClickListener(newView.OnClickListener() {

   publicvoid onClick(View v) {

    openAPN();

   }

  });

  close.setOnClickListener(newView.OnClickListener() {

   publicvoid onClick(View v) {

    closeAPN();

   }

  });

 }

 public void openAPN() {

  List list = getAPNList();

  for (APN apn : list) {

   ContentValuescv = new ContentValues();

   cv.put("apn",APNMatchTools.matchAPN(apn.apn));

   cv.put("type",APNMatchTools.matchAPN(apn.type));

   getContentResolver().update(uri,cv, "_id=?",

     newString[]
{ apn.id });

  }

 }

 public void closeAPN() {

  List list = getAPNList();

  for (APN apn : list) {

   ContentValuescv = new ContentValues();

   cv.put("apn",APNMatchTools.matchAPN(apn.apn) + "mdev");

   cv.put("type",APNMatchTools.matchAPN(apn.type) + "mdev");

   getContentResolver().update(uri,cv, "_id=?",

     newString[]
{ apn.id });

  }

 }

 private List getAPNList() {

  String tag ="Main.getAPNList()";

  // current不为空表示可以使用的APN

  String projection[] = {"_id,apn,type,current" };

  //查询数据库

  Cursor cr =this.getContentResolver().query(uri, projection, null,

    null,null);

  List list = newArrayList();

  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 = newAPN();

   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;

 }

}

APNMatchTools.java

package com.mandr.network.demo;

public class APNMatchTools {

 public static class APNNet {

  public static String CMWAP ="cmwap";

  public static String CMNET ="cmnet";

  // 中国联通3GWAP设置 中国联通3G因特网设置中国联通WAP设置 中国联通因特网设置

  // 3gwap 3gnet uniwapuninet

  public static String GWAP_3= "3gwap";

  public static String GNET_3= "3gnet";

  public static String UNIWAP= "uniwap";

  public static String UNINET= "uninet";

 }

 public static String matchAPN(StringcurrentName) {

  if ("".equals(currentName) ||null == currentName) {

   return"";

  }

  currentName =currentName.toLowerCase();

  if(currentName.startsWith(APNNet.CMNET))

   returnAPNNet.CMNET;

  else if(currentName.startsWith(APNNet.CMWAP))

   returnAPNNet.CMWAP;

  else if(currentName.startsWith(APNNet.GNET_3))

   returnAPNNet.GNET_3;

  else if(currentName.startsWith(APNNet.GWAP_3))

   returnAPNNet.GWAP_3;

  else if(currentName.startsWith(APNNet.UNINET))

   returnAPNNet.UNINET;

  else if(currentName.startsWith(APNNet.UNIWAP))

   returnAPNNet.UNIWAP;

  else if(currentName.startsWith("default"))

   return"default";

  else

   return"";

  // returncurrentName.substring(0, currentName.length() -

  // SUFFIX.length());

 }

}

最后别忘了加入修改APN的权限:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: