/ / Delphi XE6 et Android (estimation de balise sdk) ClassCastException - Android, Delphi, estimation

Delphi XE6 et Android (estimote beacon sdk) ClassCastException - Android, Delphi, estimote

Je fais cette chose depuis plusieurs jours sans aucune chance. C'est quoi java2pas prévoir pour BeaconManager$ServiceReadyCallback:

  [JavaSignature("com/estimote/sdk/BeaconManager$ServiceReadyCallback")]
JBeaconManager_ServiceReadyCallback = interface(JObject)
["{335D3A89-7137-44CE-9969-BECC2F3AB8AC}"]
procedure onServiceReady ; cdecl;                                           // ()V A: $401
end;

à partir de cela j'ai fait une méthode anonyme comme suit:

TAnServiceReadyCallBack = reference to function : JBeaconManager_ServiceReadyCallback;

ci-dessous comment j'appelle cela:

var
an : TAnServiceReadyCallBack;
bm : JBeaconManager;
begin
bm := TJBeaconManager.JavaClass.init(SharedActivityContext);
an := function : JBeaconManager_ServiceReadyCallback
begin
Result := TJBeaconManager_ServiceReadyCallback.Wrap((context as ILocalObject).GetObjectID);
if Assigned(Result) then
Memo1.Lines.Add("servicereadycallback init")
else
Memo1.Lines.Add("servicereadycallback not init")
end;
bm.connect(an);

sur cet appel bm.connect (an) que j'ai reçu comme suit:

java.lang.ClassCastException: com.embarcadero.firemonkey.FMXNativeActivity cannot be cast to com.estimote.sdk.BeaconManager$ServiceReadyCallback

Voici ce que selon l'estimation SDK:

   beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
@Override public void onServiceReady() {
try {
beaconManager.startRanging(ALL_ESTIMOTE_BEACONS);
} catch (RemoteException e) {
Log.e(TAG, "Cannot start ranging", e);
}
}
});

code de beacon sdk méthode de connexion est la suivante:

  public void connect(ServiceReadyCallback callback)
{
if (!checkPermissionsAndService()) {
L.e("AndroidManifest.xml does not contain android.permission.BLUETOOTH or android.permission.BLUETOOTH_ADMIN permissions. BeaconService may be also not declared in AndroidManifest.xml.");
}
this.callback = ((ServiceReadyCallback)Preconditions.checkNotNull(callback, "callback cannot be null"));
if (isConnectedToService()) {
callback.onServiceReady();
}
boolean bound = this.context.bindService(new Intent(this.context, BeaconService.class), this.serviceConnection, 1);
if (!bound) {
L.w("Could not bind service: make sure thatcom.estimote.sdk.service.BeaconService is declared in AndroidManifest.xml");
}
}

J'ai aussi essayé de faire un delphi classe comme suit:

  TServiceReadyCallback = class(TJavaLocal,
JBeaconManager_ServiceReadyCallback)
private
fParent: TForm4;
public
constructor Create(parent: TForm4; context: JContext);
function equals(o: JObject): boolean; cdecl;
function getClass: Jlang_Class; cdecl;
function hashCode: Integer; cdecl;
procedure notify; cdecl;
procedure notifyAll; cdecl;
function toString: JString; cdecl;
procedure wait; overload; cdecl;
procedure wait(millis: Int64); overload; cdecl;
procedure wait(millis: Int64; nanos: Integer); overload; cdecl;
procedure onServiceReady; cdecl;
end;

constructor TServiceReadyCallback.Create(parent: TForm4;
context: JContext);
begin
fParent := parent;
fParent.Memo1.Lines.Add("ServiceReadyCallback Created");
end;

en utilisant cette classe j'ai utilisé comme suit:

var
fservice: TServiceReadyCallback;
context: JContext;
bm : JBeaconManager;
begin
CallInUIThreadAndWaitFinishing(
procedure
begin
context := SharedActivityContext;
bm := TJBeaconManager.JavaClass.init(context);
fservice := TServiceReadyCallback.Create(Self, context);
bm.connect(fservice);
end);
end;

sur l'utilisation de ce que j'ai reçu callback cannot be null" from beaconmanager.java ligne

this.callback = ((ServiceReadyCallback)Preconditions.checkNotNull(callback, "callback cannot be null"));

J'ai tellement besoin de ça car mon client me presse. Je fais des recherches depuis au moins 3 ou 4 mois sans aucune chance. Quelqu'un est-il ici pour m'aider à résoudre ce problème?

Réponses:

1 pour la réponse № 1

Vous n'avez pas fourni la définition complète de l'encapsuleur JNI Bridge, qui devrait se lire comme suit:

  JBeaconManager_ServiceReadyCallbackClass = interface(JObjectClass)
["{D1DC624A-9431-4724-A0B6-2FE039BDCC33}"]
procedure onServiceReady ; cdecl;
end;

[JavaSignature("com/estimote/sdk/BeaconManager_ServiceReadyCallback")]
JBeaconManager_ServiceReadyCallback = interface(JObject)
["{40394705-FCFB-442E-B3C7-3EA9825CDDBF}"]
procedure onServiceReady ; cdecl;
end;

TJBeaconManager_ServiceReadyCallback = class(TJavaGenericImport<JBeaconManager_ServiceReadyCallbackClass, JBeaconManager_ServiceReadyCallback>)
end;