2016-09-08 22 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()にはC++ではTMessageListenerが必要ですが、使用方法はわかりません。

答えて

2

実際の問題は、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; 
} 
+0

感謝を! – Dylan

関連する問題