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;
Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)的更多相关文章
- delphi 获取USB口拔出和插入的状态
unit USBDeviceNotify;//USB Device arrival or removeinterface uses Windows, Messages, SysUtils, Clas ...
- Delphi xe7 android实现透明度可以调整的对话框
Delphi xe7 android实现透明度可以调整的对话框 Delphi xe7 android实现透明度可以调整的对话框 Delphi xe7 android实现透明度可以调整的对话框 要实现对 ...
- Delphi for Android (aka Delphi XE5 aka RAD Studio XE5) has appeared
Delphi for Android (aka Delphi XE5 aka RAD Studio XE5) has appeared Blimey, that took me by surpri ...
- Xamarin. Android实现下拉刷新功能
PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...
- [转]Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
版权声明:本文出自郭霖的博客,转载必须注明出处. 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9255575 最近项目中需要用到L ...
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能 (转)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9255575 最 近项目中需要用到ListView下拉刷新的功能,一开始想图省事,在 ...
- android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)
Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...
- Delphi在Android下使用Java库
本文将以Android的USB串口通讯库为例,介绍Delphi如何在Android中使用Java的库. USB串口通讯库地址: https://github.com/felHR85/UsbSerial ...
- Android StaggeredGrid 加下拉刷新功能 PullToRefresh
https://github.com/etsy/AndroidStaggeredGrid 用的github上面提供瀑布流,继承于abslistview,回收机制不错,并且提供了OnScrollLis ...
随机推荐
- c#多线程调用有参数的方法
Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. Thread (ThreadStart) 初始 ...
- 加域(Netdom)
客户端运行: netdom.exe join %computername% /domain:testw.com /userd:testw\adadmin /passwordd:boc.123 /reb ...
- Linux sftp命令详解
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的网络的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 ...
- npm ERR! path: '/usr/local/lib/node_modules/npm/node_modules/cacache/node_modules/ssri' }
在安装appium 或者升级npm的过程中会遇到这个问题.出错时的代码提示如下: npm ERR! path /usr/local/lib/node_modules/npm/node_modules/ ...
- 认识 Java(配置环境变量)
1. Java 简介 Java由Sun Microsystems公司于1995年5月推出,是一种面向对象的编程语言.在2009年4月20号,ORACLE (甲骨文)收购了 Sun 公司,也就是说 Ja ...
- Python2.7 - IMOOC - 4
第三章 Python变量和数据类型 3-7.Unicode字符串 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比特(bit)作为一个字节(b ...
- JAVAWEB之文件的上传下载
文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...
- centos 7.0 查看selinux状态|关闭|开启
Linux在安装好之后通常SELinux都是出于默认开启的状态,开启的情况下会导致一些服务的安装不成功. 在不需要的情况下完全可以关闭掉,下面是在centos 7.0里面如何查看,关闭selinux. ...
- Linux学习总结(十五)文件查找 which whereis locate find
which命令 用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录.which指令会在环境变量$PATH设置的目录里查找符合条件的文件.也就是说,使用which命令,就 ...
- 33、springboot整合springcloud
Spring Cloud Spring Cloud是一个分布式的整体解决方案.Spring Cloud 为开发者提供了在分布式系统 (配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token ...