Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to send SMS in android?



  • Hi!
    How to send SMS in android?


  • Lifetime Qt Champion

    Hi,

    Did you try to look up the Android API ? A quick search turns out SmsManager.



  • How in Qt to connect to the Android API and use some function, for example createAppSpecificSmsToken (PendingIntent intent)?



  • Use Qt Android Extras helpers. Also you can read about here (from first to last episode).



  • @Mikeeeeee , you can write a java class which contains the function to send the sms, and after that you can use the QtAndroid and QAndroidJniEnvironment in your cpp class and call the function defined in your java class.
    Something like this:-

    QtAndroid::androidActivity().callMethod<void>("sendSMS");
    

    I had used "textLocal" (sms platform) in a project i was working on and it worked really nice, so they have few API's which you can make use of.If you want the code for that please have a look at this[http://api.textlocal.in/docs/sendsms].

    For more information about QtAndroid[https://doc.qt.io/qt-5/qtandroid.html] and QAndroidJniEnvironment[https://doc.qt.io/qt-5/qandroidjnienvironment.html]



  • If I add QT + = androidextras, I get an error: Unknown module (s) in QT: androidextras



  • Hi @Mikeeeeee , you need to add like this:-

    android: QT += androidextras


  • In .pro the file was compiled. If I add #include <Qt Android Extras> I get errors: 'QtAndroidExtras' file not found , QtAndroidExtras: No such file or directory
    #include <QtAndroidExtras>


  • Lifetime Qt Champion

    Might be a silly question but are you building that with your Qt Android kit ?



  • MinGW does not compile, Clang compiles. Thanks.


  • Lifetime Qt Champion

    That has nothing to do with your error. You were using a Qt build that was not for Android, likely your desktop build.

    MinGW is unrelated to the Qt Android version. The compiler is provided by the Android NDK.



  • How to call a method in Qt from java SmsManager::createAppSpecificSmsTokenWithPackageinfo(String prefixes, PendingIntent intent)


  • Qt Champions 2019



  • Will this option work, or should we do it differently?

        QAndroidJniObject testSms;
        testSms.callMethod< jint > ("createAppSpecificSmsTokenWithPackageInfo(32133)");
    


  • @Mikeeeeee said in How to send SMS in android?:

    Will this option work

    Have you already tried? Trial and error is a way to learn...



  • It doesn't work. How can this be fixed to work?



  • @Mikeeeeee

        QAndroidJniObject testSms;
        testSms.callMethod< jint > ("createAppSpecificSmsTokenWithPackageInfo(32133)");
    

    With the warning that I know absolutely nothing about this:

    You are using the overload https://doc.qt.io/qt-5/qandroidjniobject.html#callMethod, callMethod(const char *methodName). It may well be that methodName has to be a method name, "createAppSpecificSmsTokenWithPackageInfo(32133)" is a full function call. You may have to use overload https://doc.qt.io/qt-5/qandroidjniobject.html#callMethod-1, callMethod(const char *methodName, const char *sig, ...), and specify the function signature and pass 32133 as parameter, in order to call functions with parameters?

    Have you/can you test if you can call a method which does not take any parameters, does that work OK?



  • The SmsManager class has a getcarrierconfigvalues() function without an argument.
    This code also generates an error:

        QAndroidJniObject testSms;
        testSms.callMethod< jint > ("getCarrierConfigValues()");
    

  • Qt Champions 2019

    @Mikeeeeee said in How to send SMS in android?:

    generates an error

    Please post the error



  • "org.qt project.example.smsTest" crashed.


  • Qt Champions 2019

    @Mikeeeeee Does it crash when

    testSms.callMethod< jint > ("getCarrierConfigValues()");
    

    is executed?
    Also consider that some APIs require your app to request access rights from the user.



  • @Mikeeeeee If you remove all the "SMS sending" stuff from your source code, does it compile and can you start it on your device (or emulator) ?



  • @Mikeeeeee When you have a working Qt Android App, adding SMS sending support is not that compilcated.

    1. ensure Android Extras are enabled (in pro file, add android: QT += androidextras)
    2. ensure you have add required permission in AndroidManifest.xml (android.permission.SEND_SMS )
    3. Add following code to the class you want to use to send SMS, for example JniHandler:
    #include <QtAndroid>
    #include <QAndroidJniObject>
    #include <QtAndroidExtras/QAndroidJniObject>
    #include <QtAndroidExtras/QAndroidJniEnvironment>
    #include <jni.h>
    ...
    
    void JniHandler::sendSMS(const QString& phoneNumber, const QString& message)
    {
        QtAndroid::runOnAndroidThreadSync([phoneNumber, message]  {
            // get the Qt android activity
            QAndroidJniObject activity = QtAndroid::androidActivity();
            if (activity.isValid()){
                // get the default SmsManager
                QAndroidJniObject mySmsManager = QAndroidJniObject::callStaticObjectMethod("android/telephony/SmsManager",
                                                                                           "getDefault",
                                                                                           "()Landroid/telephony/SmsManager;" );
                // get phone number & text from UI and convert to Java String
                QAndroidJniObject myPhoneNumber = QAndroidJniObject::fromString(phoneNumber);
                QAndroidJniObject myTextMessage = QAndroidJniObject::fromString(message);
                QAndroidJniObject scAddress = NULL;
                QAndroidJniObject sentIntent = NULL;
                QAndroidJniObject deliveryIntent = NULL;
            
                // call the java function:
                // public void SmsManager.sendTextMessage(String destinationAddress,
                //                                        String scAddress, String text,
                //                                        PendingIntent sentIntent, PendingIntent deliveryIntent)
                // see: http://developer.android.com/reference/android/telephony/SmsManager.html
            
                mySmsManager.callMethod<void>("sendTextMessage",
                                              "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V",
                                               myPhoneNumber.object<jstring>(),
                                               scAddress.object<jstring>(),
                                               myTextMessage.object<jstring>(), NULL, NULL );
            
                  }
            else {
                qDebug() << "Something wrong with Qt activity...";
            }
        }
    }
    

    This should do the job.



  • @KroMignon said in How to send SMS in android?:

    android.permission.SEND_SMS

    android.permission.SEND_SMS must be added to .pro file?



  • @Mikeeeeee said in How to send SMS in android?:

    android.permission.SEND_SMS must be added to .pro file?

    No, it must be added into the manifest (AndroidManifest.xml) ==> editing-manifest-files



  • Void MainWindow::sendSMS is missing ")". Added so and still not working. What's right?

    void MainWindow::sendSMS(const QString& phoneNumber, const QString& message)
    {
        QtAndroid::runOnAndroidThreadSync([phoneNumber, message]  {
            // get the Qt android activity
            QAndroidJniObject activity = QtAndroid::androidActivity();
            if (activity.isValid()){
                // get the default SmsManager
                QAndroidJniObject mySmsManager = QAndroidJniObject::callStaticObjectMethod("android/telephony/SmsManager",
                                                                                           "getDefault",
                                                                                           "()Landroid/telephony/SmsManager;" );
                // get phone number & text from UI and convert to Java String
                QAndroidJniObject myPhoneNumber = QAndroidJniObject::fromString(phoneNumber);
                QAndroidJniObject myTextMessage = QAndroidJniObject::fromString(message);
                QAndroidJniObject scAddress = NULL;
                QAndroidJniObject sentIntent = NULL;
                QAndroidJniObject deliveryIntent = NULL;
    
                // call the java function:
                // public void SmsManager.sendTextMessage(String destinationAddress,
                //                                        String scAddress, String text,
                //                                        PendingIntent sentIntent, PendingIntent deliveryIntent)
                // see: http://developer.android.com/reference/android/telephony/SmsManager.html
    
                mySmsManager.callMethod<void>("sendTextMessage",
                                              "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V",
                                               myPhoneNumber.object<jstring>(),
                                               scAddress.object<jstring>(),
                                               myTextMessage.object<jstring>(), NULL, NULL );
    
                  }
            else {
                qDebug() << "Something wrong with Qt activity...";
            }
        });
    }
    


  • @Mikeeeeee What do you mean with "not working"? Do you have an error message? Is there an application crash?

    Just say "not working" does not give any information to help you!

    PS: Sorry for the missed parenthese



  • Error: "org.qtproject.example" crashed.



  • @Mikeeeeee said in How to send SMS in android?:

    Error: "org.qtproject.example" crashed.

    That's also not helpful, we can not see what you are doing, if you want help, than you must explain what is the problem and what is your development environment/settings:

    • which Qt Kit are you using to build your project? (for exampleAndroid for armeabi-v7a (Clang Qt 5.7.1 for Android armv7)
    • which Qt Creator Version you are using
    • what is your target device? It is a smartphone, a tablet or an emulator?
    • what Android version are you targeting?
    • when does the application crash? When you starting the application or when you try to send a SMS?

    You give nothing to enable us to help you, this is all up to you.

    Last, but not least, is your device capable to send SMS?



    1. I use Android for armeabi-v7a (Clang Qt 5.12.3 for Android armv7)
    2. I use Qt Creator 5.12.2
    3. Target device - smartphone
    4. Android version 6
    5. Crash application when I start the function of sending SMS
    6. My smartphone is able to send SMS


  • @Mikeeeeee said in How to send SMS in android?:

    The SmsManager class has a getcarrierconfigvalues() function without an argument.
    This code also generates an error:

        QAndroidJniObject testSms;
        testSms.callMethod< jint > ("getCarrierConfigValues()");
    

    Have only just seen this. As I said, and as the documentation states, the argument is supposed (according to my understanding) to be a method name, so getCarrierConfigValues and not getCarrierConfigValues(), or any such with parentheses. I don't know where you are in your investigations, but did you at least try something like that once? If you have gotten further through since then, you may ignore.



  • It's too not work

        QAndroidJniObject testSms;
        testSms.callMethod< jint > ("getCarrierConfigValues");
    


  • @Mikeeeeee

    For those interested, after quite a struggle, I've managed to send SMS on Android using the multi part API.
    The C++ code is also notified of the Delivery from the Android BroadcastReceivers \o/

    All this is encapsulated in a SmsSender object with an easy API:
    Q_INVOKABLE void sendText(const QString &destMobile, const QString &msg);

    The code is published on github here: sendSMS.
    There is a minimalist QML GUI.

    alt text

    Hope it will save some people some time! ;)


Log in to reply