Delphi Android 移動應用程式是使用 Delphi Alexandria (Delphi 11.1) 構建的。
我收到來自 Zebra 條碼掃描儀設備的廣播。
我嘗試從商米設備和 Unitech 設備接收廣播,但它不起作用。
商米和 Unitech 都配置為使用廣播輸出條碼。
應用程式清單檔案:
<!-- Zebra - OK -->
<intent-filter>
<action android:name="fr.XXX.YYY.ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<!-- SUNMI - Ko -->
<action android:name="com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<!-- Unitech - Ko -->
<action android:name="unitech.scanservice.data" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
在我的代碼中,我注冊了意圖:
MainActivity.registerIntentAction(StringToJString(bcZebra));
MainActivity.registerIntentAction(StringToJString(bcSunmi));
MainActivity.registerIntentAction(StringToJString(bcUnitech));
然后我以這種方式處理廣播:
function TfData.HandleIntentAction(const Data: JIntent): Boolean;
var bc : string;
begin
TOSLog.d('********* SCAN ******************');
TOSLog.d(JStringToString(Data.getAction));
Result := False;
if Data <> nil then begin
// Zebra, bcZebraData = com.symbol.datawedge.data_string - Ok
if StringToJString(bcZebra).equals(Data.getAction) then begin
bc := JStringToString(Data.getStringExtra(StringToJString(bcZebraData)));
result := true;
bcScan(bc);
end
// Sunmi, bcSunmiData = 'data' - Ko
else if StringToJString(bcSunmi).equals(Data.getAction) then begin
bc := JStringToString(Data.getStringExtra(StringToJString(bcSunmiData)));
result := true;
bcScan(bc);
end
// Unitech, bcUnitechData = 'text' - Ko
else if StringToJString(bcUnitech).equals(Data.getAction) then begin
bc := JStringToString(Data.getStringExtra(StringToJString(bcUnitechData)));
result := true;
bcScan(bc);
end;
end;
end;
當我使用 Zebra 設備掃描條形碼時,我可以在日志控制臺中看到:
********* SCAN ******************
fr.XXX.YYY.ACTION
我在商米和 Unitech 上沒有看到,所以沒有呼叫該函式。
但是,當我使用 Sunmi 設備進行掃描時,我會在一般日志中得到以下資訊:
從系統 1269:com.sunmi.scanner/u0a74 pkg com.sunmi.scanner 發送不受保護的廣播 com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED
與 Unitech :
10-28 18:44:30.199: E/ActivityManager(1178): 從系統 2360:com.unitech.scanservice/1000 pkg com.unitech.scanservice 發送不受保護的廣播 unitech.scanservice.data
我無法弄清楚我錯過了什么,并且由于 Zebra 在發送廣播時不記錄任何內容,因此我無法比較其他 2 臺設備。
uj5u.com熱心網友回復:
快速瀏覽一下 Sunmi 和 Unitech 的檔案表明您需要使用已注冊的 BroadcastReceiver 來執行此操作,并使用適當的操作。以下代碼基于舊Kastri Free 存盤庫中的內容。
第一個是一個單元,它定義了一個可以處理任何動作的類:
unit MultiReceiver;
interface
uses
Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Embarcadero;
type
TMultiReceiver = class;
TMultiReceiverListener = class(TJavaLocal, JFMXBroadcastReceiverListener)
private
FMultiReceiver: TMultiReceiver;
public
{ JFMXBroadcastReceiverListener }
procedure onReceive(context: JContext; intent: JIntent); cdecl;
public
constructor Create(const AMultiReceiver: TMultiReceiver);
end;
TIntentEvent = procedure(Sender: TObject; const Intent: JIntent) of object;
TMultiReceiver = class(TObject)
private
FBroadcastReceiver: JFMXBroadcastReceiver;
FIntentFilter: JIntentFilter;
FReceiverListener: TMultiReceiverListener;
FOnIntent: TIntentEvent;
protected
procedure Receive(context: JContext; intent: JIntent); virtual;
procedure ConfigureActions; virtual; abstract;
property IntentFilter: JIntentFilter read FIntentFilter;
public
constructor Create;
destructor Destroy; override;
property OnIntent: TIntentEvent read FOnIntent write FOnIntent;
end;
implementation
uses
Androidapi.Helpers;
{ TMultiReceiverListener }
constructor TMultiReceiverListener.Create(const AMultiReceiver: TMultiReceiver);
begin
inherited Create;
FMultiReceiver := AMultiReceiver;
end;
procedure TMultiReceiverListener.onReceive(context: JContext; intent: JIntent);
begin
FMultiReceiver.Receive(context, intent);
end;
{ TMultiReceiver }
constructor TMultiReceiver.Create;
begin
inherited Create;
FReceiverListener := TMultiReceiverListener.Create(Self);
FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FReceiverListener);
FIntentFilter := TJIntentFilter.JavaClass.init;
ConfigureActions;
TAndroidHelper.Context.registerReceiver(FBroadcastReceiver, FIntentFilter)
end;
destructor TMultiReceiver.Destroy;
begin
TAndroidHelper.Context.unregisterReceiver(FBroadcastReceiver)
end;
procedure TMultiReceiver.Receive(context: JContext; intent: JIntent);
begin
if Assigned(FOnIntent) then
FOnIntent(Self, intent);
end;
end.
然后是如何使用它的示例:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
MultiReceiver;
type
TScannerReceiver = class(TMultiReceiver)
protected
procedure ConfigureActions; override;
end;
TForm1 = class(TForm)
private
FScannerReceiver: TScannerReceiver;
procedure ScannerReceiverIntentHandler(Sender: TObject; const AIntent: JIntent);
public
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses
Androidapi.Helpers;
const
cActionSunmi = 'com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED';
cActionUnitech = 'unitech.scanservice.data';
{ TScannerReceiver }
procedure TScannerReceiver.ConfigureActions;
begin
IntentFilter.addAction(StringToJString(cActionSunmi));
IntentFilter.addAction(StringToJString(cActionUnitech));
end;
{ TForm1 }
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
FScannerReceiver := TScannerReceiver.Create;
FScannerReceiver.OnIntent := ScannerReceiverIntentHandler;
end;
procedure TForm1.ScannerReceiverIntentHandler(Sender: TObject; const AIntent: JIntent);
begin
if AIntent.getAction.Equals(StringToJString(cActionSunmi)) then
begin
// Handle Sunmi
end
else if AIntent.getAction.Equals(StringToJString(cActionUnitech)) then
begin
// Handle Unitech
end;
end;
end.
注意:這是完全未經測驗的,因為我沒有任何一個模型由它處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/525726.html
標籤:安卓德尔福
