zoukankan      html  css  js  c++  java
  • Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)

    在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;
  • 相关阅读:
    关于android的一些博文收集
    关于Synchronized关键字锁住对象的嵌套问题
    eclipse个人觉得有用的快捷键
    关于android 数据库查询出现 _id column do not exist 的处理
    【转】经典网文:追MM与设计模式
    Maven学习总结(28)——Maven+Nexus+Myeclipse集成
    Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档
    Windows学习总结(7)——学会CMD命令提示符的重要性
    ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听
    SVN学习总结(3)——分支合并
  • 原文地址:https://www.cnblogs.com/hezihang/p/3978434.html
Copyright © 2011-2022 走看看