Managing 3G connectivity in Xamarin Android is a nause - you have to mess about with JNI and a host of other gruff. I've created this little helper to make it easy:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static class ForConnectivityManager | |
{ | |
private const string DebugTag = "YOUR_APP_NAME"; | |
static IntPtr _connectivityManagerSetMobileDataEnabled; | |
public static bool IsMobileDataEnabled(this ConnectivityManager manager) | |
{ | |
var netInfo = manager.GetNetworkInfo(ConnectivityType.Mobile); | |
return manager.NetworkStatus() != NetworkState.NoNetwork; | |
} | |
public static bool Is3GEnabled(this ConnectivityManager manager) | |
{ | |
var networks = manager.GetAllNetworkInfo(); | |
return (from n in networks where n.TypeName == "mobile_internet" && n.IsConnected select n).Any(); | |
} | |
public static NetworkState NetworkStatus(this ConnectivityManager manager) | |
{ | |
var result = NetworkState.NoNetwork; | |
var networks = manager.GetAllNetworkInfo(); | |
foreach (var network in networks) | |
{ | |
if (network.Type == ConnectivityType.Wifi && network.IsConnected) | |
{ | |
result = NetworkState.WiFi; | |
break; | |
} | |
if (network.TypeName == "mobile_internet" && network.IsConnected) | |
{ | |
result = NetworkState.Mobile; | |
break; | |
} | |
} | |
return result; | |
} | |
/// <summary> | |
/// default timeout = 15 seconds | |
/// </summary> | |
public static void SetAndWaitForMobileDataEnabled(this ConnectivityManager manager, TelephonyManager telephonyManager, bool value) | |
{ | |
var notConnected = !manager.IsMobileDataEnabled(); | |
Log.Debug(DebugTag, "Connected to 3G: {0}".With(!notConnected)); | |
if (notConnected) | |
{ | |
if (_connectivityManagerSetMobileDataEnabled == IntPtr.Zero) | |
{ | |
_connectivityManagerSetMobileDataEnabled = JNIEnv.GetMethodID( | |
manager.Class.Handle, | |
"setMobileDataEnabled", | |
"(Z)V"); | |
} | |
Log.Debug(DebugTag, "Invoking JNI method: setMobileDataEnabled"); | |
JNIEnv.CallVoidMethod( | |
manager.Handle, | |
_connectivityManagerSetMobileDataEnabled, | |
new JValue(value)); | |
var waitCount = 0; | |
while (waitCount != 30) | |
{ | |
Log.Debug(DebugTag, "Waiting 500 milliseconds. WaitCount: {0}".With(waitCount)); | |
Thread.Sleep(500); | |
bool isConnected = manager.GetNetworkInfo(ConnectivityType.Mobile).IsConnected; | |
bool istmData = telephonyManager.DataState == DataConnectionStatus.Connected; | |
Log.Debug(DebugTag, "Checking 3g connected: {0}".With(isConnected)); | |
if ((isConnected && istmData) == value) | |
{ | |
break; | |
} | |
waitCount++; | |
} | |
Log.Debug(DebugTag, "3g connection toggle complete."); | |
} | |
} | |
} |
Comments
Post a Comment