Camera2 APIを使用するDelphi 10.2 TokyoでAndroidアプリを作成しようとしています。 Java2OPを使用して、必要なインタフェースを作成しました。これらのインタフェースの中には、コールバック/リスナー用のものがあります。 Java2OPはこれに翻訳した例CameraDevice.StateCallbackについて:DelphiでJava/Androidのコールバック/リスナーを実装する
JCameraDevice_StateCallbackClass = interface(JObjectClass)
['{3F5A7394-FD15-439C-9BFB-DF8D43F9F930}']
{class} function _GetERROR_CAMERA_DEVICE: Integer; cdecl;
{class} function _GetERROR_CAMERA_DISABLED: Integer; cdecl;
{class} function _GetERROR_CAMERA_IN_USE: Integer; cdecl;
{class} function _GetERROR_CAMERA_SERVICE: Integer; cdecl;
{class} function _GetERROR_MAX_CAMERAS_IN_USE: Integer; cdecl;
{class} function init: JCameraDevice_StateCallback; cdecl;
{class} property ERROR_CAMERA_DEVICE: Integer read _GetERROR_CAMERA_DEVICE;
{class} property ERROR_CAMERA_DISABLED: Integer read _GetERROR_CAMERA_DISABLED;
{class} property ERROR_CAMERA_IN_USE: Integer read _GetERROR_CAMERA_IN_USE;
{class} property ERROR_CAMERA_SERVICE: Integer read _GetERROR_CAMERA_SERVICE;
{class} property ERROR_MAX_CAMERAS_IN_USE: Integer read _GetERROR_MAX_CAMERAS_IN_USE;
end;
[JavaSignature('android/hardware/camera2/CameraDevice$StateCallback')]
JCameraDevice_StateCallback = interface(JObject)
['{3A3944F5-A71F-4CD6-98C6-04B8D65C3B52}']
procedure onClosed(camera: JCameraDevice); cdecl;//Deprecated
procedure onDisconnected(camera: JCameraDevice); cdecl;//Deprecated
procedure onError(camera: JCameraDevice; error: Integer); cdecl;//Deprecated
procedure onOpened(camera: JCameraDevice); cdecl;//Deprecated
end;
TJCameraDevice_StateCallback = class(TJavaGenericImport<JCameraDevice_StateCallbackClass, JCameraDevice_StateCallback>) end;
それは私が私が(この場合はJCameraDevice_StateCallbackClass
で)コールバック/リスナーとして使用するインターフェイスでTJavaLocal
を組み合わせなければならない私の理解です。ここに私がしたことがあります: ユニットCamDevStateCallback;それはequals
、toString
は前の宣言とは異なり、getClass
、notify
、notifyAll
とwait
が欠落している不平を言うため
interface
uses
Androidapi.JNIBridge, android.hardware.camera2;
type
TCamera2Event = procedure(camera: JCameraDevice) of object;
TCamera2ErrorEvent = procedure(camera: JCameraDevice; error: Integer) of object;
TCamDevStateCallback = class(TJavaLocal, JCameraDevice_StateCallback)
protected
FOnClosed: TCamera2Event;
FOnDisconnected: TCamera2Event;
FOnError: TCamera2ErrorEvent;
FOnOpen: TCamera2Event;
public
procedure onClosed(camera: JCameraDevice); cdecl;
procedure onDisconnected(camera: JCameraDevice); cdecl;
procedure onError(camera: JCameraDevice; error: Integer); cdecl;
procedure onOpened(camera: JCameraDevice); cdecl;
class function CreateNew(aOnOpen, aOnClosed, aOnDisconnected: TCamera2Event; aOnError: TCamera2ErrorEvent): JCameraDevice_StateCallback;
property OnCameraClosed: TCamera2Event read FOnClosed write FOnClosed;
property OnCameraDisconnected: TCamera2Event read FOnDisconnected write FOnDisconnected;
property OnCameraError: TCamera2ErrorEvent read FOnError write FOnError;
property OnCameraOpen: TCamera2Event read FOnOpen write FOnOpen;
end;
implementation
{ TCamDevStateCallback }
class function TCamDevStateCallback.CreateNew(aOnOpen, aOnClosed, aOnDisconnected: TCamera2Event;
aOnError: TCamera2ErrorEvent): JCameraDevice_StateCallback;
var
tmpObj: TCamDevStateCallback;
begin
tmpObj := TCamDevStateCallback.Create;
tmpObj.OnCameraClosed := aOnClosed;
tmpObj.OnCameraDisconnected := aOnDisconnected;
tmpObj.OnCameraError := aOnError;
tmpObj.OnCameraOpen := aOnOpen;
Result := TJCameraDevice_StateCallback.Wrap((tmpObj as ILocalObject).GetObjectID);
end;
procedure TCamDevStateCallback.onClosed(camera: JCameraDevice);
begin
if Assigned(FOnClosed) then
FOnClosed(camera);
end;
procedure TCamDevStateCallback.onDisconnected(camera: JCameraDevice);
begin
if Assigned(FOnDisconnected) then
FOnDisconnected(camera);
end;
procedure TCamDevStateCallback.onError(camera: JCameraDevice; error: Integer);
begin
if Assigned(FOnError) then
FOnError(camera, error);
end;
procedure TCamDevStateCallback.onOpened(camera: JCameraDevice);
begin
if Assigned(FOnOpen) then
FOnOpen(camera);
end;
end.
このコードはコンパイルされません。
android.hardware.camera2.pas Java2OPによって作成され、JCameraDevice_StateCallback
とよりのインタフェース定義が含まれています。
あなたのコードには、等しい、toStringがありません。 – RBA
@RBA 'equals'と' toString'は、私が継承している 'TJavaLocal'によって実装されています。 – Sam
Javaクラスの子孫を作成するには、Javaコードを記述する必要があります。私はすでにこのプロジェクトでこれを行っています:https://github.com/DelphiWorlds/Camera –