【问题标题】:How can I send sms messages in the BACKGROUND using Android?如何使用 Android 在后台发送短信?
【发布时间】:2011-09-15 17:28:11
【问题描述】:

我来自 iphone 开发,如果不要求用户确认发送,您将无法在后台发送 SMS。可以在android后台发送短信,不需要用户干预吗?

【问题讨论】:

标签: android sms smsmanager


【解决方案1】:

以 toast 形式发送带有 SMS-Delivery 通知的 SMS。

方法调用如下。

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

方法签名如下。

/*
 * 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 这里是发送短信的广播接收器。 您可以在清单文件中定义它。
  • 它可以在没有两个 BroadCastReceiver 类的情况下工作。所以挂起的强度等等..可以改用: sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage,null,null);非常感谢@sandy;
【解决方案2】:

是的,您可以使用:

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

【讨论】:

  • @Zubair 我从未亲自尝试过,其他人已经尝试过了,而且效果很好。我在您的问题 cmets 中发送的链接提到它有效。
  • 不要在清单中忘记这一点:
【解决方案3】:

【讨论】:

  • 感谢您的链接。但是文章没有说明我是否可以在后台发送短信
  • 您可以使用来自ServiceBroadcastReceiver 的逻辑,这是有效的背景(除非您对背景有不同的想法?)。如果您更具体地说明您要做什么?
  • 您的意思是我们可以从 BroadcastReceiver 或 Service 类中复制代码吗?
  • 您可以将该代码复制到处理后台工作的广播接收器或服务类中。
【解决方案4】:

最佳答案是好的,但在 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);

    }
}

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2023-03-19
    相关资源
    最近更新 更多