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# 获取程序目录
取得控制台应用程序的根目录方法1:Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径2:AppDomain.CurrentDomain.BaseDirect ...
- Windows Azure系列公开课 - 第二课:为什么选择Windows Azure(上)
Windows Azure是微软的云平台,可以提供广泛服务.您可以通过它搭建.部署并管理解决方案,用于实现您可以想象的几乎任何目标.换言之,WindowsAzure是拥有无限可能的世界.无论您是需要运 ...
- Angular5中提取公共组件之checkbox list
因为工作原因,需要使用到checkbox list多选项功能. 一直在尝试在checkbox组件中添加NgModel的属性,但是只能在单个checkbox复选框上使用,checkbox list就没办 ...
- Delphi IDHTTP用法详解
一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入 ...
- Java学习---下载文件并且对文件编码
import java.io.IOException; import java.net.URLEncoder; import sun.misc.BASE64Encoder; public class ...
- 企业级Nginx基于虚拟主机别名的设置
生活中访问www.baidu.com和baidu.com是一个效果,同理也可以用rewrite 301跳转的思路(多发了一次请求过去)配置nginx.conf文件或者include里面的引用的文件,道 ...
- 组合数计算-java
排列组合是计算应用经常使用的算法,通常使用递归的方式计算,但是由于n!的过于大,暴力计算很不明智.一般使用以下两种方式计算. 一,递归的思想:假设m中取n个数计算排列组合数,表示为comb(m,n). ...
- ZT 线程的分离状态 2012-08-16 17:00:59
线程的分离状态 2012-08-16 17:00:59 分类: LINUX 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的时候都是显示创建线程失败,我就百度了一下, ...
- 解决Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly
项目测试发生问题,方法正常结束,但是报了 Could not commit JPA transaction; nested exception is javax.persistence.Rollbac ...
- jq封装-无缝滚动效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...