How to send SMS in android?
-
Will this option work, or should we do it differently?
QAndroidJniObject testSms; testSms.callMethod< jint > ("createAppSpecificSmsTokenWithPackageInfo(32133)");
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?
-
The SmsManager class has a getcarrierconfigvalues() function without an argument.
This code also generates an error:QAndroidJniObject testSms; testSms.callMethod< jint > ("getCarrierConfigValues()");
-
@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.
- 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?
-
@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..."; } }); }
-
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
-
@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
-
The SmsManager class has a getcarrierconfigvalues() function without an argument.
This code also generates an error:QAndroidJniObject testSms; testSms.callMethod< jint > ("getCarrierConfigValues()");
@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. -
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.Hope it will save some people some time! ;)
-
This post is deleted!