• 教你如何开关Android的APN网络


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

    大家可以研究一下frameworks/base/core/java/android/provider/Telephony.java这个类,

    比较重要的就是 URI 和数据库字段: content://telephony/carriers

    字段可以在Telephony.java中找到。

    其实原理很简单 : 

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

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

    请看代码:Activity:

    Java代码  收藏代码
    1. package cc.mdev.apn;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5.   
    6. import android.app.Activity;  
    7. import android.content.ContentValues;  
    8. import android.database.Cursor;  
    9. import android.net.Uri;  
    10. import android.os.Bundle;  
    11. import android.util.Log;  
    12. import android.view.View;  
    13. import android.widget.Button;  
    14.   
    15.   
    16. /** 
    17.  * 這裡是Activity 
    18.  * @author SinFrancis wong 
    19.  * @site http://mdev.cc 
    20.  * @wiki http://mdev.cc/wiki 
    21.  * @since 2010-01-08 
    22.  */  
    23. public class Main extends Activity {  
    24.     /** Called when the activity is first created. */  
    25.     Uri uri = Uri.parse("content://telephony/carriers");  
    26.     @Override  
    27.     public void onCreate(Bundle savedInstanceState) {  
    28.         super.onCreate(savedInstanceState);  
    29.         setContentView(R.layout.main);  
    30.           
    31.         Button open= (Button) findViewById(R.id.open);  
    32.         Button close= (Button) findViewById(R.id.close);  
    33.           
    34.         open.setOnClickListener(new View.OnClickListener() {  
    35.               
    36.             @Override  
    37.             public void onClick(View v) {  
    38.                 openAPN();  
    39.             }  
    40.         });  
    41.           
    42.           
    43.         close.setOnClickListener(new View.OnClickListener() {  
    44.               
    45.             @Override  
    46.             public void onClick(View v) {  
    47.                 closeAPN();  
    48.             }  
    49.         });  
    50.           
    51.     }  
    52.       
    53.     public  void openAPN(){  
    54.           
    55.         List<APN> list = getAPNList();  
    56.         for (APN apn : list) {  
    57.             ContentValues cv = new ContentValues();  
    58.             cv.put("apn", APNMatchTools.matchAPN(apn.apn));  
    59.             cv.put("type", APNMatchTools.matchAPN(apn.type));  
    60.             getContentResolver().update(uri, cv, "_id=?"new String[]{apn.id});  
    61.               
    62.         }  
    63.     }  
    64.       
    65.     public void closeAPN(){  
    66.         List<APN> list = getAPNList();  
    67.         for (APN apn : list) {  
    68.             ContentValues cv = new ContentValues();  
    69.             cv.put("apn", APNMatchTools.matchAPN(apn.apn)+"mdev");  
    70.             cv.put("type", APNMatchTools.matchAPN(apn.type)+"mdev");  
    71.             getContentResolver().update(uri, cv, "_id=?"new String[]{apn.id});  
    72.               
    73.         }  
    74.     }  
    75.       
    76.     private List<APN> getAPNList(){  
    77.         String tag = "Main.getAPNList()";  
    78.           
    79.         //current不为空表示可以使用的APN  
    80.         String  projection[] = {"_id,apn,type,current"};  
    81.         Cursor cr = this.getContentResolver().query(uri, projection, nullnullnull);  
    82.           
    83.         List<APN> list = new ArrayList<APN>();  
    84.           
    85.         while(cr!=null && cr.moveToNext()){  
    86.             Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + "  " + cr.getString(cr.getColumnIndex("apn")) + "  " + cr.getString(cr.getColumnIndex("type"))+ "  " + cr.getString(cr.getColumnIndex("current")));  
    87.             APN a = new APN();  
    88.             a.id = cr.getString(cr.getColumnIndex("_id"));  
    89.             a.apn = cr.getString(cr.getColumnIndex("apn"));  
    90.             a.type = cr.getString(cr.getColumnIndex("type"));  
    91.             list.add(a);  
    92.         }  
    93.         if(cr!=null)  
    94.         cr.close();  
    95.         return list;  
    96.     }  
    97.       
    98.       
    99.     public static class APN{  
    100.         String id;  
    101.         String apn;  
    102.         String type;  
    103.     }  
    104.       
    105. }  

    APNMatchTools.java

    Java代码  收藏代码
    1. package cc.mdev.apn;  
    2.   
    3.   
    4.   
    5. /** 
    6.  * 這裡是APN匹配,用於匹配移動或者聯通的APN 
    7.  * @author SinFrancis wong 
    8.  * @site http://mdev.cc 
    9.  * @wiki http://mdev.cc/wiki 
    10.  * @since 2010-01-08 
    11.  * 
    12.  */  
    13. public final class APNMatchTools {  
    14.       
    15.     public static class APNNet{  
    16.         /** 
    17.          * 中国移动cmwap 
    18.          */  
    19.         public static String CMWAP = "cmwap";  
    20.           
    21.         /** 
    22.          * 中国移动cmnet 
    23.          */  
    24.         public static String CMNET = "cmnet";  
    25.           
    26.         //中国联通3GWAP设置        中国联通3G因特网设置        中国联通WAP设置        中国联通因特网设置  
    27.         //3gwap                 3gnet                uniwap            uninet  
    28.           
    29.           
    30.         /** 
    31.          * 3G wap 中国联通3gwap APN  
    32.          */  
    33.         public static String GWAP_3 = "3gwap";  
    34.           
    35.         /** 
    36.          * 3G net 中国联通3gnet APN  
    37.          */  
    38.         public static String GNET_3="3gnet";  
    39.           
    40.         /** 
    41.          * uni wap 中国联通uni wap APN  
    42.          */  
    43.         public static String UNIWAP="uniwap";  
    44.         /** 
    45.          * uni net 中国联通uni net APN  
    46.          */  
    47.         public static String UNINET="uninet";  
    48.     }  
    49.   
    50.   
    51.   
    52.     public static String matchAPN(String currentName) {          
    53.         if("".equals(currentName) || null==currentName){  
    54.             return "";  
    55.         }  
    56.         currentName = currentName.toLowerCase();  
    57.         if(currentName.startsWith(APNNet.CMNET))  
    58.             return APNNet.CMNET;  
    59.         else if(currentName.startsWith(APNNet.CMWAP))  
    60.             return APNNet.CMWAP;  
    61.         else if(currentName.startsWith(APNNet.GNET_3))  
    62.             return APNNet.GNET_3;  
    63.         else if(currentName.startsWith(APNNet.GWAP_3))  
    64.             return APNNet.GWAP_3;  
    65.         else if(currentName.startsWith(APNNet.UNINET))  
    66.             return APNNet.UNINET;  
    67.         else if(currentName.startsWith(APNNet.UNIWAP))  
    68.             return APNNet.UNIWAP;  
    69.         else if(currentName.startsWith("default"))  
    70.             return "default";  
    71.         else return "";  
    72.        // return currentName.substring(0, currentName.length() - SUFFIX.length());  
    73.     }  
    74.       
    75.       
    76. }  

     最后不要忘记加上修改APN的权限:

    Xml代码  收藏代码
    1. <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> 
  • 相关阅读:
    Java字符串操作
    easyui Combotree根据用户输入显示对应的tree值
    maven
    引用 js表单验证大全 以后方便查看用
    对象内存模型
    高级性能服务器编程模型【IOCP完成端口】开发实现【一】
    高级性能服务器编程模型【IOCP完成端口】开发实现【二】
    高级性能服务器编程模型【IOCP完成端口】开发实现【三】
    探讨【IGE】的源代码【六】,承接【五】,内存池管理。
    hive beeline详解
  • 原文地址:https://www.cnblogs.com/luxiaofeng54/p/2035392.html
Copyright © 2020-2023  润新知