Android sendTextMessage会在执行时发送两条相同的消息
我一直在开发一个发送短信的应用程序。我的问题是sendTextMessage方法发送两条内容相同的消息。我该如何解决这个问题 这个类开始这个过程Android sendTextMessage会在执行时发送两条相同的消息,android,Android,我一直在开发一个发送短信的应用程序。我的问题是sendTextMessage方法发送两条内容相同的消息。我该如何解决这个问题 这个类开始这个过程 public class C2DMMessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Some stuff Log.i("C2DMMe
public class C2DMMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Some stuff
Log.i("C2DMMessageReceiver", "Got C2DM message");
SmsSend message = new SmsSend(context, phonenumber, line);
message.send()
}
}
用于发送文本消息的类
public class SmsSend {
SmsSend(Context tcontext, String phoneNumber, String smstext){
context = tcontext;
phone_number = phoneNumber;
message = smstext;
}
protected void send(){
if(foo){
Log.i("SmsSend", "Sending message");
SmsManager sms = SmsManager.getDefault();
String sent = "android.telephony.SmsManager.STATUS_ON_ICC_SENT";
PendingIntent piSent = PendingIntent.getBroadcast(context, 0, new Intent(sent), 0);
sms.sendTextMessage(phone_number, null, message, piSent, null);
}
}
}
上课来了解发生了什么
public class SmsSentBroadcastReciever extends BroadcastReceiver{
private static final String TAG = "SmsSentBroadcastReciever";
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()){
case Activity.RESULT_OK:
Log.i(TAG,"SMS sent");
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Log.e(TAG,"Generic failure");
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Log.e(TAG,"No service");
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Log.e(TAG,"PDU NULL");
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Log.e(TAG,"Radio off");
break;
}
}
}
LogCat的输出为
收到C2DM消息
发送消息
发送短信
发送短信
因此,sendTextMessage只触发一次,但仍会抛出两条消息。怎么办
我正在调试的设备是三星Galaxy S2和安卓4.0。我读到一些旧线程说sendTextMessage在某些(HTC)设备上被破坏,因此我尝试使用sendMultipartTextMessage,但结果相同。此代码将在活动返回时打印“SMS sent”,而不是在SMS实际发送时打印
public void onReceive(Context context, Intent intent) {
switch (getResultCode()){
case Activity.RESULT_OK:
Log.i(TAG,"SMS sent");
break;
所以可能发生的情况是,您正在运行的另一个活动正在退出,然后返回RESULT\u OK。不过我真的不知道,因为我可以看到你是如何设置你的广播接收器来接收的
问题是上述答案中报告的固件。专门针对Galaxy S2的固件(LPQ)存在问题,除股票消息应用程序外,所有第三方应用程序(包括Handcent、GO SMS等)都会发送两次SMS。我认为最新版本的固件LP7修复了重复发送SMS的问题。您能验证手机上的固件版本吗
Handcent&GO SMS找到了自己的解决方法,并将其APK升级到市场。以下代码可以正常工作,S2与ICS配合使用:
void sendMessageGTI9100ICS(String number, String msg) throws Exception {
SmsManager m = SmsManager.getDefault();
Class aclass[] = new Class[9];
aclass[0] = String.class;
aclass[1] = String.class;
aclass[2] = ArrayList.class;
aclass[3] = ArrayList.class;
aclass[4] = ArrayList.class;
aclass[5] = Boolean.TYPE;
aclass[6] = Integer.TYPE;
aclass[7] = Integer.TYPE;
aclass[8] = Integer.TYPE;
Method method = m.getClass().getMethod("sendMultipartTextMessage", aclass);
Object aobj[] = new Object[9];
aobj[0] = number;
aobj[1] = null;
aobj[2] = m.divideMessage(msg);
aobj[3] = null;
aobj[4] = null;
aobj[5] = Boolean.valueOf(false);
aobj[6] = Integer.valueOf(0);
aobj[7] = Integer.valueOf(0);
aobj[8] = Integer.valueOf(0);
method.invoke(m, aobj);
}
我已经创建了一个小的Android库项目,该项目使用Stipa的回复以及代码来解决这个问题,使其在HTC纹身上工作,并确保根据设备选择正确的实现
试着在SMSSentBroadcastReceiver中打印您的意图。也许你得到的比你预期的要多我只是得到了2倍的意图{act=android.telephony.SmsManager.STATUS_ON_ICC_SENT flg=0x10 cmp=com.my.android.app.thisapp/.smssentbroadcastReceiver}。如果你删除了
pendingingingent
,会发生什么?可能smsmsmanager
将以任何方式发送广播以及您指定的意图。没有任何内容(除了日志消息dpn未显示)。它仍然发送两条短信。为了澄清,你发送短信的设备是否真的收到了两条短信?嗯……好的。接受者看起来这个答案实际上是不正确的。表示如果SMS发送正确,则返回的结果是Activity.result\u OK。接收方不会从返回的活动中接收意图,因为它没有设置为接收这些意图。这是正确的。我已经做了一个bug报告,一旦更新可用,一切都会好起来。@daker你能得到一个链接到这个报告和关于这个firmware的更多信息吗?请你向我解释一下,为什么你要使用9个参数作为aclass。当我检查“sendMultipartTextMessage”的参数数量时,它只有5个,所以上面的示例找不到提到的方法。但当我删除参数5、6、7和8时,它会找到它。我很困惑。这是一个被重写的方法,它不是公共API的一部分,但它可以通过反射来访问。这对我很有用!嗯,三星版本现在只发送一次短信。我还不能保证非三星版本,但看起来不错。谢谢