FireMonkeyアプリケーションにおいてバーコードリーダーが機能しない

解決


TORI  2020-06-24 14:18:18  No: 148854

DELPHI XE5 にてTMemoを貼り付けただけの簡単なFireMonkeyモバイルアプリケーションを作成し、
Panasonic FZ-T1にインストールして起動するとPanasonic FZ-T1のバーコードリーダーが機能しません。
プリインストールされているクロームやその他アプリ上ではバーコードリーダーは機能しています。
DELPHIで作成したアプリ上でバーコードリーダーを機能させる為に何か設定する項目はありますか。
又、バーコードリーダーをアプリ上で制御したいのではなく、バーコード読み取りボタン(任意に設定可能)押下時に
バーコードを読み取り、結果をTMemoに表示したいだけです。
以上、よろしくお願い致します。


HFUKUSHI  2020-06-24 16:29:19  No: 148855

FMXもAndroidも詳しくないのですが、カメラを使うためのパーミッションが必要なのではないでしょうか。
Androidのバージョン(APIレベル?)にもよりますが、実行時に取得する必要がありそうです。
https://delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/


take  2020-06-25 11:58:52  No: 148856

いくらなんでも情報少なすぎでは?

調べたところその機種Androidは専用カメラ?でバーコードを読み取るタイプみたいですけど
その高度な部分ならAPIが公開されていないと使えないかもしれません。

Androidだとカメラ設定してバーコード検出APIを使って読み取りますが
「機能しません」って何が機能しないのですか?
カメラが起動しない?バーコードが読み取れない?


TORI  2020-06-25 17:22:28  No: 148857

HFUKUSHI様 take様

お世話になります。
説明不足ですいません。

Panasonic FZ-T1には通常のカメラとバーコード読み取り用のカメラの2つが付いています。
そのうちバーコード読み取り用のカメラはバーコード読み取りソフトにより
キーボードウェッジ形式で読み取ったバーコードを様々なアプリケーションに入力できます(Panasonicへ確認済み)。
又、バーコードは本体横のボタンに割り当てることができ、そのボタンを押下することでバーコード読み取りのレーザーを照射します。
※前回の投稿で機能すると表現していたのはボタンを押下するとバーコードレーザーが照射されバーコードを読み取れるということです

例えばグーグルクロームを起動し、検索ボックスにフォーカスが無い状態でバーコード読み取りボタンを押下するとレーザーが照射されます。
検索ボックスにフォーカスをあてて同じ動作を行いバーコードを読み取ると、読み取ったバーコードの内容が検索ボックスに入力されます。
これはグーグルクローム以外のソフトでも同じです。

ところが、私がDELPHI XE5で作成したアプリケーションを起動すると、その時点でバーコード読み取りボタンを押下してもバーコードが照射されません。
TMemo上にフォーカスをあてるとソフトウェアキーボードは動きますが、バーコード読み取りボタンは無反応なままです。
又、本体横のボタンにライト起動を割り当てるとDELPHIを起動した状態でもライトは起動するので、ボタンが無効になっているようでもありません。

DELPHIで作成したアプリケーションでなぜバーコードが照射されないのでしょうか。
何かしらの設定が必要なのでしょうか。

よろしくお願い致します。


HFUKUSHI  2020-06-25 19:54:52  No: 148858

そのハードウェア固有の制御が必要なのだと思われます(TOUGHPAD API)。たとえばこんなページが見つかります。
TOUGHPAD(FZ-N1/FZ-X1)のバーコードリーダを制御する - sashimi4’s diary
https://sashimi4.hatenablog.com/entry/handle-toughpad-barcode-reader-from-android-java


KONNOYA  2020-06-26 08:17:11  No: 148861

Panasonic FZ-T1のバーコードリーダーソフトは分かりませんが、
ダメ元で、フォーム上に置いたTEditやTMemoコントロールのプロパティを
StyledからPlatformに変更して1度試してみてはどうでしょう?
コードで書くなら↓下記の様に。

Edit1.ControlType := TPresentedControl.TControlType.Platform;

外していたらごめんなさい。


TORI  2020-06-27 01:15:30  No: 148867

HFUKUSHI様

ご回答ありがとうございます。
確かにバーコードをDELPHIアプリケーション上で操作(ボタンに読み取りを割り当てる等)するならばAPIを使用した制御が必要なのは理解できるのですが、
キーボードウェッジ形式で読み取ったバーコードをTMemoに入力させるだけならば必要ないと思われます。
実際グーグルクロームやその他のアプリでは問題なくバーコードで読み取った値が入力されます。
※私の勉強不足かもしれませんが…

KONNOYA様
ご回答ありがとうございます。
DELPHI XE5ではTControlTypeが実装されていなかったので、
RadStudio 10.4のトライアル版で試してみましたが、だめでした。


TORI  2020-06-27 02:06:28  No: 148868

お世話になります。
追加情報なのですが、
AndroidStudio 4.0でMultilineTextを張り付けただけのアプリケーションを作成して実行したところ、
バーコードの照射と読み取ったバーコードのMultilineTextへの入力はできました。

今回オラクルデータベースの読み取りと更新をする必要があるので、何とかDELPHIで作成したいと考えています。
どうぞよろしくお願い致します。


take  2020-06-29 10:27:29  No: 148870

正常に動作したAndroidStudio ではAndroidManifest.xml や build.gradleには何も追記無しでしょうか?
もしそうならAndroidが用意しているEditTextやMultilineTextと、Delphi FireMonkeyで扱うTMemoが異なると思われます。

DelphiのFireMonkeyから こんな風に AndroidのEditTextを配置したら変わりますかね?

【Androidアプリでネイティブコントロールをフォームに配置するには】
https://www.gesource.jp/weblog/?p=7593


