下文转自:
http://www.dfwlt.com/forum.php?mod=viewthread&tid=2026&extra=page%3D4%26filter%3Dsortid%26sortid%3D3
unit NetStatusInfo;
interface
uses Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText,
Androidapi.Helpers, Androidapi.JNI.Net;
type
TNetworkChangedEvent = procedure (Action: string) of object;
TBroadcastReceiverEvent = procedure (context: JContext; intent: JIntent) of object;
TNetworkChangeReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)
private
FOnBroadcastReceiverEvent: TBroadcastReceiverEvent;
public
property OnBroadcastReceiverEvent: TBroadcastReceiverEvent read FOnBroadcastReceiverEvent write FOnBroadcastReceiverEvent;
procedure onReceive(context: JContext; intent: JIntent); cdecl;
end;
TNetStatusInfo = class
private
FNetworkChangedEvent: TNetworkChangedEvent;
procedure FireNetworkChangedEvent(Action: string);
procedure InitClass;
protected
FConnectivityManager: JConnectivityManager;
FListener: TNetworkChangeReceiver;
FReceiver: JFMXBroadcastReceiver;
FFilter: JIntentFilter;
FCurrentNetName: string;
procedure OnNetworkChangedEvent(context: JContext; intent: JIntent);
public
constructor Create(NetworkChangedEvent: TNetworkChangedEvent);
destructor Destroy; override;
function IsWifi: Boolean;
function IsMobile: Boolean;
property CurrentNetName: string read FCurrentNetName;
end;
implementation
uses Androidapi.JNI.JavaTypes, System.SysUtils;
const
NET_STATUS_RECEIVER = 'com.android.net.status.receiver';
NET_WIFI = 'WIFI';
NET_MOBILE = 'MOBILE';
NET_UNKNOWN = 'UNKNOWN';
{ TNetBroadcastReceiverListener }
procedure TNetworkChangeReceiver.onReceive(context: JContext; intent: JIntent);
begin
// 这里可以加入一些过滤处理
if Assigned(FOnBroadcastReceiverEvent) then
FOnBroadcastReceiverEvent(context, intent);
end;
{ TNetStatusInfo }
constructor TNetStatusInfo.Create(NetworkChangedEvent: TNetworkChangedEvent);
begin
inherited Create;
FNetworkChangedEvent := NetworkChangedEvent;
InitClass;
if IsWifi then begin
FCurrentNetName := NET_WIFI;
end else if IsMobile then begin
FCurrentNetName := NET_MOBILE;
end else begin
FCurrentNetName := NET_UNKNOWN;
end;
end;
destructor TNetStatusInfo.Destroy;
begin
TAndroidHelper.context.unregisterReceiver(FReceiver);
inherited;
end;
procedure TNetStatusInfo.FireNetworkChangedEvent(Action: string);
begin
if (CompareStr(FCurrentNetName, Action) <> 0) and Assigned(FNetworkChangedEvent) then begin
FCurrentNetName := Action;
FNetworkChangedEvent(Action);
end;
end;
procedure TNetStatusInfo.InitClass;
var
ConnectivityServiceNative: JObject;
begin
if not Assigned(FConnectivityManager) then
begin
ConnectivityServiceNative := TAndroidHelper.context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
if not Assigned(ConnectivityServiceNative) then begin
Exit;
end;
FConnectivityManager := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);
if not Assigned(FConnectivityManager) then begin
Exit;
end;
FListener := TNetworkChangeReceiver.Create;
FListener.OnBroadcastReceiverEvent := OnNetworkChangedEvent;
FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener);
if not Assigned(FReceiver) then begin
Exit;
end;
FFilter := TJIntentFilter.JavaClass.init(StringToJString(NET_STATUS_RECEIVER));
if not Assigned(FFilter) then begin
Exit;
end;
FFilter.addAction(StringToJString('android.net.conn.CONNECTIVITY_CHANGE'));
FFilter.addCategory(StringToJString('android.intent.category.DEFAULT'));
TAndroidHelper.context.registerReceiver(FReceiver, FFilter);
end;
end;
function TNetStatusInfo.IsMobile: Boolean;
var
Mobile: JNetworkInfo;
begin
if Assigned(FConnectivityManager) then begin
Mobile := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
if Assigned(Mobile) then begin
Exit(Mobile.isConnectedOrConnecting);
end;
end;
Result := False;
end;
function TNetStatusInfo.IsWifi: Boolean;
var
Wifi: JNetworkInfo;
begin
if Assigned(FConnectivityManager) then begin
Wifi := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
if Assigned(Wifi) then begin
Exit(Wifi.isConnectedOrConnecting);
end;
end;
Result := False;
end;
procedure TNetStatusInfo.OnNetworkChangedEvent(context: JContext; intent: JIntent);
var
Wifi, Mobile: JNetworkInfo;
begin
if Assigned(FConnectivityManager) then
begin
Wifi := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
if Assigned(Wifi) and Wifi.isConnectedOrConnecting then begin
FireNetworkChangedEvent(NET_WIFI);
Exit;
end else begin
Mobile := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
if Assigned(Mobile) and Mobile.isConnectedOrConnecting then begin
FireNetworkChangedEvent(NET_MOBILE);
Exit;
end;
end;
end;
FireNetworkChangedEvent(NET_UNKNOWN);
end;
end.