• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息。可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java的BroadcastReceiver功能呢?

幸运的是Delphi提供了TJFMXBroadcastReceiver类实现了BroadcastReceiver,我们便可以以此达到目的。

下面的程序片段举例,实现如何在Delphi下获取USB外设拔插的消息。

 

 

uses System.SysUtils, System.Classes,
  System.Generics.Collections,
  Androidapi.JNI.USB,
  Androidapi.JNI.Embarcadero,
  Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.App,
  Androidapi.JNI.os,...;

  TUsbFtdiBroadcastReceiverListener = class(TJavaLocal, JFMXBroadcastReceiverListener)
  private
    [Weak] FPort: TFTDIPort;
  public
    constructor Create(const Owner: TFTDIPort);
    procedure onReceive(context: JContext; intent: JIntent); cdecl;
  end;

  TFTDIPort = class(TInterfacedObject, ICommPort)
  protected
    class var FManager: JD2xxManager;
    class var FListener : TUsbFtdiBroadcastReceiverListener;
    class var FReceiver: JFMXBroadcastReceiver;
    class var FUsbManager:JUsbManager;
    class var FFilter:JIntentFilter;
    class procedure InitClass(Port:TFtdiPort);
  public
    function Connect(Device : String): Boolean;
    procedure Disconnect;
    ...... 
  end;



{ TUsbFtdiBroadcastReceiverListener }
const
  ACTION_USB_PERMISSION='com.android.example.USB_PERMISSION';

constructor TUsbFtdiBroadcastReceiverListener.Create(const Owner: TFtdiPort);
begin
  inherited Create;
  FPort:=Owner;
end;

procedure TUsbFtdiBroadcastReceiverListener.onReceive(context: JContext;
  intent: JIntent);
var
  action:String;
  Accessory:JUsbAccessory;
begin
  action:=JStringToString(intent.getAction);
  if action=ACTION_USB_PERMISSION then
  begin
    if (intent.getBooleanExtra(TJUsbManager.JavaClass.EXTRA_PERMISSION_GRANTED, False)) then
    begin
      Accessory:= TJUsbAccessory.Wrap(intent.getParcelableExtra(TJUsbManager.JavaClass.EXTRA_ACCESSORY));
      if JStringToString(Accessory.getManufacturer)='FTDI' then
      begin
        FPort.Connect(JStringToString(Accessory.toString));
      end;
    end;
  end
  else if (action=TJUsbManager_ACTION_USB_DEVICE_DETACHED) then
  begin
    FPort.Disconnect;
  end
  else
  begin
  end;
end;

class procedure TFtdiPort.InitClass(Port:TFdiPort);
beginif not Assigned(FUsbManager) then
  begin
    FUsbManager := TJUsbManager.Wrap(SharedActivityContext.getSystemService(TJContext.JavaClass.USB_SERVICE));
    if not Assigned(FUsbManager) then Exit;
    FListener := TUsbFtdiBroadcastReceiverListener.Create(Port);
    if not Assigned(FListener) then Exit;
    FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener);
    if not Assigned(FReceiver) then Exit;

    FFilter:=TJIntentFilter.JavaClass.init(StringToJString(ACTION_USB_PERMISSION));
    if not Assigned(FFilter) then Exit;
    FFilter.addAction(TJUsbManager.JavaClass.ACTION_USB_ACCESSORY_DETACHED);

    SharedActivityContext.registerReceiver(FReceiver, FFilter);
  end;
end;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
《zw版·Halcon-delphi系列原创教程》Halcon分类函数015,vector矢量发布时间:2022-07-18
下一篇:
Qt调用Delphi编写的COM组件发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap