2016-09-08 4 views
0

Ich verwende C++ Builder 10.1 Berlin, um eine Android-App zu entwickeln, die Barcodes scannt. Um dies zu tun, ich rufe andere app (ZXing), wenn der Benutzer auf eine Schaltfläche in meiner app klickt, wie folgt aus:C++ Builder - Ergebnis einer Aktivität abrufen

_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!"); 
} 

den Lese Barcode zu erhalten, verwende ich die Zwischenablage Service. Bis jetzt war es genug für mich.

Jetzt möchte ich den Typ des Barcodes erhalten. Ich muss Androids onActivityResult Ereignis behandeln. Ich fand eine Lösung in Delphi, aber ich bin nicht in der Lage, es zu C++ zu übersetzen:

Launching activities and handling results in Delphi XE6 Android apps

Insbesondere der Abschnitt "Communication from the launched activity" betitelt.

In der Tat, die Funktion TMessageManager.DefaultManager.SubscribeToMessage() benötigt eine TMessageListener in C++, aber ich weiß nicht, wie man es benutzt.

Antwort

2

Also, das eigentliche Problem ist nur, dass Sie nicht verstehen, wie Sie TMessageManager::SubscribeToMessage() in C++ aufrufen. Sie sollten mit dem Lesen der Dokumentation begonnen haben, die C++ - Beispiele enthält.

Sending and Receiving Messages Using the RTL.

Brian Long's Delphi example die folgenden in C++ übersetzen würde:

#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

Danke für die Antwort Remy! – Dylan

Verwandte Themen