在 android/Java 中我会这样做:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);
并得到结果:
@Override public void onActivityResult(int reqCode, int resultCode, Intent data)
在 Delphi 中,我有相当于第一部分的内容:
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_PICK);
Intent.setType(TJContactsContract_Contacts.JavaClass.CONTENT_TYPE);
MainActivity.startActivityForResult(Intent,PICK_CONTACT);
但是在 MainActivity 下查看时,我没有看到“onActivityResult”回调。我看到了 JFragment 的一个,但似乎没有在正确的位置获取它,并且我在示例代码、在线或源代码中没有看到任何示例。
目前,您必须对已编译的 Java 类进行子类化,该类充当 Java 端的入口点
Activity
,您可以在其中重写 onActivityResult()
。
这相当混乱,需要对classes.dex进行de-dexing才能获取当前的NativeActivity
子类,您必须依次子类化。您还必须修改清单并将正常部署的classes.dex 替换为包含您的子类的新清单。
您可能会觉得这相当混乱,这就是为什么最好推迟一下,直到他们添加一个钩子来获取活动结果,希望很快就会出现......
这是一个很好的评论,我不知道它是否像 Intent 一样工作。
最近的 Delphi 12.1 RTL 源代码包含示例:
procedure TAndroidBluetoothAdapter.ResultCallback(const Sender: TObject; const M: TMessage);
var
LMessage: TMessageResultNotification;
begin
LMessage := TMessageResultNotification(M);
case LMessage.RequestCode of
REQUEST_DISCOVERABLE:
begin
// { Now we can use LMessage.RequestCode, LMessage.ResultCode and LMessage.Value (JIntent object) }
// if LMessage.ResultCode <> 0 then
// begin
// { The user has accepted the Discoverable state. When it finishes show }
// end;
FWaitingCallback := False;
end;
REQUEST_ENABLE_BT: FRequestEnableCallback := False;
end;
end;
constructor TAndroidBluetoothAdapter.Create(const AManager: TBluetoothManager; const AJAdapter: JBluetoothAdapter);
begin
inherited Create(AManager);
// Do the magic
FJAdapter := AJAdapter;
FContext := TAndroidHelper.Context;
FBroadcastListener := TBluetoothBroadcastListener.Create(Self);
FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FBroadcastListener);
FIntentFilter := TJIntentFilter.JavaClass.init(TJBluetoothDevice.JavaClass.ACTION_FOUND);
FIntentFilter.addAction(TJBluetoothDevice.JavaClass.ACTION_BOND_STATE_CHANGED);
FIntentFilter.addAction(TJBluetoothDevice.JavaClass.ACTION_ACL_CONNECTED);
FIntentFilter.addAction(TJBluetoothDevice.JavaClass.ACTION_ACL_DISCONNECTED);
FIntentFilter.addAction(TJBluetoothDevice.JavaClass.ACTION_ACL_DISCONNECT_REQUESTED);
FIntentFilter.addAction(TJBluetoothAdapter.JavaClass.ACTION_DISCOVERY_STARTED);
FIntentFilter.addAction(TJBluetoothAdapter.JavaClass.ACTION_DISCOVERY_FINISHED);
FIntentFilter.addAction(TJBluetoothAdapter.JavaClass.ACTION_SCAN_MODE_CHANGED);
FIntentFilter.addAction(TJBluetoothAdapter.JavaClass.ACTION_STATE_CHANGED);
// API Level 15
if TOSVersion.Check(4, 0, 3) then
FIntentFilter.addAction(TJBluetoothDevice.JavaClass.ACTION_UUID);
// API Level 19
if TOSVersion.Check(4, 4) then
FIntentFilter.addAction(TJBluetoothDevice.JavaClass.ACTION_PAIRING_REQUEST);
FContext.registerReceiver(FBroadcastReceiver, FIntentFilter);
TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, ResultCallback);
FRequestEnableCallback := False;
FOldScanMode := TJBluetoothAdapter.JavaClass.ERROR;
end;
destructor TAndroidBluetoothAdapter.Destroy;
begin
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, ResultCallback);
最重要的部分似乎是
TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification
该消息类别定义为
type
TMessageResultNotification = class(TMessage<JIntent>)
public
RequestCode: Integer;
ResultCode: Integer;
end;