如何在Android中后台发送短信?

15

我来自iPhone开发领域,在那里你不能在后台发送短信而不需要询问用户确认发送。在Android中,是否可以在后台发送短信而不需要任何用户干预?


4
看看这个链接: https://dev59.com/21bTa4cB1Zd3GeqP8z2L - sealz
3个回答

28

发送带有短信传送通知的短信弹窗。

方法调用如下。

sendSMS("98********","This is test message");

以下是方法签名 — 我从https://mobiforge.com/design-development/sms-messaging-android复制的代码:

/*
* BroadcastReceiver mBrSend; BroadcastReceiver mBrReceive;
*/
private void sendSMS(String phoneNumber, String message) {
  ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>();
  ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>();
  PendingIntent sentPI = PendingIntent.getBroadcast(mContext, 0,
          new Intent(mContext, SmsSentReceiver.class), 0);
  PendingIntent deliveredPI = PendingIntent.getBroadcast(mContext, 0,
          new Intent(mContext, SmsDeliveredReceiver.class), 0);
  try {
      SmsManager sms = SmsManager.getDefault();
      ArrayList<String> mSMSMessage = sms.divideMessage(message);
      for (int i = 0; i < mSMSMessage.size(); i++) {
          sentPendingIntents.add(i, sentPI);
          deliveredPendingIntents.add(i, deliveredPI);
      }
      sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage,
              sentPendingIntents, deliveredPendingIntents);

  } catch (Exception e) {

      e.printStackTrace();
      Toast.makeText(getBaseContext(), "SMS sending failed...",Toast.LENGTH_SHORT).show();
  }

}
现在还有两个类SmsDeliveredReceiver和SmsSentReceiver如下。
public class SmsDeliveredReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent arg1) {
      switch (getResultCode()) {
          case Activity.RESULT_OK:
              Toast.makeText(context, "SMS delivered", Toast.LENGTH_SHORT).show();
              break;
          case Activity.RESULT_CANCELED:
              Toast.makeText(context, "SMS not delivered", Toast.LENGTH_SHORT).show();
              break;
      }
   }
}

现在是SmsSentReceiver。

public class SmsSentReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent arg1) {
      switch (getResultCode()) {
          case Activity.RESULT_OK:
              Toast.makeText(context, "SMS Sent", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
              Toast.makeText(context, "SMS generic failure", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_NO_SERVICE:
              Toast.makeText(context, "SMS no service", Toast.LENGTH_SHORT)
              .show();
              break;
          case SmsManager.RESULT_ERROR_NULL_PDU:
              Toast.makeText(context, "SMS null PDU", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_RADIO_OFF:
              Toast.makeText(context, "SMS radio off", Toast.LENGTH_SHORT).show();
              break;
      }
   }
}

现在,打开你的 AndroidManifest.xml 文件并添加以下行:

<uses-permission android:name="android.permission.SEND_SMS"/>

这些广播接收器在清单文件中的意图过滤器是什么? - Saty
@Saty 这里是用于发送短信的广播接收器。 <receiver android:name=".SmsSentReceiver"/> <receiver android:name=".SmsDeliveredReceiver"/> 你可以在清单文件中定义它。 - GrIsHu
1
它可以在没有两个BroadCastReceiver类的情况下工作。因此,可以使用待处理强度等:sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage,null,null);非常感谢@sandy; - Samir Alakbarov

20

是的,你可以通过使用以下方法来实现:

SmsManager sm = SmsManager.getDefault(); 
sm.sendTextMessage(number, null, message, null, null); 

2
@Zubair 我个人从未尝试过,但其他人已经尝试并且有效。我在你的问题评论中发送的链接提到它是有效的。 - sealz
2
不要忘记在清单文件中添加以下内容: <uses-permission android:name="android.permission.SEND_SMS"/> - Mike Brian Olivera

2

最佳答案不错,但在API级别23以上,您需要以编程方式获取权限。否则,每次都会提示权限。

 private static final int PERMISSION_REQUEST_CODE = 1;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

    if (checkSelfPermission(Manifest.permission.SEND_SMS)
            == PackageManager.PERMISSION_DENIED) {

        Log.d("permission", "permission denied to SEND_SMS - requesting it");
        String[] permissions = {Manifest.permission.SEND_SMS};

        requestPermissions(permissions, PERMISSION_REQUEST_CODE);

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接