How to check if the network is available on Android and iOS (Delphi XE5)

  • How to check if the network is available on Android and iOS?
+6
source share
4 answers

Try the following:

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. 
+8
source

Thanks a lot blong for the solution. Since it started working in Delphi Berlin, I reworked the module code. Hope this is helpful.

In RAD 10.1, you can use the full Androidapi.JNI.Net.pas module. But for research, it 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. 
+5
source

I don't have a source directory in front of me right now, but that should help point you in the right direction.

I believe that you will be able to remake the Android solution in delphi: Determine if there is Internet access on Android .

Edit: this line exactly replicates the first line of this function, just not sure which type is returned. If you have, then the rest of this function should be trivial:

SharedActivitiyContext.getSystemService (TJContext.JavaClass.ConnectivityService)

+3
source

The solution is in the fmxexpress site. You usually use the IdTCPClient component and check if you can connect to google.com

0
source

Source: https://habr.com/ru/post/954141/


All Articles