onActivityResult 相当于 Delphi XE5 中的吗?

问题描述 投票:0回答:3

在 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 的一个,但似乎没有在正确的位置获取它,并且我在示例代码、在线或源代码中没有看到任何示例。

android delphi delphi-xe5
3个回答
2
投票

目前,您必须对已编译的 Java 类进行子类化,该类充当 Java 端的入口点

Activity
,您可以在其中重写
onActivityResult()
。 这相当混乱,需要对classes.dex进行de-dexing才能获取当前的
NativeActivity
子类,您必须依次子类化。您还必须修改清单并将正常部署的classes.dex 替换为包含您的子类的新清单。 您可能会觉得这相当混乱,这就是为什么最好推迟一下,直到他们添加一个钩子来获取活动结果,希望很快就会出现......


1
投票

这是一个很好的评论,我不知道它是否像 Intent 一样工作。

http://www.pclviewer.com/android/androidJNI.html

http://www.pclviewer.com/android/XE5.pdf


0
投票

最近的 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;
© www.soinside.com 2019 - 2024. All rights reserved.