Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi 10.4.1应用程序中从Zebra TC21扫描仪接收Android意图_Delphi_Android Intent - Fatal编程技术网

如何在Delphi 10.4.1应用程序中从Zebra TC21扫描仪接收Android意图

如何在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): 我在

我正在用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;