如何在Delphi 10.4.1应用程序中从Zebra TC21扫描仪接收Android意图
我正在用Delphi10.4.1开发一个Android应用程序,部署在Zebra TC21上。我正在尝试从DataWedget intent接收条形码,但我的应用程序中的HandleIntentAction没有启动。Zebra TC21扫描仪配置:安卓10,DataWedge版本8.2.60。我读了一些关于Delphi中接收意图、Embarcadero示例、DataWedge配置演示的文章,但仍然无法解决这个问题。有人能帮我吗 “MyTest”应用程序(pl.dplodz.MyTest):如何在Delphi 10.4.1应用程序中从Zebra TC21扫描仪接收Android意图,delphi,android-intent,Delphi,Android Intent,我正在用Delphi10.4.1开发一个Android应用程序,部署在Zebra TC21上。我正在尝试从DataWedget intent接收条形码,但我的应用程序中的HandleIntentAction没有启动。Zebra TC21扫描仪配置:安卓10,DataWedge版本8.2.60。我读了一些关于Delphi中接收意图、Embarcadero示例、DataWedge配置演示的文章,但仍然无法解决这个问题。有人能帮我吗 “MyTest”应用程序(pl.dplodz.MyTest): 我在
我在扫描代码时听到一声蜂鸣声,但应用程序上什么也没发生。问题在哪里?在DataWedge配置中?在应用程序中?根据我的评论,如果您通过RegisterInputAction处理意图,则需要将意图传递设置为启动活动 但是,您可以通过在代码中创建接收器来接收广播意图。在这种情况下,您的应用程序需要已经运行,但这里有一个可能的实现:
uses
Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText;
type
TDataWedgeDataEvent = procedure(Sender: TObject; const Data: string) of object;
TDataWedgeBroadcastListener = class(TJavaLocal, JFMXBroadcastReceiverListener)
private
FReceiver: JBroadcastReceiver;
FOnData: TDataWedgeDataEvent;
public
{ JFMXBroadcastReceiverListener }
procedure onReceive(context: JContext; intent: JIntent); cdecl;
public
constructor Create;
destructor Destroy; override;
property OnData: TDataWedgeDataEvent read FOnData write FOnData;
end;
implementation
uses
Androidapi.Helpers;
{ TDataWedgeBroadcastListener }
constructor TDataWedgeBroadcastListener.Create;
var
LIntentFilter: JIntentFilter;
begin
inherited;
FReceiver := TJFMXBroadcastReceiver.JavaClass.init(Self);
LIntentFilter := TJIntentFilter.JavaClass.init;
LIntentFilter.addAction(StringToJString('pl.dplodz.ACTION')); // or whatever value the profile is configured for
LIntentFilter.addCategory(StringToJString('android.intent.category.DEFAULT'));
TAndroidHelper.Context.registerReceiver(FReceiver, LIntentFilter);
end;
destructor TDataWedgeBroadcastListener.Destroy;
begin
TAndroidHelper.Context.unregisterReceiver(FReceiver);
inherited;
end;
procedure TDataWedgeBroadcastListener.onReceive(context: JContext; intent: JIntent);
begin
if (intent <> nil) and Assigned(FOnData) then
FOnData(Self, JStringToString(intent.getStringExtra(StringToJString('com.symbol.datawedge.data_string'))));
end;
使用
Androidapi.JNIBridge、Androidapi.JNI.Embarcadero、Androidapi.JNI.GraphicsContentViewText;
类型
tdatawedgedaatevent=对象的过程(发送方:TObject;常量数据:string);
TDataWedgeBroadcastListener=class(TJavaLocal,JFMXBroadcastReceiverListener)
私有的
收信人:JBroadcastReceiver;
FOnData:TDataWedgeDataEvent;
公众的
{jfmxbroadcasterivelistener}
过程onReceive(上下文:JContext;意图:JIntent);cdecl;
公众的
构造函数创建;
毁灭者毁灭;推翻
属性OnData:TDataWedgeDataEvent读取FOnData写入FOnData数据;
结束;
实施
使用
帮手;
{TDataWedgeBroadcastListener}
构造函数TDataWedgeBroadcastListener.Create;
变量
LIntentFilter:JIntentFilter;
开始
继承;
FReceiver:=TJFMXBroadcastReceiver.JavaClass.init(Self);
LIntentFilter:=TJIntentFilter.JavaClass.init;
LIntentFilter.addAction(StringToJString('pl.dplodz.ACTION');//或者配置配置文件的任何值
addCategory(StringToJString('android.intent.category.DEFAULT');
TAndroidHelper.Context.registerReceiver(FReceiver,LIntentFilter);
结束;
析构函数TDataWedgeBroadcastListener.Destroy;
开始
TAndroidHelper.Context.unregistereceptor(FReceiver);
继承;
结束;
过程TDataWedgeBroadcastListener.onReceive(上下文:JContext;意图:JIntent);
开始
如果(意图为零)并分配(FOnData),则
FOnData(Self,JStringToString(intent.getStringExtra(StringToJString('com.symbol.datawedge.data_string')));
结束;
创建TDataWedgeBroadcastListener的实例并连接到OnData事件。使用此方法,您无需在清单中设置意图过滤器如果您通过RegisterInputAction处理意图,则需要将意图传递设置为启动活动Hello Dave,我检查了建议的解决方案(通过StartActivity发送意图和通过TDataWedgeBroadcastListener类广播发送),这两种方法都非常有效。多谢各位@DPLodz如果这个答案对您有效,您能将其标记为“已接受”吗?谢谢
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="%package%"
android:versionCode="%versionCode%"
android:versionName="%versionName%"
android:installLocation="%installLocation%">
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%"
android:hardwareAccelerated="%hardwareAccelerated%"
android:resizeableActivity="false"
android:requestLegacyExternalStorage="true">
<%provider%>
<%application-meta-data%>
<%uses-libraries%>
<%services%>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="%libNameValue%" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="pl.dplodz.ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<%activity%>
<%receivers%>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
New profile: "MyTest", key configuration:
Profile Enabled
Associated Apps: "com.embarcadero.firemonkey.FMXNativeActivity | pl.dplodz.MyTest"
Barcode Input: Enabled
Keystroke Output: Disabled
Intent Output section:
Intent action: pl.dplodz.ACTION
Intent category: android.intent.category.DEFAULT (btw. I tested with empty value - no changes)
Intent delivery: Broadcast intent
Component Information: [empty]
uses
Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText;
type
TDataWedgeDataEvent = procedure(Sender: TObject; const Data: string) of object;
TDataWedgeBroadcastListener = class(TJavaLocal, JFMXBroadcastReceiverListener)
private
FReceiver: JBroadcastReceiver;
FOnData: TDataWedgeDataEvent;
public
{ JFMXBroadcastReceiverListener }
procedure onReceive(context: JContext; intent: JIntent); cdecl;
public
constructor Create;
destructor Destroy; override;
property OnData: TDataWedgeDataEvent read FOnData write FOnData;
end;
implementation
uses
Androidapi.Helpers;
{ TDataWedgeBroadcastListener }
constructor TDataWedgeBroadcastListener.Create;
var
LIntentFilter: JIntentFilter;
begin
inherited;
FReceiver := TJFMXBroadcastReceiver.JavaClass.init(Self);
LIntentFilter := TJIntentFilter.JavaClass.init;
LIntentFilter.addAction(StringToJString('pl.dplodz.ACTION')); // or whatever value the profile is configured for
LIntentFilter.addCategory(StringToJString('android.intent.category.DEFAULT'));
TAndroidHelper.Context.registerReceiver(FReceiver, LIntentFilter);
end;
destructor TDataWedgeBroadcastListener.Destroy;
begin
TAndroidHelper.Context.unregisterReceiver(FReceiver);
inherited;
end;
procedure TDataWedgeBroadcastListener.onReceive(context: JContext; intent: JIntent);
begin
if (intent <> nil) and Assigned(FOnData) then
FOnData(Self, JStringToString(intent.getStringExtra(StringToJString('com.symbol.datawedge.data_string'))));
end;