I'm rather new to Android.
Im trying to send SMS from Android application.
When using the SMS Intent the SMS window opens and the user needs to approve the SMS and send it.
Is there a way to automatically send the SMS without the user confirming it?
Thanks,
Lior
You can use this method to send an sms. If the sms is greater than 160 character then sendMultipartTextMessage is used.
private void sendSms(String phonenumber,String message, boolean isBinary)
{
SmsManager manager = SmsManager.getDefault();
PendingIntent piSend = PendingIntent.getBroadcast(this, 0, new Intent(SMS_SENT), 0);
PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(SMS_DELIVERED), 0);
if(isBinary)
{
byte[] data = new byte[message.length()];
for(int index=0; index<message.length() && index < MAX_SMS_MESSAGE_LENGTH; ++index)
{
data[index] = (byte)message.charAt(index);
}
manager.sendDataMessage(phonenumber, null, (short) SMS_PORT, data,piSend, piDelivered);
}
else
{
int length = message.length();
if(length > MAX_SMS_MESSAGE_LENGTH)
{
ArrayList<String> messagelist = manager.divideMessage(message);
manager.sendMultipartTextMessage(phonenumber, null, messagelist, null, null);
}
else
{
manager.sendTextMessage(phonenumber, null, message, piSend, piDelivered);
}
}
}
Update
piSend and piDelivered are Pending Intent They can trigger a broadcast when the method finish sending an SMS
Here is sample code for broadcast receiver
private BroadcastReceiver receiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
String message = null;
switch (getResultCode()) {
case Activity.RESULT_OK:
message = "Message sent!";
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
message = "Error. Message not sent.";
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
message = "Error: No service.";
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
message = "Error: Null PDU.";
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
message = "Error: Radio off.";
break;
}
AppMsg.makeText(SendMessagesWindow.this, message,
AppMsg.STYLE_CONFIRM).setLayoutGravity(Gravity.BOTTOM)
.show();
}
};
and you can register it using below line in your Activity
registerReceiver(receiver, new IntentFilter(SMS_SENT)); // SMS_SENT is a constant
Also don't forget to unregister broadcast in onDestroy
#Override
protected void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
If your application has in the AndroidManifest.xml the following permission
<uses-permission android:name="android.permission.SEND_SMS"/>
you can send as many SMS as you want with
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(...);
and that is all.
Yes, you can send SMS using the SmsManager. Please keep in mind that your application will need the SEND_SMS permission for this to work.
Yes, you can send sms without making user interaction...But it works, when user wants to send sms only to a single number.
try {
SmsManager.getDefault().sendTextMessage(RecipientNumber, null,
"Hello SMS!", null, null);
} catch (Exception e) {
AlertDialog.Builder alertDialogBuilder = new
AlertDialog.Builder(this);
AlertDialog dialog = alertDialogBuilder.create();
dialog.setMessage(e.getMessage());
dialog.show();
}
Also, add manifest permission....
<uses-permission android:name="android.permission.SEND_SMS"/>
Related
I've created application to send Proximity Alert via SMS. SMS delivering fine. But when my phone scree is locked Proximity Alert failed to fire alert. I don't want my phone screen awake all times and i still want my app to alert even the screen is locked or sleep. Any Solutions to it.
This is my code for adding Proximity Alert in Main Activity's onCreate()
try{
databaseHelper = new DatabaseHelper(this);
db = databaseHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select rowid _id,*from latLngTable", null);
go=cursor.moveToFirst();
while (cursor.isAfterLast()!=true){
String strLat = cursor.getString(cursor.getColumnIndex("latitude"));
String strLng = cursor.getString(cursor.getColumnIndex("longitude"));
String mobileNo=cursor.getString(cursor.getColumnIndex("Phone_NO"));
double dLat = Double.parseDouble(strLat);
double dLng = Double.parseDouble(strLng);
float radius = 2000;
LocationManager locationManager2 = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager2.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
String proximitys = "com.realtech.latlngrecorder" + n;
Intent i = new Intent(proximitys);
i.putExtra("phone", mobileNo);
sendBroadcast(i);
PendingIntent pi = PendingIntent.getBroadcast(this, n, i, PendingIntent.FLAG_CANCEL_CURRENT);
locationManager2.addProximityAlert(dLat, dLng, radius, -1, pi);
IntentFilter filter = new IntentFilter(proximitys);
registerReceiver(new ProximityIntentReceiver(), filter);
Log.w("Alert Added", "Alert Added to All Locations");
Toast.makeText(MainPage.this,"Proximity Alert Added",Toast.LENGTH_SHORT).show();
n++;
cursor.moveToNext();
}
}catch (SQLiteException e){
e.printStackTrace();
Toast.makeText(MainPage.this,"Failed to add Proximity Alert",Toast.LENGTH_SHORT).show();
}
My BroadcastReceiver for proximity alert was
public void onReceive(Context context, Intent intent) {
smsNo=intent.getStringExtra("phone");
String proximityKey= LocationManager.KEY_PROXIMITY_ENTERING;
Boolean entering=intent.getBooleanExtra(proximityKey,false);
if (entering){
Log.d(getClass().getSimpleName(), "entering");
try {
SmsManager smsManager=SmsManager.getDefault();
String[] numbers=smsNo.split(",");
for (String number:numbers) {
smsManager.sendTextMessage(number, null, "School Van will reach your place in 2 mins.\n\u0bb8\u0bcd\u0b95\u0bc2\u0bb2\u0bcd \u0bb5\u0bc7\u0ba9\u0bcd \u0bb5\u0bb0\u0baa\u0bcd\u0baa\u0bcb\u0b95\u0bbf\u0bb1\u0ba4\u0bc1.", null, null);
}
}catch (Exception e) {
Toast.makeText(context, "No Mobile Number", Toast.LENGTH_SHORT).show();
}
}else {
Log.d(getClass().getSimpleName(), "exiting");
Toast.makeText(context,"exiting",Toast.LENGTH_SHORT).show();
}
}
And another thing if i restart the app the event fires again.
Please help me to run my app always in background even if the user closes it. Thank you.
Hey I'm making an app in which I need to send a text message but every time I send the message the app opens again and all the variables are reset(I have tried to implement a system that save the variables but they still get reset), however it still sends the message. Why is it doing this, and how can I fix it; this is my code
public void sendSMS(String phono, String mes)
{
PendingIntent pi = PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class), 0);
SmsManager sm = SmsManager.getDefault();
sm.sendTextMessage(phono, null, mes, pi, null);
}
//Button that uses method
b = (Button) findViewById(R.id.b);
b.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v)
{
phono = "personal phone number";
if (phono.length() > 0 && mes.length() > 0)
sendSMS(phono, mes);
}
});
You are asking the SMSManager to relaunch your app when the SMS is successfully sent.
From the docs,
public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent),
the pi in your code will be used as the sentIntent, which means when the SMS is sent out of the device, SMSManager will automatically trigger the intent.
If you don't want the SMS manager to relaunch your app again after the SMS is sent, just send a null in place of pi.
sm.sendTextMessage(phono, null, mes, null, null);
Replace sm.sendTextMessage(phono, null, mes, pi, null); with
sm.sendTextMessage(phono, null, mes, null, null);
My android app has recently been suspended from the play store because of the play store policy:
Do not send SMS, email, or other messages on behalf of the user without providing the user with the ability to confirm content and intended recipient.
My application is mainly a vas sms application for a telecommunication provider. Now am trying to create a confirmation for all sms send using DialogFrament. What I want is to have a single dialog class and method that will be reuse for all sms sending confirmation. I have look through the forum but can find what am looking for.
What is manage to have was
public class sendSMS extends Activity
{
public sendSMS(final String phoneNo, final String sms)
{
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener()
{
#Override
public void onClick(DialogInterface dialog, int which)
{
switch (which)
{
case DialogInterface.BUTTON_POSITIVE:
//Do your Yes progress
try
{
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, sms, null, null);
Toast.makeText(getApplicationContext(),
"Request Sent!",
Toast.LENGTH_LONG).show();
// finish();
}
catch (Exception e)
{
Toast.makeText(getApplicationContext(),
"Request faild, please try again later!",
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
break;
case DialogInterface.BUTTON_NEGATIVE:
//Do your No progress
dialog.cancel();
break;
}
}
};
AlertDialog.Builder ab = new AlertDialog.Builder(this);
ab.setMessage("Are you sure to delete?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
return;
//AlertDialog alertDialog = ab.create();
// alertDialog.show();
}
}
And I am calling it in my activity as:
new sendSMS(phoneNo, sms);
But whenever I click on the function the app crashes with a NullPointerException error. I need help as I have several sms trigger methods rewriting the confirmation over and over just seems a bit over kill.
I'm developing an Android app where i need to send single message to
receive multiple emulator at a time .But the problem is only one
emulator is receiving the message.Here is my code.
public class SMS extends Activity
{
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSendSMS = (Button) findViewById(R.id.btn_SendSms);
txtPhoneNo = (EditText) findViewById(R.id.edittext_PhoneNumber);
txtMessage = (EditText) findViewById(R.id.edittext_MessageBody);
btnSendSMS.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
String message = txtMessage.getText().toString();
String phoneNo = txtPhoneNo.getText().toString();
StringTokenizer st=new StringTokenizer(phoneNo,",");
while (st.hasMoreElements())
{
String tempMobileNumber = (String)st.nextElement();
if(tempMobileNumber.length()>0 && message.trim().length()>0)
{
sendSMS(tempMobileNumber, message);
}
else
{
Toast.makeText(getBaseContext(),
"Please enter both phone number and message.",
Toast.LENGTH_SHORT).show();
}
}
}
});
}
private void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver()
{
#Override
public void onReceive(Context arg0, Intent arg1)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
} , new IntentFilter(SENT));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
}
To send an SMS message to another emulator instance which running on same machine, launch the SMS application. Specify the console port number(ex:5555) of the target emulator instance as as the SMS address.
Please note that this answer is based on :Linuxtopia guide.
You can create the array of emulator id or number then put sendTextMessage into that execute the loop as many element into the the array. OR You can have UI that allow the user to insert the phone number or emulator number in to the list and same procedure as above !!!
note that sendTextMessage `s first argument is "Phone Number" to whom you want to send sms
simply replace it with your requirement every as loop iterate
I have a program that sends pre-defined text messages to a group of people at a push of a button. I have it working well but the problem I have is that when it sends the messages, it pops up with 2 toasts per message sent. Code:
package com.mfd.alerter;
//imports
public class homeScreen extends Activity {
//buttons
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//vars
// Grab the time
final Date anotherCurDate = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("km");
final String formattedTime = formatter.format(anotherCurDate);
// Contacts
final String[] numbers = getResources().getStringArray(R.array.numbers);
// Start messages. Only 1 is given to shorten post
callStructureFire.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String msgText = "MFD PAGE OUT:\nStructure Fire\nTimeout:"+formattedTime;
for (int i = 0; i < numbers.length; i++) {
sendSMS(numbers[i], msgText);
}
}
});
//more call types. not important.
}
//---sends a SMS message to another device---
private void sendSMS(String numbers, String message)
{
String SENT = "SMS_SENT";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
#Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(numbers, null, message, sentPI, null);
}
//action bar stuff. not important.
}
More in detail: Lets say I send the text to 3 people, 6 toast messages will pop up saying "SMS Sent". How do I make it so only 3 will show up?
Also, Is there a way to maybe add a counter of the messages sent? Ex: "Message 1/10 sent", "Message 2/10 sent", etc?
I didn't really look at your code or asked myself why this happens but here's a trick to stop toasts show up twice:
Create a Toast instance using makeToast(), before showing it you call cancel(), set your text and then call show(). This will dismiss the previous toast. You won't even notice that a toast is displayed twice.
That's a stupid workaround, but it works for me ;-)
Aren't you supposed to register the receiver only once and not every time you call sendSMS.
You get 6 Toasts with three sms messages because you have 3 BroadCastReceivers. So in the first run you get 1 Toast. In the second run you get 2 Toasts (the receiver that was registered in the first run is called, and the one in the second). In the third run all three receivers are called, so you get three more toasts. All in sum - 6 Toasts...
so I guess, you have to register only one receiver before the for loop where you call sendSMS, or if you want the registration in sendSMS, then you have to unregister at the end of the method.
I hope this helps,
cheers!