irpas技术客

【Delphi】开发Android系统状态感知控件_sensor_WU_android delphi

大大的周 2264

?

在开发Android系统的时候,我们App需要实时获知系统状态的变化,例如:蓝牙状态的变化(连接、断开)、WIFI状态的变化(打开、关闭)等。为此,专门封装了一个控件类(TReceiver_State),使用该类可以非常方便的在我们的App中感知到系统状态的变化。

目前控件能够感知的Android系统状态包括:蓝牙、WIFI、电源、网络。通过源代码,可以很容易的增加其它的状态变化感知。

控件的使用:

?//1. 创建控件 ? ? ? FReceiver_State := TReceiver_State.Create; ?//2. 设置需要监听的类别 ? ? ? FReceiver_State.Receivers = [mtBlueToothState,mtWIFIState,mtPowerState]; ? //3. 设置处理事件 ? ? ? FReceiver_State.OnStateChange := OnStateChange; ?//处理事件 ? //4. 打开监听 ? ? ??FReceiver_State.Register_Reveiver(errmsg); ? //5. 关闭监听 ? ? ? ?FReceiver_State.UnRegister_Reveiver;

通过控件的Receivers 属性来设置需要感知的消息类别:

//接收消息类型 TMsgType = (mtBlueToothState,mtWIFIState,mtPowerState,mtNetConnectState);

mtBlueToothState:蓝牙, mtWIFIState:WI-FI, mtPowerState:电源, mtNetConnectState:网络

通过OnStateChange事件来感知系统状态的变化。

//消息记录体 TmyMSG = record msg_TYPE : TMsgType; //消息类型 msg_Content: string; //消息描述,目前可以不用 msg_State : Integer; //消息实际状态值 end; TOnStateChange = procedure(const Sender: TObject; const State : TmyMSG) of object;

OnStateChange(const Sender: TObject; const State : TmyMSG); ? ? ? ?事件参数State说明: ? ? ? ?1. 蓝牙事件 ?TmyMSG.msg_Content 代表蓝牙状态描述文字 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TmyMSG.msg_State ? 代表蓝牙状态字,数字型 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?详细参见:TBlueToothState ? ? ? ?2. WIFI事件 ?详见:TWIFIState ? ? ? ?3. 电源事件 ?TmyMSG.msg_Content 返回一个JSON字符串,说明电源情况 ? ? ? ? ? ? ? ? ? ? TmyMSG.msg_State ? 返回电池的电压 毫伏数 ? ? ? ? ? ? ? ? ? ? 电源JSON说明: ? ? ? ? ? ? ? ? ? ? "level": 80, ? ? ? ? ? ? ?//当前电池余量 80% ? ? ? ? ? ? ? ? ? ? "plugged": "true|false", ?//是否正在充电,不区分USB充电还是电源充电 ? ? ? ? ? ? ? ? ? ? "voltage": 4200 ? ? ? ? ? //电池电压数,毫伏 ? ? ? ?4. 网络事件 ?TmyMSG.msg_Content 返回一个JSON字符串,说明网络情况 ? ? ? ? ? ? ? ? ? ? TmyMSG.msg_State ? 返回网络连接类型 0:Mobile ?1:WIFI ?7:BlueTooth ? ? ? ? ? ? ? ? ? ? 网络JSON说明: ? ? ? ? ? ? ? ? ? ? "EXTRA_NETWORK_TYPE": "Mobile|WIFI|BlueTooth|Other"), //网络类型 ? ? ? ? ? ? ? ? ? ? "EXTRA_EXTRA_INFO": "ctnet", ? //附加信息 ? ? ? ? ? ? ? ? ? ? "EXTRA_NO_CONNECTIVITY": "true|false", ? //网络是否没有连接 ?true 表示网络没有连接,false 表示网络连接

通过Register_Reveiver(errmsg)函数?来打开系统广播消息接收,该函数返回true,表示打开成功,否则表示打开失败,失败的原因是errmsg。

通过UnRegister_Reveiver函数关闭广播消息接收。

原理说明:

通过实现JFMXBroadcastReceiverListener类的onReceive事件来接收系统状态变化消息。

// 接收系统通知消息类 TBroadcastReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener) public // 实现接收事件 procedure onReceive(context: JContext; intent: JIntent); cdecl; end; procedure TBroadcastReceiver.onReceive(context: JContext; intent: JIntent); var action,S: String; iState: Integer; FmyMSG: TmyMSG; myMessage : TMessage; jo : TJSONObject; B : Boolean; begin action := JStringToString( intent.getAction ); //网络连接广播 { 'android.net.conn.CONNECTIVITY_CHANGE'} if action = JStringToString(TJConnectivityManager.JavaClass.CONNECTIVITY_ACTION) then begin iState := intent.getIntExtra( TJConnectivityManager.JavaClass.EXTRA_NETWORK_TYPE,0); FmyMSG.msg_State := iState; FmyMSG.msg_TYPE := TMsgType.mtNetConnectState; jo := TJSONObject.Create; try //1、获取网络类型 iState := intent.getIntExtra( TJConnectivityManager.JavaClass.EXTRA_NETWORK_TYPE,0); case iState of 0 : jo.AddPair('EXTRA_NETWORK_TYPE','Mobile'); //手机流量 1 : jo.AddPair('EXTRA_NETWORK_TYPE','WIFI'); //WIFI 7 : jo.AddPair('EXTRA_NETWORK_TYPE','BlueTooth'); //BlueTooth else //其它 jo.AddPair('EXTRA_NETWORK_TYPE','Other'); end; //2、获取网络信息 S := JStringToString( intent.getStringExtra(TJConnectivityManager.JavaClass.EXTRA_EXTRA_INFO)); jo.AddPair('EXTRA_EXTRA_INFO',S); //3、 EXTRA_NO_CONNECTIVITY B := intent.getBooleanExtra(TJConnectivityManager.JavaClass.EXTRA_NO_CONNECTIVITY,false); if B then jo.AddPair('EXTRA_NO_CONNECTIVITY','true') else jo.AddPair('EXTRA_NO_CONNECTIVITY','false'); FmyMSG.msg_Content := jo.ToString; finally jo.Free; end; myMessage := TMessage<TmyMSG>.Create(FmyMSG); TMessageManager.DefaultManager.SendMessage(nil,myMessage,True); Exit; end; //1. 处理蓝牙广播消息 if action = JStringToString(TJBluetoothAdapter.JavaClass.ACTION_STATE_CHANGED) then begin //获取蓝牙状态 iState := intent.getIntExtra( TJBluetoothAdapter.JavaClass.EXTRA_STATE ,0); FmyMSG.msg_State := iState; FmyMSG.msg_TYPE := TMsgType.mtBlueToothState; case FmyMSG.msg_State of 2 : FmyMSG.msg_Content := 'STATE_CONNECTED'; //bts_STATE_CONNECTED 2 1 : FmyMSG.msg_Content := 'STATE_CONNECTING'; //bts_STATE_CONNECTING 1 0 : FmyMSG.msg_Content := 'STATE_DISCONNECTED'; //bts_STATE_DISCONNECTED 0 3 : FmyMSG.msg_Content := 'DISCONNECTING'; //bts_STATE_DISCONNECTING 3 10: FmyMSG.msg_Content := 'STATE_OFF'; //bts_STATE_OFF 10 12: FmyMSG.msg_Content := 'STATE_ON'; //bts_STATE_ON 12 13: FmyMSG.msg_Content := 'STATE_TURNING_OFF'; //bts_STATE_TURNING_OFF 13 11: FmyMSG.msg_Content := 'STATE_TURNING_ON'; //bts_STATE_TURNING_ON 11 end; //通知控件处理此事件 myMessage := TMessage<TmyMSG>.Create(FmyMSG); TMessageManager.DefaultManager.SendMessage(nil,myMessage,True); Exit; end; //2. 处理WIFI广播消息 if action = JStringToString(TJWifiManager.JavaClass.WIFI_STATE_CHANGED_ACTION) then begin //获取WIFI状态 iState := intent.getIntExtra( TJWifiManager.JavaClass.EXTRA_WIFI_STATE ,0); FmyMSG.msg_State := iState; FmyMSG.msg_TYPE := TMsgType.mtWIFIState; case FmyMSG.msg_State of 1: FmyMSG.msg_Content := 'WIFI_STATE_DISABLED'; // wfs_WIFI_STATE_DISABLED = 1 0: FmyMSG.msg_Content := 'WIFI_STATE_DISABLING'; // wfs_WIFI_STATE_DISABLING = 0, 3: FmyMSG.msg_Content := 'WIFI_STATE_ENABLED'; // wfs_WIFI_STATE_ENABLED = 3, 2: FmyMSG.msg_Content := 'WIFI_STATE_ENABLING'; // wfs_WIFI_STATE_ENABLING = 2, 4: FmyMSG.msg_Content := 'WIFI_STATE_UNKNOWN'; // wfs_WIFI_STATE_UNKNOWN = 4 end; //通知控件处理此事件 myMessage := TMessage<TmyMSG>.Create(FmyMSG); TMessageManager.DefaultManager.SendMessage(nil,myMessage,True); Exit; end; //3. 处理电源变化 if action = 'android.intent.action.BATTERY_CHANGED' then begin FmyMSG.msg_TYPE := mtPowerState; jo := TJSONObject.Create; try //获取电源电量 参考:http://·/reference/android/os/BatteryManager.html#EXTRA_LEVEL iState := intent.getIntExtra(StringToJString('level') ,0); jo.AddPair('level',iState.ToString); //是否插上电源, 0 means it is on battery, other constants are different types of power sources. iState := intent.getIntExtra(StringToJString('plugged') ,0); if iState <> 0 then jo.AddPair('plugged','true') else jo.AddPair('plugged','false'); //是否是电池供电 //iState := intent.getIntExtra(StringToJString('present') ,0); //jo.AddPair('present',iState); //电池温度 //iState := intent.getIntExtra(StringToJString('temperature') ,0); //jo.AddPair('temperature',iState); //电池电压 iState := intent.getIntExtra(StringToJString('voltage') ,0); jo.AddPair('voltage',iState.ToString); FmyMSG.msg_Content := jo.ToString; finally jo.Free; end; iState := intent.getIntExtra(StringToJString('level') ,0); FmyMSG.msg_State := iState; //通知控件处理此事件 myMessage := TMessage<TmyMSG>.Create(FmyMSG); TMessageManager.DefaultManager.SendMessage(nil,myMessage,True); Exit; end; end;

演示程序APK下载(无需积分下载)

控件TReceiver_State源代码及演示程序源代码(包含D10.1和D11版本)下载(需要积分下载,如果你确实没有积分又需要这个控件源代码,请扫描下方微信联系我发给你)

?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Android #delphi