- How to check if network is available on Android and iOS?

- 506
- 1
- 9
- 18

- 2,546
- 3
- 39
- 88
-
1this is very raw method. :| is this the normal way to do it on Android platform? – Yordan Yanakiev Sep 19 '13 at 07:14
-
It is indeed but cannot think of anything better – matcheek Sep 19 '13 at 07:15
-
I added the android tag, possibly gives an answer to the question – RBA Sep 19 '13 at 08:46
-
can you explain what do you mean with `check if network is available`? – RRUZ Sep 20 '13 at 01:19
-
Generally getting the state if the network interfaces is up and ready, and the network ( internet connectivity ) is available. – Yordan Yanakiev Sep 23 '13 at 06:48
5 Answers
Try this:
unit Network;
interface
function IsConnected: Boolean;
function IsWiFiConnected: Boolean;
function IsMobileConnected: Boolean;
implementation
uses
System.SysUtils,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
FMX.Helpers.Android, Androidapi.Helpers, Misc;
type
JConnectivityManager = interface;
JNetworkInfo = interface;
JNetworkInfoClass = interface(JObjectClass)
['{E92E86E8-0BDE-4D5F-B44E-3148BD63A14C}']
end;
[JavaSignature('android/net/NetworkInfo')]
JNetworkInfo = interface(JObject)
['{6DF61A40-8D17-4E51-8EF2-32CDC81AC372}']
{Methods}
function isAvailable: Boolean; cdecl;
function isConnected: Boolean; cdecl;
function isConnectedOrConnecting: Boolean; cdecl;
end;
TJNetworkInfo = class(TJavaGenericImport<JNetworkInfoClass, JNetworkInfo>) end;
JConnectivityManagerClass = interface(JObjectClass)
['{E03A261F-59A4-4236-8CDF-0068FC6C5FA1}']
{Property methods}
function _GetTYPE_WIFI: Integer; cdecl;
function _GetTYPE_WIMAX: Integer; cdecl;
function _GetTYPE_MOBILE: Integer; cdecl;
{Properties}
property TYPE_WIFI: Integer read _GetTYPE_WIFI;
property TYPE_WIMAX: Integer read _GetTYPE_WIMAX;
property TYPE_MOBILE: Integer read _GetTYPE_MOBILE;
end;
[JavaSignature('android/net/ConnectivityManager')]
JConnectivityManager = interface(JObject)
['{1C4C1873-65AE-4722-8EEF-36BBF423C9C5}']
{Methods}
function getActiveNetworkInfo: JNetworkInfo; cdecl;
function getNetworkInfo(networkType: Integer): JNetworkInfo; cdecl;
end;
TJConnectivityManager = class(TJavaGenericImport<JConnectivityManagerClass, JConnectivityManager>) end;
function GetConnectivityManager: JConnectivityManager;
var
ConnectivityServiceNative: JObject;
begin
ConnectivityServiceNative := SharedActivityContext.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
if not Assigned(ConnectivityServiceNative) then
raise Exception.Create('Could not locate Connectivity Service');
Result := TJConnectivityManager.Wrap(
(ConnectivityServiceNative as ILocalObject).GetObjectID);
if not Assigned(Result) then
raise Exception.Create('Could not access Connectivity Manager');
end;
function IsConnected: Boolean;
var
ConnectivityManager: JConnectivityManager;
ActiveNetwork: JNetworkInfo;
begin
ConnectivityManager := GetConnectivityManager;
ActiveNetwork := ConnectivityManager.getActiveNetworkInfo;
Result := Assigned(ActiveNetwork) and ActiveNetwork.isConnected;
end;
function IsWiFiConnected: Boolean;
var
ConnectivityManager: JConnectivityManager;
WiFiNetwork: JNetworkInfo;
begin
ConnectivityManager := GetConnectivityManager;
WiFiNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
Result := WiFiNetwork.isConnected;
end;
function IsMobileConnected: Boolean;
var
ConnectivityManager: JConnectivityManager;
MobileNetwork: JNetworkInfo;
begin
ConnectivityManager := GetConnectivityManager;
MobileNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
Result := MobileNetwork.isConnected;
end;
end.
-
2What about on iOS? (OP asked about Android and iOS). I use the solution described here: http://delphiworlds.com/2013/11/checking-for-an-internet-connection-on-mobile-devices-with-delphi-xe5/ – ByteArts Oct 05 '16 at 18:10
-
You make a valid point. I was only addressing the Android question. Thanks for the link to an iOS solution. – blong Oct 05 '16 at 18:39
Thanks a lot to blong for solution. For it began to work at Delphi Berlin, I redid the module code. I hope this is useful.
At the RAD 10.1 can be used entirely Androidapi.JNI.Net.pas module. But for the study may be useful to make the proposed functions in a separate module.
unit Androidapi.JNI.Network;
interface
function IsConnected: Boolean;
function IsWiFiConnected: Boolean;
function IsMobileConnected: Boolean;
implementation
uses
System.SysUtils,
Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Net,
FMX.Helpers.Android,
Androidapi.Helpers;
// type
// JConnectivityManager = interface;
// JNetworkInfo = interface;
//
// JNetworkInfoClass = interface(JObjectClass)
// ['{E92E86E8-0BDE-4D5F-B44E-3148BD63A14C}']
// end;
//
// [JavaSignature('android/net/NetworkInfo')]
// JNetworkInfo = interface(JObject)
// ['{6DF61A40-8D17-4E51-8EF2-32CDC81AC372}']
// { Methods }
// function isAvailable: Boolean; cdecl;
// function IsConnected: Boolean; cdecl;
// function isConnectedOrConnecting: Boolean; cdecl;
// end;
// TJNetworkInfo = class(TJavaGenericImport<JNetworkInfoClass, JNetworkInfo>)
// end;
//
// JConnectivityManagerClass = interface(JObjectClass)
// ['{E03A261F-59A4-4236-8CDF-0068FC6C5FA1}']
// { Property methods }
// function _GetTYPE_WIFI: Integer; cdecl;
// function _GetTYPE_WIMAX: Integer; cdecl;
// function _GetTYPE_MOBILE: Integer; cdecl;
// { Properties }
// property TYPE_WIFI: Integer read _GetTYPE_WIFI;
// property TYPE_WIMAX: Integer read _GetTYPE_WIMAX;
// property TYPE_MOBILE: Integer read _GetTYPE_MOBILE;
// end;
//
// [JavaSignature('android/net/ConnectivityManager')]
// JConnectivityManager = interface(JObject)
// ['{1C4C1873-65AE-4722-8EEF-36BBF423C9C5}']
// { Methods }
// function getActiveNetworkInfo: JNetworkInfo; cdecl;
// function getNetworkInfo(networkType: Integer): JNetworkInfo; cdecl;
// end;
// TJConnectivityManager = class(TJavaGenericImport<JConnectivityManagerClass, JConnectivityManager>)
// end;
function GetConnectivityManager: JConnectivityManager;
var
ConnectivityServiceNative: JObject;
begin
ConnectivityServiceNative := TAndroidHelper.Context.getSystemService
(TJContext.JavaClass.CONNECTIVITY_SERVICE);
if not Assigned(ConnectivityServiceNative) then
raise Exception.Create('Could not locate Connectivity Service');
Result := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);
if not Assigned(Result) then
raise Exception.Create('Could not access Connectivity Manager');
end;
function IsConnected: Boolean;
var
ConnectivityManager: JConnectivityManager;
ActiveNetwork: JNetworkInfo;
begin
ConnectivityManager := GetConnectivityManager;
ActiveNetwork := ConnectivityManager.getActiveNetworkInfo;
Result := Assigned(ActiveNetwork) and ActiveNetwork.IsConnected;
end;
function IsWiFiConnected: Boolean;
var
ConnectivityManager: JConnectivityManager;
WiFiNetwork: JNetworkInfo;
begin
ConnectivityManager := GetConnectivityManager;
WiFiNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
Result := WiFiNetwork.IsConnected;
end;
function IsMobileConnected: Boolean;
var
ConnectivityManager: JConnectivityManager;
MobileNetwork: JNetworkInfo;
begin
ConnectivityManager := GetConnectivityManager;
MobileNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
Result := MobileNetwork.IsConnected;
end;
end.
I don't have the source directory in front of me right now but this should help point you in the right direction.
I believe you will be able to redo the below android solution in delphi: Detect whether there is an Internet connection available on Android
Edit: This line replicates the first line of that function exactly, just not sure what type is returned. Once you have that the rest of that function should be trivial:
SharedActivitiyContext.getSystemService(TJContext.JavaClass.ConnectivityService)

- 1
- 1

- 381
- 4
- 11
uses System.Net.HttpClient
function CheckInternet: boolean;
begin
Result := false;
with THTTPClient.Create do
try
try
Result := Head('http://google.com').StatusCode < 400;
except
end;
finally
Free;
end;
end;

- 1,127
- 8
- 14
Solution in fmxexpress site.You typically use IdTCPClient component and check if you can connect to google.com

- 4,495
- 15
- 62
- 127
-
Do not use Indy components. Better use native THttpClient from System.Net.HttpClient . It's more stable and work with https on Android 6 without problems and do not need any additional libraries. – alitrun Jun 07 '18 at 19:11