【问题标题】:C++ Builder - Get the result of an ActivityC++ Builder - 获取活动的结果
【发布时间】:2016-09-08 07:04:17
【问题描述】:

我正在使用 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++:

Launching activities and handling results in Delphi XE6 Android apps

特别是标题为"Communication from the launched activity"的部分。

确实,函数TMessageManager.DefaultManager.SubscribeToMessage()在C++中需要一个TMessageListener,但是我不知道怎么用。

【问题讨论】:

    标签: android c++ delphi c++builder


    【解决方案1】:

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

    Sending and Receiving Messages Using the RTL.

    Brian Long's Delphi example 在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 2023-01-04
      相关资源
      最近更新 更多