Android sendTextMessage会在执行时发送两条相同的消息

Android sendTextMessage会在执行时发送两条相同的消息,android,Android,我一直在开发一个发送短信的应用程序。我的问题是sendTextMessage方法发送两条内容相同的消息。我该如何解决这个问题 这个类开始这个过程 public class C2DMMessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Some stuff Log.i("C2DMMe

我一直在开发一个发送短信的应用程序。我的问题是sendTextMessage方法发送两条内容相同的消息。我该如何解决这个问题

这个类开始这个过程

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的一部分,但它可以通过反射来访问。这对我很有用!嗯,三星版本现在只发送一次短信。我还不能保证非三星版本,但看起来不错。谢谢