• 开启/关闭 移动数据连接 Mobile Data


    开启/关闭 移动数据连接 Mobile Data 

     

    Dataconnection 开关的API 并没有直接提供给上层使用,不过可以通过Java的反射机制使用 ITelephony来实现

      Method dataConnSwitchmethod;
      Class telephonyManagerClass;
      Object ITelephonyStub;   Class ITelephonyClass; TelephonyManager telephonyManager
    = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); if(telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED){ isEnabled = true; }else{ isEnabled = false; } telephonyManagerClass = Class.forName(telephonyManager.getClass().getName()); Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony"); getITelephonyMethod.setAccessible(true); ITelephonyStub = getITelephonyMethod.invoke(telephonyManager); ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName()); if (isEnabled) { dataConnSwitchmethod = ITelephonyClass .getDeclaredMethod("disableDataConnectivity"); } else { dataConnSwitchmethod = ITelephonyClass .getDeclaredMethod("enableDataConnectivity"); } dataConnSwitchmethod.setAccessible(true); dataConnSwitchmethod.invoke(ITelephonyStub);

    需要捕获异常,需要权限:<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>

    不过MODIFY_PHONE_STATE权限在Gingerbread 2.3开始 就无效了(详见 StackOverFlow)。

    Android 2.3 可以通过反射使用 IConnectivityManager.setMobileDataEnabled():

    private void setMobileDataEnabled(Context context, boolean enabled) {
        final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class conmanClass = Class.forName(conman.getClass().getName());
        final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
        iConnectivityManagerField.setAccessible(true);
        final Object iConnectivityManager = iConnectivityManagerField.get(conman);
        final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);
    
        setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
    }

    需要权限:<uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/>

    不过不能保证在更高版本中有效,我在4.0.3上试过,此法行不通。

    P.S.  Google Play 软件:Data Enabler 可以快速实现Mobile Data的开关,基本支持目前所有Android版本,不知道是怎么做到的。

    参考链接:

    http://stackoverflow.com/questions/3644144/how-to-disable-mobile-data-on-android/8962211#8962211

    http://stackoverflow.com/questions/4715250/how-to-grant-modify-phone-state-permission-for-apps-ran-on-gingerbread

  • 相关阅读:
    理解OO 思想 架构好一个程序之基石!~
    WP7 ZIP 压缩与解压缩
    Gis LBS 应用 剧本 (自己乱想的)
    PHP 入门 环境搭建
    Android 入门必须知道的 英文缩写
    Android 开发 数据结构理解 队列和栈 分析及实现
    c函数中形参为引用的情况;C++中*a和*&a的区别
    如何在.NET中使用尾递归
    [ProjectEuler.net] 25 找到第一个fib数,数位为1000位
    NFA_DFA
  • 原文地址:https://www.cnblogs.com/willyan/p/2574513.html
Copyright © 2020-2023  润新知