从 IntentService 发送短信?
Sending SMS from an IntentService?
我想做以下事情:
- 发送短信
- 检查是否已发送
- 如果不是,则将其存储在 SQLite 实例中。
- 重新发送之前存储的任何短信。
所以你有一个主要的 SMS 发送操作,它需要对其状态的反馈(告诉用户它是否可以发送),以及一个后台 SMS 发送操作,它只会尝试重新发送以前未发送的 SMS默默地。
我提出的解决方案涉及一个具有两个操作的 IntentService:
- 发送短信。
- 尝试发送以前存储的短信。
到目前为止一切顺利,这完全相同的事情在向服务器发送 TCP 消息方面创造了奇迹。现在的问题是我似乎无法从 IntentService 发送短信。
我们的想法是让 IntentService 创建一个 PendingIntent,将主要 Activity 提供的 PendingIntent 填充到里面(这基本上是告诉 activity 短信已发送的回调),然后发送短信有了它。
然后使用静态接收器获取 PendingIntent 并在 IntentService 上启动一个新操作,以从 SQLite 实例中删除正确发送的 SMS。
这是IntentService中主要的消息发送方法:
private void sendMessage(Configuration cfg, SMSMessage msg, PendingIntent resultIntent) {
final Intent smsIntent;
// Select which kind of intent we're creating.
if (resultIntent == null) {
// This one is the silent background SMS.
smsIntent = new Intent(this.getApplicationContext(), RedirectPendingMessages.class);
} else {
// This one is the one from the application.
smsIntent = new Intent(this.getApplicationContext(), RedirectMessage.class);
smsIntent.putExtra(EXTRA_PENDING_RESULT, resultIntent);
}
// Now store the message.
smsIntent.putExtra(EXTRA_SMS, msg);
// Construct broadcast intent.
PendingIntent pi = PendingIntent.getBroadcast(this.getApplicationContext(), 0, smsIntent, 0);
// Now send message.
SmsManager smsMng = SmsManager.getDefault();
smsMng.sendTextMessage(cfg.phoneNumberFor(msg.level), null, msg.content, pi, null);
}
它进入 'SmsManager.sendTextMessage' 方法正常,但是 什么都没有发生 ,即使我对 phone 号码进行硬编码并且不传递任何 PendingIntent 短信 仍然没有发送。 可能是因为方法调用后IntentService不存在了?
接收器都只是抓取广播的 Intent,获取里面的数据,并在 IntentService 中启动适当的操作以删除已发送的 SMS,并广播应用程序的 PendingIntent,以便 UI向用户提供一些反馈("SMS sent"、"Error" 等)。
我对同一事物的 TCP 实现几乎只有 Socket 写入而不是 'sendTextMessage',它会阻止 IntentService 直到它完成并且工作正常。
关于为什么没有发送 SMS 或如何更好地实现它的任何想法?
您的邮件似乎超出了您使用的字母表的字符限制,这导致 SmsManager#sendTextMessage()
方法无提示地失败。
对于基本的7位默认字母表,字符数限制为160个;对于 8 位,它是 140;对于 16 位,这听起来像你的情况,它是 70,解释了为什么你的 120 个字符的消息分成两部分。
如您所见,您可以使用 SmsManager#divideMessage()
方法将消息拆分为可用的部分,然后使用 SmsManager#sendMultipartTextMessage()
正确发送这些部分。
我想做以下事情:
- 发送短信
- 检查是否已发送
- 如果不是,则将其存储在 SQLite 实例中。
- 重新发送之前存储的任何短信。
所以你有一个主要的 SMS 发送操作,它需要对其状态的反馈(告诉用户它是否可以发送),以及一个后台 SMS 发送操作,它只会尝试重新发送以前未发送的 SMS默默地。
我提出的解决方案涉及一个具有两个操作的 IntentService:
- 发送短信。
- 尝试发送以前存储的短信。
到目前为止一切顺利,这完全相同的事情在向服务器发送 TCP 消息方面创造了奇迹。现在的问题是我似乎无法从 IntentService 发送短信。
我们的想法是让 IntentService 创建一个 PendingIntent,将主要 Activity 提供的 PendingIntent 填充到里面(这基本上是告诉 activity 短信已发送的回调),然后发送短信有了它。
然后使用静态接收器获取 PendingIntent 并在 IntentService 上启动一个新操作,以从 SQLite 实例中删除正确发送的 SMS。
这是IntentService中主要的消息发送方法:
private void sendMessage(Configuration cfg, SMSMessage msg, PendingIntent resultIntent) {
final Intent smsIntent;
// Select which kind of intent we're creating.
if (resultIntent == null) {
// This one is the silent background SMS.
smsIntent = new Intent(this.getApplicationContext(), RedirectPendingMessages.class);
} else {
// This one is the one from the application.
smsIntent = new Intent(this.getApplicationContext(), RedirectMessage.class);
smsIntent.putExtra(EXTRA_PENDING_RESULT, resultIntent);
}
// Now store the message.
smsIntent.putExtra(EXTRA_SMS, msg);
// Construct broadcast intent.
PendingIntent pi = PendingIntent.getBroadcast(this.getApplicationContext(), 0, smsIntent, 0);
// Now send message.
SmsManager smsMng = SmsManager.getDefault();
smsMng.sendTextMessage(cfg.phoneNumberFor(msg.level), null, msg.content, pi, null);
}
它进入 'SmsManager.sendTextMessage' 方法正常,但是 什么都没有发生 ,即使我对 phone 号码进行硬编码并且不传递任何 PendingIntent 短信 仍然没有发送。 可能是因为方法调用后IntentService不存在了?
接收器都只是抓取广播的 Intent,获取里面的数据,并在 IntentService 中启动适当的操作以删除已发送的 SMS,并广播应用程序的 PendingIntent,以便 UI向用户提供一些反馈("SMS sent"、"Error" 等)。
我对同一事物的 TCP 实现几乎只有 Socket 写入而不是 'sendTextMessage',它会阻止 IntentService 直到它完成并且工作正常。
关于为什么没有发送 SMS 或如何更好地实现它的任何想法?
您的邮件似乎超出了您使用的字母表的字符限制,这导致 SmsManager#sendTextMessage()
方法无提示地失败。
对于基本的7位默认字母表,字符数限制为160个;对于 8 位,它是 140;对于 16 位,这听起来像你的情况,它是 70,解释了为什么你的 120 个字符的消息分成两部分。
如您所见,您可以使用 SmsManager#divideMessage()
方法将消息拆分为可用的部分,然后使用 SmsManager#sendMultipartTextMessage()
正确发送这些部分。