【发布时间】:2011-11-29 00:39:33
【问题描述】:
我对 Android 比较陌生。 我试图从 Android 应用程序发送短信。 使用 SMS Intent 时,SMS 窗口打开,用户需要批准 SMS 并发送。
有没有办法在没有用户确认的情况下自动发送短信?
谢谢, 利奥
【问题讨论】:
标签: android android-activity sms
我对 Android 比较陌生。 我试图从 Android 应用程序发送短信。 使用 SMS Intent 时,SMS 窗口打开,用户需要批准 SMS 并发送。
有没有办法在没有用户确认的情况下自动发送短信?
谢谢, 利奥
【问题讨论】:
标签: android android-activity sms
您可以使用此方法发送短信。如果短信大于 160 个字符,则使用 sendMultipartTextMessage。
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);
}
}
}
piSend 和 piDelivered 是 Pending Intent 可以在方法发送完短信后触发广播
这是广播接收器的示例代码
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();
}
};
您可以在 Activity 中使用以下行进行注册
registerReceiver(receiver, new IntentFilter(SMS_SENT)); // SMS_SENT is a constant
别忘了在 onDestroy 中注销广播
@Override
protected void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
【讨论】:
sendSMS 函数并在其正下方从main 添加registerReceiver(receiver, new IntentFilter(SMS_SENT));?你是什么意思SMS_SENT 是恒定的?我还可以进行递归,如果消息发送失败,每小时重试一次吗?谢谢你:)
AlaramManager 类。您可以多次调用此方法:)。 SMS_SENT 表示它只是一个常量,例如 private static final String SMS_SENT = "my.app";。
如果您的应用在 AndroidManifest.xml 中具有以下权限
<uses-permission android:name="android.permission.SEND_SMS"/>
您可以发送任意数量的短信
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(...);
仅此而已。
【讨论】:
是的,您可以使用SmsManager 发送短信。请记住,您的应用程序需要SEND_SMS 权限才能运行。
【讨论】:
是的,您可以在不进行用户交互的情况下发送短信......但是当用户只想向单个号码发送短信时,它可以工作。
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();
}
另外,添加清单权限....
<uses-permission android:name="android.permission.SEND_SMS"/>
【讨论】:
//sent sms
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));
// ---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
你可以使用这个完整的功能
【讨论】: