リモートクエリから接続状態レポートを取得するために使用できるアプリがあります。
WiFiが接続されているかどうか、およびモバイルネットワーク経由でデータアクセスが有効になっているかどうかを知りたい。
WiFiが範囲外になった場合、モバイルネットワークに依存できるかどうかを知りたいです。
問題は、WiFiで接続している場合、有効なデータが常にtrueとして返され、WiFiで接続していない場合にのみモバイルネットワークに適切にクエリを実行できることです。
私が見たすべての答えは、現在の接続が何であるかを調べるためにポーリングを示唆していますが、現在WiFiで接続されているかもしれませんが、モバイルネットワークが必要な場合に利用可能かどうかを知りたいです。
接続されているかどうかを確認するために、ポーリングなしでモバイルネットワークデータが有効になっているかどうかを確認する方法はありますか?
[〜#〜] edit [〜#〜]
WiFiで接続している場合、設定に移動して[データ有効]の選択を解除すると、アプリで次のようになります。
boolean mob_avail =
conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable();
mob_availは「true」として返されますが、モバイルネットワークデータを無効にしているため、「false」であると予想されます
WiFiをオフにした場合、モバイルネットワークデータを無効にしているため、(正しく)接続はありません。
wiFiで接続しているときにモバイルネットワークデータが有効になっているかどうかを確認するにはどうすればよいですか?
[〜#〜] update [〜#〜]
Ss1271のコメントで提案されているgetAllNetworkInfo()を見てみました
次の3つの条件でモバイルネットワークについて返された情報を出力しました
WiFiオフ-モバイルデータオン
WiFiオン-モバイルデータオフ
WiFiオン-モバイルデータオン
次の結果が得られました。
WiFiがオフの場合:
mobile [HSUPA]、状態:CONNECTED/CONNECTED、理由:不明、追加:インターネット、ローミング:false、フェイルオーバー:false、isAvailable:true、featureId:-1、userDefault:false
WiFiオン/モバイルオフの場合
NetworkInfo:タイプ:mobile [HSUPA]、state:DISCONNECTED/DISCONNECTED、reason:connectionDisabled、extra:(none)、roaming:false、failover:false、isAvailable:true、featureId:-1、userDefault:false
WiFiオン/モバイルオン
NetworkInfo:タイプ:mobile [HSPA]、state:DISCONNECTED/DISCONNECTED、reason:connectionDisabled、extra:(none)、roaming:false、failover:false、isAvailable:true、featureId:-1、userDefault:false
そのため、isAvailableが毎回trueを返し、WiFiが有効な場合にのみ状態が切断として表示されることがわかります。
[〜#〜] clarification [〜#〜]
私は[〜#〜] not [〜#〜]携帯電話が現在モバイルネットワークで接続されているかどうかを確認しています。 I [〜#〜] am [〜#〜]ユーザーがモバイルネットワーク経由のデータアクセスを有効または無効にしたかどうかを確立しようとしています。設定->ワイヤレスとネットワークの設定->モバイルネットワークの設定->データ有効に移動して、これをオンまたはオフにできます。
次のコードは、現時点でアクティブなモバイルデータ接続があるかどうか、または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
このコードを使用できるようにします。
Allesioの回答をアップグレードしました。 Settings.Secureのmobile_data intは、4.2.2からSettings.Globalに移動しました。
wifiが有効で接続されている場合でもモバイルネットワークが有効かどうかを知りたい場合は、このコードを試してください。
SIMカードが使用可能かどうかを確認するために更新されました。ムラトを指摘してくれてありがとう。
boolean mobileYN = false;
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
if(Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
{
mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
}
else{
mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
}
}
1つの方法は、設定でモバイルデータが有効になっているかどうかを確認することです。これは、wifiがオフになった場合に使用される可能性が高いです。これは機能し(テスト済み)、リフレクションを使用しませんが、APIで非表示の値を使用します。
boolean mobileDataAllowed = Settings.Secure.getInt(getContentResolver(), "mobile_data", 1) == 1;
APIによっては、@ user1444325で指摘されているように、Settings.SecureではなくSettings.Globalを確認する必要があります。
@sNashの機能は素晴らしいです。しかし、いくつかのデバイスでは、データが無効になっていてもtrueを返します。そこで、Android API。
getDataState()TelephonyManager のメソッドは非常に便利です。
上記の関数を使用して@snashの関数を更新しました。以下の関数は、セルラーデータが無効な場合はfalseを返し、そうでない場合はtrueを返します。
private boolean checkMobileDataIsEnabled(Context context){
boolean mobileYN = false;
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
// if(Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
// {
// mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
// }
// else{
// mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
// }
int dataState = tel.getDataState();
Log.v(TAG,"tel.getDataState() : "+ dataState);
if(dataState != TelephonyManager.DATA_DISCONNECTED){
mobileYN = true;
}
}
return mobileYN;
}
あなたはそのような何かを試すことができます:
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
この問題に対する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:このコードに対するすべての権限を持っていることを確認してください。
NetworkInfo class と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;
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]
.................
}
}
}
ConnectivityManagerを使用する必要があり、NetworkInfoの詳細を見つけることができます here
他の2つの答えからの簡単なソリューションを次に示します。
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return tm.isDataEnabled();
} else {
return tm.getSimState() == TelephonyManager.SIM_STATE_READY && tm.getDataState() != TelephonyManager.DATA_DISCONNECTED;
}
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の許可が必要です。
telephonyManagerを使用する
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
tm.isDataEnabled()
Android documentation
https://developer.Android.com/reference/Android/telephony/TelephonyManager.html#isDataEnabled()
ConnectivityManager cm = (ConnectivityManager) activity
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
String networkType = "";
if (info.getType() == ConnectivityManager.TYPE_WIFI) {
networkType = "WIFI";
}
else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
networkType = "mobile";
}
Android documentation https://developer.Android.com/training/monitoring-device-state/connectivity-monitoring#Java
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
データ接続がオンになっているかどうかを確認する回避策があります。しかし、すべてのデバイスで機能するかどうかはわかりません。確認する必要があります。 (Android 1台のデバイス)で機能しました)
long data = TrafficStats.getMobileRxBytes();
if(data > 0){
//Data is On
}
else{
//Data is Off
}
この方法を知らない場合、デバイスの起動後にモバイルネットワーク経由で受信したバイトの合計を返します。モバイルデータ接続をオフにすると、ゼロ(0)が返されます。オンにすると、合計バイト数が再び返されます。ただし、この回避策を使用すると発生する可能性のある問題があることに注意する必要があります。