Android sendTextMessage在exceution上发送两条完全相同的消息

时间:2012-03-14 16:33:18

标签: android

我一直在开发一个发送短信的应用。我遇到的问题是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只被触发一次,但它仍会抛出两条消息。怎么办?

我正在调试的设备是带有Android 4.0的三星Galaxy S2。我读了一些旧的线程,sendTextMessage在某些(HTC)设备上被破坏,所以我尝试使用sendMultipartTextMessage,但它给出了相同的结果。

4 个答案:

答案 0 :(得分:3)

以下代码正常,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);
}

答案 1 :(得分:2)

我创建了一个小型Android库项目,使用Stipa的回复以及代码使其在HTC Tattoo上运行并确保根据设备选择正确的实现来解决此问题。

https://github.com/nadam/compatibility-sms-manager

答案 2 :(得分:1)

固件(LPQ)专门针对Galaxy S2存在问题,其中SMS在所有第三方应用(包括Handcent,GO SMS等)上发送两次,除了股票消息应用程序。我认为最新版本的固件LP7修复了重复的发送短信问题。您可以验证手机上的固件版本吗?

Handcent& GO SMS已经找到了自己的解决方案,并将他们的apks升级到了市场。

答案 3 :(得分:0)

当活动返回时,此代码将打印出“短信发送”,而不是实际发送短信时。

public void onReceive(Context context, Intent intent) {
    switch (getResultCode()){
        case Activity.RESULT_OK:
            Log.i(TAG,"SMS sent");
            break;

所以可能发生的是你运行的另一个活动正在退出然后返回RESULT_OK。我无法说清楚,因为我可以看到你如何设置接收的广播接收器。

问题是上面答案中报告的固件。