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

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
  • 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

          2/4

          11 Jul 2015, 10:24

          • Login

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