`
chenzhengjun
  • 浏览: 7339 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

关于 MTK 双卡 开启/关闭 移动数据 的一些小研究

阅读更多

最近在研究MTK双卡手机,4.1的系统。要在程序里控制移动数据的开关,碰到难题了。因为发现,以前用反射的方法调用ConnectivityManager 类的setMobileDataEnabled方法失效了提示的信息显示找不到该方法,第一的反应是,难道4.1系统没有这个方法了,想想也不可能啊。
查源码,果断还是跟原先一样的。再次进行调试,取到了ConnectivityManager 类中所有的函数,也有此方法的存在。
查原因,可能是因为私有方法,无法调用到。但改代码能调用私有方法后,加权限,加系统签名后,还是如此,不知是我的代码有问题还是怎样,大家可以看下,勿笑。

private void setGprsEnable(boolean isEnable) {
        int result = 0;
ConnectivityManager mCM = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
            Class clazz = Class.forName(mCM.getClass().getName());
            Constructor[] cons = clazz.getDeclaredConstructors();
            Constructor con = clazz.getConstructor();//getDeclaredConstructors();
            con.setAccessible(true);

            Field iConnectivityManagerField = clazz.getDeclaredField("mService");
            iConnectivityManagerField.setAccessible(true);
            Object iConnectivityManager = iConnectivityManagerField.get(mCM);
            //Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
            ConnectivityManager cm =  (ConnectivityManager)con.newInstance(iConnectivityManager);
            Class[] argClasses = new Class[1];
            argClasses[0] = Boolean.class;
            Method ms = clazz.getDeclaredMethod("setMobileDataEnabled", argClasses);
            ms.setAccessible(true);
            Object obj = ms.invoke(cm, isEnable);
            result = (Integer) obj;
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

 既然此方法不通了,那就另外找方法了。先下了个海卓上网大师,结果提示需要系统签名才能控制数据开关,重启后app移动system/app中了,果断可以实现了,但不知用的是什么方法啊,无源码可查,google也查无资料。只能认真地观察下logcat了,看能不能有些发现。


皇天不负有心人啊,找到些信息。当开启数据连接时,logcat输出了一些关键信息

Provider/Settings(506): put string name = gprs_connection_setting , value = 1 userHandle = 0
SettingsProvider(506): insert(content://settings/system) for user 0 by 0
SettingsProvider(506): redundant, old Value: 0 new value: 1
SettingsProvider(506): system <- value=1 name=gprs_connection_setting for user 0

Provider/Settings(506): put string name = gprs_connection_sim_setting , value = 3 userHandle = 0
SettingsProvider(506): insert(content://settings/system) for user 0 by 0
SettingsProvider(506): redundant, old Value: 0 new value: 3
SettingsProvider(506): system <- value=3 name=gprs_connection_sim_setting for user 0

Provider/Settings(506): Global.putString(name=mobile_data, value=1 for 0
Provider/Settings(506): put string name = mobile_data , value = 1 userHandle = 0
SettingsProvider(506): redundant, old Value: 0 new value: 1
SettingsProvider(506): global <- value=1 name=mobile_data for user 0

 难道只要改这三个值就可以啦?果断无比欣喜尝试之。

ContentResolver cr = getWindow().getContext().getContentResolver();
Settings.System.putInt(cr, "gprs_connection_setting", 1);
Settings.System.putInt(cr, "gprs_connection_sim_setting", 3);
Settings.Global.putInt(cr, "mobile_data", 1);

 再加上 WRITE_SECURE_SETTINGS 和 WRITE_SETTINGS 权限 ,加系统签名再试。结果依然无法开启,但发现,下拉菜单里的快捷按钮,状态却已经改变了,数据连接显示已经打开了,就是信号值那少了个数据连接的H或者E图标。正纳闷着系统怎么没有对配置信息进行更新时,我试了下打开了飞行模式,开起来后又关了飞行模式,结果,数据连上了。飞行模式关闭后,系统开始重新配置网络了,将网络配置更新了,原先改的值开始生效了。


既然网络状态发生改变后,系统就能更新网络配置了,那是不是发送网络改变的广播就能立即更新我们修改的配置了呢?试着发了几个广播,可惜不行,不解。不过如果对wifi进行开关,效果跟飞行模式一样,依然能达到我想要的结果。so,时间有限,就先用这个方法吧。对wifi的开关我是如此操作的,因为wifi已经连接时,其实数据连接是否打开是无关紧要的,wifi关了后系统便会自动更新配置。

Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            switch(msg.what){
            case 0:
                //wifi打开,但未连接
                if(wifiManager.isWifiEnabled()&&mActivity.getWifiState()==200){
                    wifiManager.setWifiEnabled(false);
                    sendEmptyMessageDelayed(2, 200);
                }
                else if(wifiManager.isWifiEnabled()){

                }
                else{
                    wifiManager.setWifiEnabled(true);
                    sendEmptyMessageDelayed(1, 200);
                }
                break;
            case 1:
                wifiManager.setWifiEnabled(false);
                break;
            case 2:
                wifiManager.setWifiEnabled(true);
                break;
            }
            super.handleMessage(msg);
        }
    };

 现在问题就解决了。由于我用的是MTK双卡的系统,所以这里还要稍微处理下

int defaultsim = getDefaultSim();
Settings.System.putInt(cr, "gprs_connection_setting", defaultsim);

 getDefaultSim()方法是MTK的接口,用反射就能取到了。这里就不再贴出来了。对了,别忘了加权限 CHANGE_NETWORK_STATE、CHANGE_WIFI_STATE、ACCESS_WIFI_STATE。

这个方法虽然不完美,但总是能用了,OMG,有时间再慢慢研究吧

0
1
分享到:
评论

相关推荐

    360手机卫士MTK双卡版

    360手机卫士MTK双卡版,

    MTK双卡SIM信息获取

    了MTK双卡手机的SIM卡信息获取,包含SIM卡1...其中还包含了展讯和高通的双卡获取信息,但由于本人的手机是MTK双卡,所以只进行了MTK的双卡测试,其余2类手机的代码处于注释状态,希望大家用其他手机测试后给出测试代码

    MTK6582最小系统救砖

    MTK6582是最小系统救砖教程中提及的核心处理器,这是一款由联发科(MediaTek)推出的四核 Cortex-A7 架构的移动芯片,主要用于中低端智能手机和平板电脑。当设备遇到无法正常启动、频繁重启、无法进入系统等问题时,...

    MTK双卡SIM信息获取及手机网络状态判断

    本Demo给出了MTK双卡手机的SIM卡信息获取,包含SIM卡1和SIM卡2的完整信息 其中还包含了展讯和高通的双卡获取信息,但由于本人的手机是MTK双卡,所以只进行了MTK的双卡测试,其余2类手机的代码处于注释状态,希望大家...

    MTK 烧录工具/Debug工具 最新合二为一工具

    MTK 烧录工具/Debug工具 最新合二为一工具。

    mtktool 升级/打log工具

    提到"mtktool_ver2.47.03.11_tocustomer",这是MTKTool的一个特定版本,可能包含了一些更新和改进。每个版本的更新通常会修复已知的bug,提升工具的稳定性和兼容性,或者增加新的功能。对于用户来说,保持工具版本的...

    MTK 深入浅出(笔记整理)

    MTK 层的基础知识笔记/MTK 层的应用/MTK 写窗口/MTK编程起步——常用函数及宏定义/MTK拨号字体大小/mtk常用函数/MTK的DM应用实例/MTK的层和它的一些层函数/MTK的高亮机制/MTK之GPIO设置函数/MTK文件读写相关.....

    MTK平台手机/计算机同步软件

    MTK平台手机计算机同步软件是一种专用工具,用于连接基于MTK芯片的设备与个人计算机,实现数据交换、备份、恢复等操作。该软件包含了USB驱动程序,使得设备能够被计算机识别并进行通信。 MTK手机与计算机同步软件的...

    PN547基于MTK MT6735/53 Android5.1的差分包

    NFC是一种短距离无线通信技术,常用于移动支付、数据传输和智能设备间的快速配对。MT6735和MT6753是MediaTek生产的中低端智能手机SoC(System on Chip),集成CPU、GPU和其他必要组件,支持3G和4G网络连接,广泛应用...

    MTK MT6253 MT6252芯片数据手册

    ### MTK MT6253/MT6252 芯片数据手册知识点解析 #### 一、概述 MTK MT6253/MT6252 是由联发科技股份有限公司(MediaTek Inc.)推出的两款针对GSM/GPRS网络的基带处理器。此款处理器集成了多种功能模块,旨在提供高...

    http之MTK,关于MTK通讯

    MTK,全称为MediaTek,是一家知名的半导体公司,尤其在移动通信、物联网以及智能设备领域有着广泛的应用。在HTTP通信中,MTK技术主要涉及到如何利用socket编程实现设备间的网络通信。Socket是网络编程的基本组件,它...

    MTK 平板系列方案MT8766/MT8768 刷机工具

    MTK 平板系列方案MT8766/MT8768 刷机工具

    user下如何打开mtklog1

    本文将详细介绍如何在用户模式(user)下打开MTKLOG1,并探讨相关的配置文件`mtklog-config-user.prop`。 首先,要启用MTKLOG1在用户模式下的功能,你需要编辑特定的配置文件。根据标题和描述,你需要修改`alps/...

    关于MTK socket编程的一些经验

    关于MTK socket编程的一些经验关于MTK socket编程的一些经验关于MTK socket编程的一些经验关于MTK socket编程的一些经验关于MTK socket编程的一些经验关于MTK socket编程的一些经验

    MTK双卡双待必杀

    维修秘笈 对于mt双卡手机具有一定的参透、基本上应有的问题都可以迎刃而解、、、

    MTK上网数据帐户设置

    总之,MTK手机的数据账户设置是一个涉及网络接入核心参数的过程,需要精确配置才能确保手机能正确地接入并使用网络服务。开发者在进行MTK手机开发时,必须熟悉这些配置细节,以便为用户提供顺畅的网络体验。

    MTK强开USB调试.rar

    MTK,全称为MediaTek,是一家知名的半导体公司,主要生产智能手机、电视和其他消费电子产品的芯片。在Android系统中,USB调试是一种重要的开发者选项,用于帮助开发者进行应用测试、设备调试和系统恢复等操作。"MTK...

Global site tag (gtag.js) - Google Analytics