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. How to start an Android activity in Java file from Qt
Forum Updated to NodeBB v4.3 + New Features

How to start an Android activity in Java file from Qt

Scheduled Pinned Locked Moved Mobile and Embedded
4 Posts 2 Posters 6.6k Views 2 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.
  • A Offline
    A Offline
    Abin
    wrote on 11 Jul 2015, 07:33 last edited by Abin 7 Nov 2015, 07:43
    #1

    Hi all,

    I need to start an activity which implements an interface from a third party library.

    So I am writing a sample application to start activity. But I have no clue how to do it. :( ..

    I have a button click slot:

    void MainWindow::on_startButton_clicked()
    {
        qDebug() << Q_FUNC_INFO << "Invoked";
        QAndroidJniObject intent;
        QtAndroid::startActivity(intent, 5, mpResultReceiver);
    }
    

    I don't know how to set intent so that it will refer to my activity.
    mpResultReceiver is a pointer to ActivityResultReceiver Object.

    //activityresultreceiver.h - I need to get some result from the activity...

    #ifndef ACTIVITYRESULTRECEIVER_H
    #define ACTIVITYRESULTRECEIVER_H
    
    #include <QAndroidActivityResultReceiver>
    
    class ActivityResultReceiver : public QAndroidActivityResultReceiver
    {
    public:
        ActivityResultReceiver();
    
        void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);
    };
    
    #endif // ACTIVITYRESULTRECEIVER_H
    

    //activityresultreceiver.cpp

    #include "activityresultreceiver.h"
    #include <QDebug>
    
    ActivityResultReceiver::ActivityResultReceiver()
    {
    
    }
    
    void ActivityResultReceiver::handleActivityResult(int receiverRequestCode,
                                                      int resultCode,
                                                      const QAndroidJniObject &data)
    {
        qDebug() << Q_FUNC_INFO << "Invoked";
    }
    

    //ActivityClient.java -** in the path of androidmanifest.xml file path /src/org/abc/startActivity**

    package org.abc.startActivity;
    
    import android.util.Log;
    
    public class ActivityClient extends org.qtproject.qt5.android.bindings.QtActivity
    {
        private static ActivityClient m_instance;
    
        public ActivityClient()
        {
            m_instance = this;
        }
    
    //    @Override
    //    protected void onCreate(Bundle savedInstanceState) {
    //        super.onCreate(savedInstanceState);
    //        Log.d("ActivityClient", "on create");
    //    }
    
    }
    

    Can somebody help to figure this out, as this is not near to any good work

    1 Reply Last reply
    0
    • B Offline
      B Offline
      benlau
      Qt Champions 2016
      wrote on 11 Jul 2015, 10:24 last edited by
      #2

      I don't suggest to use JNI to initial an Activity. It is just too troublesome. Instead I will implement it in Java.

      e.g:

          public void takePhoto() {
              Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
      
              mRequestedPhotoPath = "";
      
              String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss").format(new Date());
      
              File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
      
              File image = new File(storageDir.getAbsolutePath() + "/" + timeStamp + ".jpg");
              i.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(image));
              i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
              i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
              i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
              mRequestedPhotoPath = image.getAbsolutePath();
           
              startActivityForResult(i, TAKE_PHOTO);
          }
      
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
      
              if (resultCode == RESULT_OK) {
                   if (requestCode == TAKE_PHOTO) {
                      if (data == null && mRequestedPhotoPath != "") {
                          importFromPath(mRequestedPhotoPath);
                          addImageFileToGallery(mRequestedPhotoPath);
                          mRequestedPhotoPath = "";
                      } else {
                          importMediaImage(data);
                      }
                  }
              }
          }
      
      

      C++ side:

      void AndroidActivity::takePhoto()
      {
          QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
          activity.callMethod<void>("takePhoto","()V");
      }
      
      
      A 1 Reply Last reply 11 Jul 2015, 13:26
      1
      • B benlau
        11 Jul 2015, 10:24

        I don't suggest to use JNI to initial an Activity. It is just too troublesome. Instead I will implement it in Java.

        e.g:

            public void takePhoto() {
                Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        
                mRequestedPhotoPath = "";
        
                String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss").format(new Date());
        
                File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        
                File image = new File(storageDir.getAbsolutePath() + "/" + timeStamp + ".jpg");
                i.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(image));
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
                i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                mRequestedPhotoPath = image.getAbsolutePath();
             
                startActivityForResult(i, TAKE_PHOTO);
            }
        
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
        
                if (resultCode == RESULT_OK) {
                     if (requestCode == TAKE_PHOTO) {
                        if (data == null && mRequestedPhotoPath != "") {
                            importFromPath(mRequestedPhotoPath);
                            addImageFileToGallery(mRequestedPhotoPath);
                            mRequestedPhotoPath = "";
                        } else {
                            importMediaImage(data);
                        }
                    }
                }
            }
        
        

        C++ side:

        void AndroidActivity::takePhoto()
        {
            QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
            activity.callMethod<void>("takePhoto","()V");
        }
        
        
        A Offline
        A Offline
        Abin
        wrote on 11 Jul 2015, 13:26 last edited by
        #3

        @benlau Thanks for the post it helps .. :)

        But how to send if there is a data onActivityResult() have that is to be sent to C++ side...

        B 1 Reply Last reply 11 Jul 2015, 14:43
        0
        • A Abin
          11 Jul 2015, 13:26

          @benlau Thanks for the post it helps .. :)

          But how to send if there is a data onActivityResult() have that is to be sent to C++ side...

          B Offline
          B Offline
          benlau
          Qt Champions 2016
          wrote on 11 Jul 2015, 14:43 last edited by
          #4

          @Abin

          Check my example code to register native call via JNI:

          C++ :
          qtandroidexamplecode/qtandroidrunner.cpp at master · benlau/qtandroidexamplecode

          Java:

          qtandroidexamplecode/QtRunner.java at master · benlau/qtandroidexamplecode

          1 Reply Last reply
          0

          1/4

          11 Jul 2015, 07:33

          • Login

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