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 ...
随机推荐
- Android根据URL下载文件保存到SD卡
//下载具体操作 private void download() { try { URL url = new URL(downloadUrl); //打开连接 URLConnection conn = ...
- Spring Cloud中,Eureka常见问题总结
Spring Cloud中,Eureka常见问题总结. 1 eureka.environment: 指定环境 参考文档: 1 eureka.datacenter: 指定数据中心 参考文档: 使用配置项 ...
- linux用户的增加与删除
sudo useradd xxx 仅仅是添加用户, 不会在home目录添加帐号很简单 Ubuntu中提供了两种方式 图形界面 增加 和 Windows 一样 ,还有一种就是 Linux传统的 增加方法 ...
- 关于Ubuntu16.04下phpmyadmin出现mbstring错误的正解
1.打开终端,输入php -i | grep extension_dir 查看extension_dir的绝对路径 2.查看phpinfo,php.ini的绝对路径 3.打开php.ini文件. 设置 ...
- 关于hashcode 里面 使用31 系数的问题
首先我们来了解一下hashcode,什么是hashcode?有什么作用? hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象! 我们在使用容器来存储数据的时候会计算 ...
- [翻译] TLTagsControl
TLTagsControl https://github.com/ali312/TLTagsControl#tltagscontrol A nice and simple tags input con ...
- django导入/导出原始数据
1.使用dumpdata命令导出指定app对应数据库中的数据: python manage.py dumpdata your_app --indent 4 > your_app/fixture ...
- rabbitmq集群方案
RabbitMQ的集群方案有以下几种: 1.普通的集群 exchange,buindling再所有的节点上都会保存一份,但是queue只会存储在其中的一个节点上,但是所有的节点都会存储一份queue的 ...
- java抽象类,接口与异常
1.抽象类: 定义;包含一个抽象方法的类称称为抽象类,抽象类在class前使用adstract关键词修饰. 抽象方法;只声明未实现的方法称为抽象方法,使用adstract关键字声明该方法. 抽象类定义 ...
- codeforces 808G Anthem of Berland
codeforces 808G Anthem of Berland 题面 给定\(s\)串和\(t\)串,字符集是小写字母.\(s\)串中有些位置的值不确定,要求你确定这些位置上的值,使得\(t\)在 ...