2016-09-08 2 views
0

Я использую C++ Builder 10.1 Berlin для разработки приложения для Android, которое сканирует штрих-коды. Чтобы сделать это, я звоню другое приложение (ZXing), когда пользователь нажимает на кнопку в моем приложении, как это:C++ Builder - Получить результат деятельности

_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() нуждается в TMessageListener в C++, но я не знаю, как ее использовать.

ответ

2

Итак, реальная проблема заключается в том, что вы не понимаете, как позвонить 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; 
} 
+0

Спасибо за ответ Remy! – Dylan

Смежные вопросы