0

我是 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

4

3 回答 3

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();
    }         
}
于 2013-01-31T12:51:40.623 回答
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 中声明了正确的权限。

于 2013-10-14T14:33:56.343 回答
0

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

于 2013-05-02T05:19:39.193 回答