启动外部活动以扫描条形码
Start an external activity to scan barcode
我想从我的应用程序启动条形码扫描仪并获取标签
这是我到目前为止所拥有的:
扫描.h
class DecodeBarCode : public QObject
{
Q_OBJECT
BarCodeReceiver *m_receiver;
public:
explicit DecodeBarCode(QObject *parent = 0);
~DecodeBarCode();
Q_INVOKABLE void useZXingApp();
signals:
void tagFound(QString tag);
};
class BarCodeReceiver : public QAndroidActivityResultReceiver
{
DecodeBarCode *m_decoder;
public:
BarCodeReceiver(DecodeBarCode *decoder) : m_decoder(decoder) {}
virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data) {
emit m_decoder->tagFound("Receiver worked");
}
};
扫描.cpp
DecodeBarCode::DecodeBarCode(QObject *parent) : QObject(parent)
{
m_receiver = new BarCodeReceiver(this);
}
DecodeBarCode::~DecodeBarCode()
{
delete m_receiver;
}
void DecodeBarCode::useZXingApp()
{
QAndroidJniObject intent = QAndroidJniObject::fromString("com/google/zxing/client/android/SCAN");
if (intent.isValid()) {
QtAndroid::startActivity(intent,0,m_receiver); // CRASH HERE
} else {
emit tagFound("Invalid"); // TEMP
}
}
那是我第一次使用JNI,从未在java或c ++/Qt中使用过它
。一定有什么很不对劲的地方,是什么?
这是我使用 tent 从应用程序共享文本的示例:
void Sharer::share(const QString &content)
{
qDebug() << "sharing text: " << content;
#ifdef Q_OS_ANDROID
auto ACTION_SEND = QAndroidJniObject::getStaticObjectField("android/content/Intent", "ACTION_SEND", "Ljava/lang/String;");
auto EXTRA_TEXT = QAndroidJniObject::getStaticObjectField("android/content/Intent", "EXTRA_TEXT", "Ljava/lang/String;");
auto intent = QAndroidJniObject("android/content/Intent", "(Ljava/lang/String;)V", ACTION_SEND.object());
// Intent Intent.putExtra(String name, String value)
intent.callObjectMethod("putExtra", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;", EXTRA_TEXT.object(), QAndroidJniObject::fromString(content).object());
// Intent Intent.setType(String type)
intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString(QString("text/plain")).object());
qDebug() << intent.toString();
// static Intent Intent.createChooser(Intent target, CharSequence title)
auto chooserIntent = QAndroidJniObject::callStaticObjectMethod("android/content/Intent", "createChooser", "(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;", intent.object(), QAndroidJniObject::fromString(QString("It's Time To Choose...")).object());
qDebug() << chooserIntent.toString();
QtAndroid::startActivity(chooserIntent, 0, nullptr);
#endif
}
如您所见,您需要自己创建意图,检索所有需要的对象。
我终于让它工作了,这是完整的代码:
解码条形码.h
#ifndef DECODEBARCODE_H
#define DECODEBARCODE_H
#include <QObject>
#ifdef Q_OS_ANDROID
#include <QtAndroidExtras/QtAndroid>
#include <QtAndroidExtras/QAndroidJniObject>
#include <QtAndroidExtras/QAndroidJniEnvironment>
#include <QtAndroidExtras/QAndroidActivityResultReceiver>
#endif
class BarCodeReceiver;
class DecodeBarCode : public QObject
{
Q_OBJECT
BarCodeReceiver *m_receiver;
public:
explicit DecodeBarCode(QObject *parent = 0);
~DecodeBarCode();
Q_INVOKABLE void useZXingApp();
signals:
void tagFound(QString tag);
};
#ifdef Q_OS_ANDROID
class BarCodeReceiver : public QAndroidActivityResultReceiver
{
DecodeBarCode *m_decoder;
public:
BarCodeReceiver(DecodeBarCode *decoder);
virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);
};
#else
class BarCodeReceiver
{
public:
BarCodeReceiver(DecodeBarCode *decoder) {Q_UNUSED(decoder)};
};
#endif
#endif // DECODEBARCODE_H
解码条形码.cpp
#include "decodebarcode.h"
DecodeBarCode::DecodeBarCode(QObject *parent) : QObject(parent)
{
m_receiver = new BarCodeReceiver(this);
}
DecodeBarCode::~DecodeBarCode()
{
delete m_receiver;
}
void DecodeBarCode::useZXingApp()
{
#ifdef Q_OS_ANDROID
QAndroidJniObject action = QAndroidJniObject::fromString("com.google.zxing.client.android.SCAN");
// Intent intent = new Intent(action)
QAndroidJniObject intent("android/content/Intent","(Ljava/lang/String;)V", action.object<jstring>());
jint flagCategorieDefault = QAndroidJniObject::getStaticField<jint>("android/content/Intent", "CATEGORY_DEFAULT");
jint flagActivityClearTop = QAndroidJniObject::getStaticField<jint>("android/content/Intent", "FLAG_ACTIVITY_CLEAR_TOP");
jint flagActivityClearTaskReset = QAndroidJniObject::getStaticField<jint>("android/content/Intent", "FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET");
// intentScan.addCategory(Intent.CATEGORY_DEFAULT);
intent.callObjectMethod("addCategory", "(I)V", flagCategorieDefault);
//intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.callObjectMethod("addFlags", "(I)V", flagActivityClearTop);
//intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.callObjectMethod("addFlags", "(I)V", flagActivityClearTaskReset);
QtAndroid::startActivity(intent, 0, m_receiver);
#endif
}
#ifdef Q_OS_ANDROID
BarCodeReceiver::BarCodeReceiver(DecodeBarCode *decoder)
: m_decoder(decoder)
{
}
void BarCodeReceiver::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data)
{
QAndroidJniObject stringExtraScanResult = QAndroidJniObject::fromString("SCAN_RESULT");
QAndroidJniObject scanResult = data.callObjectMethod("getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;", stringExtraScanResult.object<jstring>());
emit m_decoder->tagFound(scanResult.toString());
}
#endif
如果您有同样的问题,我希望对您有所帮助
使用此库来挽救您的生命:)https://github.com/zxing/zxing
相关文章:
- 检查不带转换的扫描格式
- 如何对__uint128_t进行位扫描(128位)?
- 我的 SonarQube C++扫描成功,但结果仅标记重复项,而没有标记其他标记的位置
- 使用扫描的调试断言失败
- 如何在扫描中使用字符双指针?
- 使用 Clang LibTooling 扫描C++在模板化父类中调用本地类的源
- 有没有办法从 cpp 中的文本生成条形码图像?
- 为什么 EOF 在循环扫描期间没有终止?
- 尝试让条形码扫描仪与Arduino一起工作
- 有没有一种方法可以在linux中扫描已构建的ARM库中的函数
- ESP32_BLE_Arduino库中的扫描窗口、间隔和扫描时间之间有什么区别
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 开发QR扫描仪以扫描我生成的"only" QR码?
- 快速扫描标准以获取整数不起作用
- C++ 如何从文本文件中扫描二维数组并对行求和?
- 扫描阵列特定次数,然后找出元素
- C++客户端/服务器聊天应用程序 - 从 Ubuntu 命令窗口扫描输入
- 启动外部活动以扫描条形码
- MC55系列手持设备的条形码扫描