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

来源:互联网 发布:乐易编程网 编辑:程序博客网 时间:2024/06/09 15:43

我们都知道,要打开网络连接是要有相应的权限的,但是目前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的权限:

原创粉丝点击