获取一个活动的结果
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()
需要一个TMessageListener
在c++中,但我不知道如何使用它。
所以,真正的问题只是你不明白如何在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;
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 获取一个活动的结果