簡體   English   中英

C++ Builder - 獲取活動的結果

[英]C++ Builder - Get the result of an Activity

我正在使用 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()在 C++ 中需要一個TMessageListener ,但我不知道如何使用它。

所以,真正的問題只是你不明白如何在 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM