获取一个活动的结果

C++ Builder - Get the result of an Activity

本文关键字:活动 结果 一个 获取      更新时间:2023-10-16

我正在使用c++ Builder 10.1 Berlin开发一个扫描条形码的Android应用程序。为了做到这一点,当用户点击我的应用程序中的一个按钮时,我调用另一个应用程序(Zxing),像这样:

_di_JIntent intent;
if(Global->ClipService != NULL){
    Global->ClipService->SetClipboard(TValue::_op_Implicit(NULL));
    intent = TJIntent::Create();
    intent->setAction(StringToJString("com.google.zxing.client.android.SCAN"));
    SharedActivity()->startActivityForResult(intent,0);
    scanCalled = true;    
}
else{
    ShowMessage("Presse Papier non disponible!");
}

为了获得读取的条形码,我使用剪贴板服务。直到现在,这对我来说已经足够了。

现在,我想知道条形码的类型。我需要处理Android的onActivityResult事件。我在Delphi中找到了一个解决方案,但我无法将其转换为c++:

在Delphi XE6 Android应用程序中启动活动和处理结果

特别是标题为"来自已启动活动的通信"的部分。

的确,函数TMessageManager.DefaultManager.SubscribeToMessage()需要一个TMessageListener在c++中,但我不知道如何使用它。

所以,真正的问题只是你不明白如何在c++中调用TMessageManager::SubscribeToMessage()。您应该从阅读文档开始,其中包括c++示例。

使用RTL发送和接收消息。

Brian Long的Delphi示例将在c++中转换为以下代码:

#include <System.Messaging.hpp>
//...
class TMainForm : public TForm
{
    //...
private:
    static const int ScanRequestCode = 0;
    int FMessageSubscriptionID;
    void __fastcall HandleActivityMessage(TObject* const Sender, TMessageBase* const M);
    bool __fastcall OnActivityResult(int RequestCode, int ResultCode, _di_JIntent Data);
    //...
};

#include <FMX.Platform.Android.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNI.App.hpp>
#include <Androidapi.JNI.Toast.hpp>
#include <LaunchActivities.hpp>
// ...
void __fastcall TMainForm::BarcodeScannerButtonClick(TObject *Sender)
{
    FMessageSubscriptionID = TMessageManager::DefaultManager->SubscribeToMessage(__classid(TMessageResultNotification), &HandleActivityMessage);
    LaunchQRScanner(ScanRequestCode);
}
void __fastcall TMainForm::HandleActivityMessage(TObject* const Sender, TMessageBase* const M)
{
    TMessageResultNotification *msg = dynamic_cast<TMessageResultNotification*>(M);
    if (msg)
        OnActivityResult(msg->RequestCode, msg->ResultCode, msg->Value);
}
bool __fastcall TMainForm::OnActivityResult(int RequestCode, int ResultCode, _di_JIntent Data)
{
    String ScanContent, ScanFormat;
    TMessageManager::DefaultManager->Unsubscribe(__classid(TMessageResultNotification), FMessageSubscriptionID);
    FMessageSubscriptionID = 0;
    // For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
    if (RequestCode == ScanRequestCode)
    {
        if (ResultCode == TJActivity::JavaClass->RESULT_OK)
        {
            if (Data)
            {
                ScanContent = JStringToString(Data->getStringExtra(StringToJString("SCAN_RESULT")));
                ScanFormat = JStringToString(Data.getStringExtra(StringToJString("SCAN_RESULT_FORMAT")));
                Toast(Format("Found %s format barcode:n%s", ARRAYOFCONST(( ScanFormat, ScanContent ))), LongToast);
            }
        }
        else if (ResultCode == TJActivity::JavaClass->RESULT_CANCELED)
        {
            Toast("You cancelled the scan", ShortToast);
        }
        return true;
    }
    return false;
}