2017-12-13 39 views
0

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;それはequalstoStringは前の宣言とは異なり、getClassnotifynotifyAllwaitが欠落している不平を言うため

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とよりのインタフェース定義が含まれています。

+0

あなたのコードには、等しい、toStringがありません。 – RBA

+0

@RBA 'equals'と' toString'は、私が継承している 'TJavaLocal'によって実装されています。 – Sam

+0

Javaクラスの子孫を作成するには、Javaコードを記述する必要があります。私はすでにこのプロジェクトでこれを行っています:https://github.com/DelphiWorlds/Camera –

答えて

0

@DaveNottageが暗示しているように、CameraDevice.StateCallbackはJavaリスナーインターフェイスではなく、Javaコールバッククラス(ある意味ではインターフェイスと似ていますが、インタフェース)。

それは、Delphiでそれがが(すべてのJavaインターフェースとクラスであるように)インタフェースによってを表現であるという事実にもかかわらず、TJavaLocalで実現するための候補ないであるJavaインターフェースないからです。

TJavaLocalは、Javaインターフェイス(通常はリスナーインターフェイス)を実装するためのものです。これは、Javaクラス(抽象Javaクラスでさえ)を継承する手段を提供しません。

Java2OPによって作成された重要なインターフェイスは、JObjectから継承しており、JavaのObjectベースのクラス階層の一部であることを示しています。インポート時のリスナーインタフェースは、IJavaInstanceから継承されます。

Delphiは(デルファイは、Objective-Cのクラスから継承するサポート、Androidの管理のJava VMのシステムとは異なり、ネイティブシステムであることのObjective-Cのおかげで行い、そのiOSのサポートとは対照的に)AndroidのJavaクラスからの継承をサポートしていません。

関連する問題