android - C++ Builder - 获取 Activity 的结果

标签 android c++ delphi c++builder

我正在使用 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,但我不知道如何使用它。

最佳答案

所以,真正的问题只是你不明白如何调用TMessageManager::SubscribeToMessage()在 C++ 中。您应该先阅读文档,其中包括 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;
}

关于android - C++ Builder - 获取 Activity 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39384513/

相关文章:

安卓 flavor :Applying only flavor specific code to a source set

java - 让 Android 游戏更安全,免受黑客攻击

delphi - VirtualTreeView 中 IVTEditLink 编辑器的多个组件

德尔福:idHttp+SSL

android - 如何避免db not close和cursor异常

Android OkHttp,刷新过期 token

c++ - 为什么在此代码中隐式转换为常量迭代器会失败?

python - 两个并发的 Python 进程可以在 Boost Python 中运行吗?

c++ - Microsoft C++ 异常:std::bad_alloc。是什么原因造成的?

delphi - 无法使用删除文件命令删除文件夹