各位大大们
由于最近需要编写一个需要操作背景数据的小应用,但查看sdk里的API之后,发现没有对应的API可供使用,无奈在网上百度谷歌了一下,发现有个隐藏API可以实现该功能:
android.net.ConnectivityManager.setBackgroundDataSetting(boolean setting)
但是这个隐藏的API在一般情况下是无法调用的,我曾经想到过使用反射机制来使用该方法,但很无奈,反射使用时报错说无此方法(不知是我使用的android版本原因还是其他原因,没有深入追究)。
后来一气之下在Ubuntu12.04下下载了android源码,全部版本,全部一共加起来10多G。(过程各种痛苦,我不想再来第二次了)
编译,花了几个小时。
完成后,我在源码目录下的out/.../../class.jar,把这个文件提取了出来,放在了eclipse工程目录下classpath里,然后,可以调用隐藏API了,可是,我发现。。按照我之前的想法,直接使用ConnectivityManager.setBackgroundDataSetting()来关闭或者打开背景数据,但经过调试之后,发现ConnectivityManager.getBackgroundDataSetting()返回的值依然是true,很是困惑。PS:已经在manifest.xml文件里添加了权限android.permission.CHANGE_BACKGROUND_DATA_SETTING但是setBackgroundDataSetting(false)是无效的,getBackgroundDataSetting()依然是true。请问有没有大大经历过这种情况,或者知道原因或者解决思路的,说出来大家讨论下呗。android背景数据

解决方案 »

  1.   

    http://bbs.csdn.net/topics/390342841这个办法不知道能不能解决楼主的问题。
      

  2.   

        private void setBackgroundDataInt(boolean enabled) {
            if (getActivity() == null) return;
            final ConnectivityManager connManager = (ConnectivityManager)
                    getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
            connManager.setBackgroundDataSetting(enabled);
        }
    如果不成功,就要看其他的源码地方是否调了setBackgroundDataSetting
      

  3.   


    我新建了个工程,只有一个按钮,就触发关闭背景数据,但是debug进去,发现getBackgroundDataSetting()依然返回true。
      

  4.   

    就不应该call 这两个函数, 都已经 deprecated了。    @Deprecated
        public boolean getBackgroundDataSetting() {
            // assume that background data is allowed; final authority is
            // NetworkInfo which may be blocked.
            return true;
        }    /**
         * Sets the value of the setting for background data usage.
         *
         * @param allowBackgroundData Whether an application should use data while
         *            it is in the background.
         *
         * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
         * @see #getBackgroundDataSetting()
         * @hide
         */
        @Deprecated
        public void setBackgroundDataSetting(boolean allowBackgroundData) {
            // ignored
        }