TORI  2020-06-29 14:51:04  No: 148871

take様

ご回答ありがとうございます。

現在私の環境は
DELPHI XE5(正規版)
RAD Studio 10.4(試用版)
の2つとなっております。

ご教示頂いたソースをDELPHI XE5でコンパイルしますと、TAndroidHelperが未定義の識別子としてエラーとなります。
調べてみますと、DELPHI XE5にはAndroidapi.Helpers.PASファイルが存在していません。

又、RAD Studio 10.4でコンパイルしますと、JNativeLayoutが未定義の識別子としてエラーとなります。
Androidapi.JNI.EmbarcaderoのJNativeLayoutを参照することが出来ません。

※RAD Studio 10.4が試用版の為(?)、PASファイルが公開されていないので詳細が判りませんが、
 DELPHI XE5のAndroidapi.JNI.Embarcadero.PASファイルには
 JNativeLayout = interface;//com.embarcadero.firemonkey.nativelayout.NativeLayoutの記述があり、この部分ではエラーになりません。

何か回避策はありますか。
よろしくお願い致します。


take  2020-06-30 17:16:28  No: 148872

こちらに環境がないので情報からの想像になりますが

この辺の情報を見ると
https://qiita.com/pik/items/1e6c8a9cdf96bc0104f3

FireMonkey は OS のコントロールを利用せずコントロールを自分で描画しています
ということなのでこのままだと無理ですね。

Androidのネイティブコントロールを使う方法にはたどり着けませんでしたが

メーカーのサイトに
ネイティブ表示をサポートしているコントロールは次のとおりです。
TCalendar、TEdit、TSwitch
ってなってるから使えるのでは?


TORI  2020-07-03 14:59:51  No: 148875

take様
ご回答ありがとうございます。

返信遅くなって申し訳ありません。
RAD Studio 10.4(試用版) にて次のサイトを参考にコントロールをネイティブコントロールとして実行しましたが、
相変わらずレーザーを照射しません。
実行時にボタンでTPresentedControl.TControlType.StyledとTPresentedControl.TControlType.Platformを切り替えても同じです。

参考↓↓↓
http://docwiki.embarcadero.com/RADStudio/Sydney/ja/FireMonkey_%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96_Android_%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB

他に何かできることがありましたらご教示ください。
よろしくお願い致します。


TORI  2020-07-06 13:11:12  No: 148885

お世話になっております。
少し進展(?)したので書き込みます。

FireMonkeyアプリケーション上ではバーコードレーザーは全く照射されなかったのですが、
DELPHIサポートより少しヒントを頂きまして、InputQueryを利用すると、
ダイアログ上からはバーコードの照射と読み取ったバーコードの入力が出来ました。
このことからFireMonkeyで作成したフォーム自体にレーザー照射を阻害する何かしらがあるのかなと考えています。
以上、よろしくお願い致します。

ソース:
  TDialogService.InputQuery('TEST READ',['Please Read Barcode'],['Barcode'],
    procedure(const AResult: TModalResult; const AValues: array of string)
    begin
      Memo1.Lines.Add('Barcode = ' + AValues[0]);
    end);


take  2020-07-06 15:55:41  No: 148886

うーん、説明が伝わっていないのかな?

>>FireMonkey は OS のコントロールを利用せずコントロールを自分で描画しています

FireMonkeyはAndroidが持っているEditTextコントロールを使わずに、それっぽい四角い形のフォーカスを持ったものを表示しているだけです。
なのでAndroidAPI側で拡張したものが反映されません。

InputQueryで表示される入力ボックスはAndroidの Dialog.Builderで作られているならAndroid特有のボタンも表示されるのかも知れません。

>>実行時にボタンでTPresentedControl.TControlType.StyledとTPresentedControl.TControlType.Platformを切り替えても同じです。

「切り替えても同じ」ということは設計時にも設定しているのですよね?念のため確認です。
あと左辺も合わせると
Edit1.ControlType := TPresentedControl.TControlType.Platform;
となっているのですよね?

それでもEdit1が変わらない・・・?

ネイティブ Android コントロールかどうかはZオーダーサポートの有無ですから
わざと他のコンポーネントの下にくるように配置して
それでも一番手前に表示されるのであればネイティブで、隠れていれば非ネイティブのままだと思います。

ネイティブなのにバーコード読み取りが出来ないのであればまた色々やっかいですね。


TORI  2020-07-07 16:06:05  No: 148890

take様

お世話になっております。

TEditのControlTypeプロパティを.Platformに変更することで、Androidネイティブコントロールには変わっています。
これは2つのTEditを並べ、ControlTypeプロパティをStyledとPlatformに変更すると、実行時の下線の濃さが変わるのでそう判断しています。
又、お教え頂いた、他のコンポーネントを被せた場合もControlTypeプロパティを.Platformに指定したTEditは最前面にいます。
しかし、ネイティブコントロールに変更してもバーコードは照射されませんでした。

よろしくお願い致します。


take  2020-07-07 17:09:32  No: 148891

ネイティブコントロールなのにバーコード読み取りが出来ないとなるとお手上げですね。

元をたどるとOracleデータベースへの接続が目的?でDelphiを使いたいというのであれば
Androidの開発環境からOracleデータベースへの接続方法を探す方が早いかも知れません。


TORI  2020-07-08 09:58:41  No: 148893

take様

お世話になっております。

本当にお手上げ状態になってきました...
そこでおっしゃられる様にAndroidStudioでOracleに接続するか、タフブックのSDK(JAVA)を利用するか考えてみたいと思います。

ありがとうございました。

ご協力頂いた皆様へ

上にも書きましたが、別な方法を探りたいと思いますので、一度解決済みとしてスレッドを閉じたいと思います。

色々とお教え頂きありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加