72

リモート クエリから接続ステータス レポートを取得するために使用できるようにしたいアプリがあります。

WiFi が接続されているかどうか、モバイル ネットワーク経由でデータ アクセスが有効になっているかどうかを知りたいです。

WiFi が範囲外になった場合、モバイル ネットワークに依存できるかどうかを知りたいです。

問題は、WiFi で接続している場合、有効なデータが常に true として返され、WiFi で接続されていない場合にのみモバイル ネットワークを適切にクエリできることです。

私が見たすべての回答は、現在の接続を確認するためにポーリングすることを提案していますが、現在 WiFi で接続されている可能性がある場合でも、必要に応じてモバイル ネットワークが利用可能かどうかを知りたいです。

接続されているかどうかを確認するためにポーリングせずに、モバイル ネットワーク データが有効になっているかどうかを確認する方法はありますか?

編集

したがって、WiFi で接続されている場合、設定に移動して [データを有効にする] の選択を解除し、アプリで次のようにします。

 boolean mob_avail = 
 conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable();

mob_avail は「true」として返されますが、モバイル ネットワーク データを無効にしているため、「false」であると予想されます。

WiFi をオフにすると、モバイル ネットワーク データが無効になっているため、(当然のことながら) 接続されません。

WiFiで接続しているときにモバイルネットワークデータが有効になっているかどうかを確認するにはどうすればよいですか?

アップデート

ss1271 のコメントで提案されているように、 getAllNetworkInfo() を調べました

以下の3つの条件でモバイルネットワークについて返された情報を出力しました

WiFi オフ - モバイルデータ オン

WiFi オン - モバイルデータ オフ

WiFi オン - モバイルデータ オン

そして、次の結果を得ました:

WiFi オフの場合:

モバイル[HSUPA]、状態: 接続済み/接続済み、理由: 不明、追加: インターネット、ローミング: false、フェイルオーバー: false、isAvailable: true、featureId: -1、userDefault: false

WiFi オン / モバイル オフの場合

NetworkInfo: タイプ: モバイル[HSUPA]、状態: 切断/切断、理由: connectionDisabled、追加: (なし)、ローミング: false、フェイルオーバー: false、isAvailable: true、featureId: -1、userDefault: false

WiFi オン / モバイル オンの場合

NetworkInfo: タイプ: モバイル[HSPA]、状態: 切断/切断、理由: connectionDisabled、追加: (なし)、ローミング: false、フェイルオーバー: false、isAvailable: true、featureId: -1、userDefault: false

ご覧のとおり、isAvailable は毎回 true を返し、状態は WiFi が影響を受けているときにのみ [切断済み] として表示されました。

明確化

携帯電話が現在モバイル ネットワークに接続されているかどうかを確認するつもりはありません。ユーザーがモバイル ネットワーク経由のデータ アクセスを有効または無効にしたかどうかを確認しようとしています[設定] -> [ワイヤレスとネットワークの設定] -> [モバイル ネットワークの設定] -> [データを有効にする] に移動して、これをオンまたはオフにすることができます。

4

17 に答える 17

129

次のコードは、現在アクティブなモバイル データ接続があるかどうか、または wifi が有効/アクティブかどうかに関係なく、「モバイル データ」が有効かどうかを示します。このコードは、Android 2.3 (Gingerbread) 以降でのみ機能します。実際、このコードは以前のバージョンの Android でも機能します ;-)

    boolean mobileDataEnabled = false; // Assume disabled
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
        Class cmClass = Class.forName(cm.getClass().getName());
        Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
        method.setAccessible(true); // Make the method callable
        // get the setting for "mobile data"
        mobileDataEnabled = (Boolean)method.invoke(cm);
    } catch (Exception e) {
        // Some problem accessible private API
        // TODO do whatever error handling you want here
    }

android.permission.ACCESS_NETWORK_STATE注:このコードを使用するには、許可が必要です。

于 2012-10-12T18:19:35.323 に答える
3

あなたはそのようなことを試すことができます:

ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile
State mobile = conMan.getNetworkInfo(0).getState();

//wifi
State wifi = conMan.getNetworkInfo(1).getState();


if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) 
{
    //mobile
}
else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) 
{
    //wifi
}

本当に接続している場合は、

NetworkInfo.State.CONNECTED 

のみ、代わりに

NetworkInfo.State.CONNECTED || NetworkInfo.State.CONNECTING
于 2012-10-12T15:42:46.987 に答える
1

私はNetworkInfo クラスと isConnected を使用するとうまくいくはずだと思います:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

return info != NULL || info.isConnected();

そして、おそらくモバイルデータが接続されていることを確認します。私はそれをテストするまで確信が持てません。明日までできないこと。

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if(tm .getDataState() == tm .DATA_CONNECTED)
   return true;
于 2012-10-12T15:49:27.547 に答える
1

この問題に対する xamarin ソリューションは次のとおりです。

    public static bool IsMobileDataEnabled()
    {
        bool result = false;

        try
        {
            Context context = //get your context here or pass it as a param

            if (Build.VERSION.SdkInt >= BuildVersionCodes.JellyBeanMr1)
            {
                //Settings comes from the namespace Android.Provider
                result = Settings.Global.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
            else
            {
                result = Settings.Secure.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
        }
        catch (Exception ex)
        {
            //handle exception
        }

        return result;
    }

PS: このコードに対するすべての権限があることを確認してください。

于 2016-08-16T10:19:52.387 に答える
0

ConnectivityManagerを使用する必要があり、NetworkInfoの詳細はここにあります

于 2012-10-09T19:22:13.583 に答える
0
private boolean haveMobileNetworkConnection() {
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {

            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedMobile;
    }

注: このコードを使用するには、アクセス許可 android.permission.ACCESS_NETWORK_STATE が必要です。

于 2019-09-03T08:23:43.533 に答える
0
To identify which SIM or slot is making data connection active in mobile, we need to register action android:name="android.net.conn.CONNECTIVITY_CHANGE"  with permission   
uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" &    uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

    public void onReceive(Context context, Intent intent) 
 if (android.net.conn.CONNECTIVITY_CHANGE.equalsIgnoreCase(intent
                .getAction())) {

IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
 IConnectivityManager service =  IConnectivityManager.Stub.asInterface(b);
NetworkState[] states = service.getAllNetworkState();

 for (NetworkState state : states) {

                if (state.networkInfo.getType() == ConnectivityManager.TYPE_MOBILE
                        && state.networkInfo.isConnected()) {

 TelephonyManager mTelephonyManager = (TelephonyManager) context
                        .getSystemService(Context.TELEPHONY_SERVICE);
         int slotList =  { 0, 1 };
          int[] subId = SubscriptionManager.getSubId(slotList[0]);
          if(mTelephonyManager.getDataEnabled(subId[0])) {
             // this means data connection is active for SIM1 similary you 
             //can chekc for SIM2 by slotList[1]
               .................
          }
}

}
于 2015-06-15T12:41:34.147 に答える