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)

おそらくコンテキストがnullだからでしょうか?はいの場合、私は彼のコンテキストで何をすべきですか? 誰かが私の問題を解決できる場合は、一部のスニペットだけでなく、コード全体を送ってください。私は初心者で、これらのスニペットをどうすればよいかわかりません 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 に答える