如何调用setMobileDataEnabled()

时间:2013-01-30 13:48:42

标签: android connection settings

我是Android的新手,但我知道很少有人认为,但这对我来说很难:

首先,我想检查一下我是否连接到互联网:工作。 然后我想检查我启用的移动数据/ wifi:是否有效。 然后我想打开移动网络(如果它被禁用)来检查我是否有一个(好的?)连接到互联网:不工作

我使用了来自https://stackoverflow.com/a/8962211/1879409的代码,但我不知道我怎么称呼这种方法?我还想在一个单独的类文件(.java文件)中执行此操作,并从我的主要活动中调用此函数。

有人能给我一个例子,说明我能做到这一点吗?

感谢所有答案xD

修改

现在它在我的Settings.java中看起来像这样:

    import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.content.Context;
import android.net.ConnectivityManager;
import android.util.Log;

public class SettingsHelper {

    static void setMobileDataEnabled(Context context, boolean enabled) {
        try {

            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);
            Log.i("setMobileDataEnabled()","OK");
        } 

        catch (Exception e) 
        {
            e.printStackTrace();
            Log.i("setMobileDataEnabled()","FAIL");
        }         
    }
}

如果我调用Settings.setMobileDataEnabled(context,true);从我的MainActivity我得到:

    02-01 14:51:19.680: W/System.err(23318): java.lang.NullPointerException
02-01 14:51:19.700: W/System.err(23318):    at at.htlmbprojekt.wksimonsfeld.iceapp.SettingsHelper.setMobileDataEnabled(SettingsHelper.java:15)
02-01 14:51:19.700: W/System.err(23318):    at at.htlmbprojekt.wksimonsfeld.iceapp.MainActivity.checkIfStorageAvailable(MainActivity.java:83)
02-01 14:51:19.700: W/System.err(23318):    at at.htlmbprojekt.wksimonsfeld.iceapp.MainActivity.access$4(MainActivity.java:81)
02-01 14:51:19.700: W/System.err(23318):    at at.htlmbprojekt.wksimonsfeld.iceapp.MainActivity$2.onClick(MainActivity.java:76)
02-01 14:51:19.700: W/System.err(23318):    at android.view.View.performClick(View.java:4211)
02-01 14:51:19.700: W/System.err(23318):    at android.view.View$PerformClick.run(View.java:17267)
02-01 14:51:19.700: W/System.err(23318):    at android.os.Handler.handleCallback(Handler.java:615)
02-01 14:51:19.700: W/System.err(23318):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-01 14:51:19.700: W/System.err(23318):    at android.os.Looper.loop(Looper.java:137)
02-01 14:51:19.700: W/System.err(23318):    at android.app.ActivityThread.main(ActivityThread.java:4898)
02-01 14:51:19.700: W/System.err(23318):    at java.lang.reflect.Method.invokeNative(Native Method)
02-01 14:51:19.700: W/System.err(23318):    at java.lang.reflect.Method.invoke(Method.java:511)
02-01 14:51:19.700: W/System.err(23318):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-01 14:51:19.700: W/System.err(23318):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-01 14:51:19.700: W/System.err(23318):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:103)
02-01 14:51:19.700: W/System.err(23318):    at dalvik.system.NativeStart.main(Native Method)

也许是因为上下文为空?如果是的话我应该怎样处理他的背景? 如果有人可以解决我的问题请给我一个整体代码,不仅是一些片段我是初学者,我不知道我应该怎么做这些片​​段xD

3 个答案:

答案 0 :(得分:1)

首先,为了使您的代码易于阅读,您可以使用“通用”异常处理程序,但为什么使用通用异常处理程序不是一个好主意而不是特定异常是一个不同的主题,您可以在这里阅读: http://www.javaworld.com/javaworld/jw-10-2003/jw-1003-generics.html

无论如何,现在关于你的实际问题,尝试下面给出的代码,我没有进行更改,除了格式化它以使其更具可读性以及为什么你得到NULL异常,因为你试图使用范围之外的对象它被实例化了。

private void setMobileDataEnabled(Context context, boolean enabled) {
    try {

        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);

    } catch (Exception e) {
        e.printStackTrace();
    }         
}

答案 1 :(得分:0)

请检查您的清单,并确保已添加“CHANGE_NETWORK_STATE”权限。

答案 2 :(得分:0)

如果要创建要使用代码的类,请执行以下操作:

在MainActivity的同一个包中创建一个新类。

给它任何名称,例如:MyNetwork。

写下以下内容:

public class MyNetwork {

    setMobileDataEnabled(Context context, boolean enabled){

        ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        Method setMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);

        setMobileDataEnabledMethod.setAccessible(true);
        setMobileDataEnabledMethod.invoke(conman, enabled);

        }

}

现在只需从任何地方拨打电话:

MyNetwork mn;

mn.setMobileDataEnabled(getBaseContext(), true) //or false to disable your data.

您可以在班级中创建任何方法,以便调用它,只需调用:

mn.yourMethod()

检查您是否在Manifest.xml中声明了正确的权限。