Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Open zxing barcode scanner via intent
Forum Updated to NodeBB v4.3 + New Features

Open zxing barcode scanner via intent

Scheduled Pinned Locked Moved Mobile and Embedded
6 Posts 4 Posters 5.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • metaDomM Offline
    metaDomM Offline
    metaDom
    wrote on last edited by
    #1

    Hey guys,

    I'd like to start the zxing barcode/qr scanner via an Intent on Android and then receive and parse the result via C++ Qt code.

    https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

    I've made some attempts but for some reason I always just received a whitescreen.

    Could anyone give it a try and share his results?

    The Java code without Qt would be:

    @public Button.OnClickListener mScan = new Button.OnClickListener() {
    public void onClick(View v) {
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.setPackage("com.google.zxing.client.android");
    intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
    startActivityForResult(intent, 0);
    }
    };

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
    if (resultCode == RESULT_OK) {
    String contents = intent.getStringExtra("SCAN_RESULT");
    String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
    // Handle successful scan
    } else if (resultCode == RESULT_CANCELED) {
    // Handle cancel
    }
    }
    }@

    Thanks in advance!

    1 Reply Last reply
    0
    • metaDomM Offline
      metaDomM Offline
      metaDom
      wrote on last edited by
      #2

      Ok, I got the QR Scanner to start and can also receive results. Problem now is, I have to pass the results from the Java class to Qt...

      1 Reply Last reply
      0
      • metaDomM Offline
        metaDomM Offline
        metaDom
        wrote on last edited by
        #3

        Current code without java file:

        @ QAndroidJniObject Scanner;
        QAndroidJniObject Package;
        QAndroidJniObject Subject;
        QAndroidJniObject Text;
        QAndroidJniObject intent("android/content/Intent");

        Scanner = QAndroidJniObject::fromString("com.google.zxing.client.android.SCAN");
        Package = QAndroidJniObject::fromString("com.google.zxing.client.android");
        Subject = QAndroidJniObject::fromString("SCAN_MODE");
        Text = QAndroidJniObject::fromString("QR_CODE_MODE");
        intent.callObjectMethod("addAction","(Ljava/lang/String;)Landroid/content/Intent;",Scanner.object<jstring>());
        intent.callObjectMethod("setPackage","(Ljava/lang/String;)Landroid/content/Intent;",Package.object<jstring>());
        intent.callObjectMethod("putExtra","(Ljava/lang/String;Ljava/lang/string;)Landroid/content/Intent;",Subject.object<jstring>(), Text.object<jstring>());
        QtAndroid::startActivity(intent,123456);@
        
        1 Reply Last reply
        0
        • M Offline
          M Offline
          malleeswarareddy
          wrote on last edited by
          #4

          me also facing same problem ,but iam trying like this result code got -1 ,but scanner result showing null.
          class OnActivityResult : public QAndroidActivityResultReceiver
          {
          void handleActivityResult(int requestCode, int resultCode, const QAndroidJniObject & intent)
          {
          qDebug() << "**** " << requestCode << " : " << resultCode << "data" << intent.toString();

                  if (requestCode == 12345)
                  {
                      if (resultCode != 0 && intent.isValid())
                      {
          
                          QAndroidJniObject jPackage;
                          QAndroidJniObject jClass;
                          QAndroidJniObject jresult;
                          QAndroidJniObject jdata;
          
                          jPackage = QAndroidJniObject::fromString("com.google.zxing.client.android");
                          jClass =  QAndroidJniObject::fromString("com.google.zxing.client.android.SCAN");
                          jresult = QAndroidJniObject::fromString("RESULT_OK");
          
          
                          intent.callObjectMethod("setPackage"
                          , "(Ljava/lang/String;)Landroid/content/Intent;"
                          , jPackage.object<jstring>());
          
                          intent.callObjectMethod("setAction"
                          , "(Ljava/lang/String;)Landroid/content/Intent;"
                          , jClass.object<jstring>());
          
          
                          jdata=intent.callObjectMethod("getExtra"
                          , "(Ljava/lang/String;)Landroid/content/Intent;"
                          , jresult.object<jstring>());
                          qDebug() << "DATA:" << jdata.toString() ;
          

          // QAndroidJniObject result =
          // intent.getObjectField<jstring>("SCAN_RESULT");
          // QAndroidJniObject format =
          // intent.getObjectField<jstring>("SCAN_RESULT_FORMAT");

          // qDebug() << result.toString() << " : " << format.toString();
          }
          }
          }
          };

          1 Reply Last reply
          0
          • E Offline
            E Offline
            EvanPan
            Banned
            wrote on last edited by
            #5
            This post is deleted!
            1 Reply Last reply
            0
            • T Offline
              T Offline
              tomaslov
              wrote on last edited by tomaslov
              #6

              Hi,

              I've successfully implemented zxing barcode scanning via intent from Qt. I don't think it's the proper way to do it, but it works.

              I copied QtActivity.java and added some code in onActivityResult to get hold of the return values. I'm quite sure you can do this a cleaner way.

              <code>
              @Override

              protected void onActivityResult(int requestCode, int resultCode, Intent data)    {
                  //Barcode results
                  IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
                  if (result != null)
                  {
                     barcodeData = result.getContents();
                     Log.i(QtApplication.QtTAG, "Barcode activity result: data=" + barcodeData + ", formatName=" + result.getFormatName() + ", errorCorrectionLevel=" + result.getErrorCorrectionLevel());
                     if (barcodeData == null) barcodeData = "#SC$SCAN_ABORT$SC#"; // Signal scan is finished, but with no data.
                  }
                 //Barcode results finished
                  if (QtApplication.m_delegateObject != null && QtApplication.onActivityResult != null) {
                      QtApplication.invokeDelegateMethod(QtApplication.onActivityResult, requestCode, resultCode, data);
                      return;
                  }
                  if (requestCode == MINISTRO_INSTALL_REQUEST_CODE)
                      startApp(false);
                  super.onActivityResult(requestCode, resultCode, data);
              }
              

              </code>

              1 Reply Last reply
              0

              • Login

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • Users
              • Groups
              • Search
              • Get Qt Extensions
              • Unsolved