How to send SMS in android?
-
@Mikeeeeee Take a look at https://doc.qt.io/qt-5/qandroidjniobject.html
-
@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...
-
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 thatmethodName
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 pass32133
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?
-
-
@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 When you have a working Qt Android App, adding SMS sending support is not that compilcated.
- ensure Android Extras are enabled (in pro file, add
android: QT += androidextras
) - ensure you have add required permission in AndroidManifest.xml (
android.permission.SEND_SMS
) - 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.
- ensure Android Extras are enabled (in pro file, add
-
@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 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 example
Android 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?
- which Qt Kit are you using to build your project? (for example
-
@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 notgetCarrierConfigValues()
, 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.