【问题标题】:Sending SMS programmatically to multiple people getting Generic Error以编程方式向多人发送 SMS 得到一般错误
【发布时间】:2012-12-28 07:02:36
【问题描述】:

我目前正在尝试开发一个 SMS 应用程序并允许用户向多个人发送 SMS。

由于短信很长,我必须使用下面的 sendMultipartTextMessage

private void sendSMS(final String phoneNumber, String message) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    SmsManager sms = SmsManager.getDefault();
    ArrayList<String> parts = sms.divideMessage(message);
    int messageCount = parts.size();

    Log.i("Message Count", "Message Count: " + messageCount);

    ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();
    ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

    for (int j = 0; j < messageCount; j++) {
        sentIntents.add(sentPI);
        deliveryIntents.add(deliveredPI);
    }

    // ---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS sent",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(SENT));

    // ---when the SMS has been delivered---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {

            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "SMS not delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(DELIVERED));

    sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents);
}

当我尝试在这样的循环中将它发送给多个人时,我会遇到一个一般性错误,并且不会发送消息。我怀疑这是因为消息可能是 3-4 部分,即使有 3000 毫秒的延迟,android 系统也无法及时发送消息。

    for (int t = 0; t < array.length; t++) {
        System.out.println("temp: " + array[t].toString());
        try {
            sendSMS(array[t].toString(), message);
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

编辑:上面的代码在 AsyncTask 中,在 Service 中执行。

【问题讨论】:

  • 没有 logcat 错误,当我尝试将它发送给 2 个联系人时,它只会显示 SmsManager.RESULT_ERROR_GENERIC_FAILURE 的 Toast 两次说一般错误。
  • 您在模拟器或设备中遇到此错误?
  • 不,三星 Galaxy Note 在 4.1.2 Jellybean 上运行

标签: android generics sms


【解决方案1】:

IHMO 您没有使用正确的方法。我正在使用不同的,它正在工作。我试着解释一下:

您应该为所有未决意图保留一个计数器,因为如果您发送的短信有两个部分,您将收到两个 RESULT_OK(或 RESULT_ERROR_*),并且只有当您收到所有部分的结果时,您才应该继续发送下一个短信。我不喜欢阻塞线程的想法......也许这就是你得到奇怪错误的原因。

我用我的方法重构了你的代码:

private int mMessageSentParts;
private int mMessageSentTotalParts;
private int mMessageSentCount;

private void startSendMessages(){

    registerBroadCastReceivers();

    mMessageSentCount = 0;
    sendSMS(array[mMessageSentCount].toString(), message);
}

private void sendNextMessage(){
    if(thereAreSmsToSend()){
        sendSMS(array[mMessageSentCount].toString(), message);
    }else{
        Toast.makeText(getBaseContext(), "All SMS have been sent",
                        Toast.LENGTH_SHORT).show();
    }
}

private boolean thereAreSmsToSend(){
    return mMessageSentCount < array.length;
}

private void sendSMS(final String phoneNumber, String message) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    SmsManager sms = SmsManager.getDefault();
    ArrayList<String> parts = sms.divideMessage(message);
    mMessageSentTotalParts = parts.size();

    Log.i("Message Count", "Message Count: " + mMessageSentTotalParts);

    ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();
    ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

    for (int j = 0; j < mMessageSentTotalParts; j++) {
        sentIntents.add(sentPI);
        deliveryIntents.add(deliveredPI);
    }

    mMessageSentParts = 0;
    sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents);
}

private void registerBroadCastReceivers(){

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:

                mMessageSentParts++;
                if ( mMessageSentParts == mMessageSentTotalParts ) {
                    mMessageSentCount++;
                    sendNextMessage();
                }

                Toast.makeText(getBaseContext(), "SMS sent",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(SENT));

    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {

            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "SMS not delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(DELIVERED));

}

【讨论】:

  • 您的方法是否只是向单个用户发送消息?因为在我的情况下,array[t].toString() 是大约 2 到 3 人而不是 1 人的字符串数组。
  • 它一次将消息发送给一个收件人。我假设您的数组的每个位置都是一个电话号码。
  • 只想问有没有什么办法可以检测到我要发送到的接收方的电话号码?
  • 应该是array[mMessageSentCount].toString()
  • 谢谢。当想要发送大量短信时,这被证明很有帮助,因为我的应用程序只会在各种设备上的随机数处停止。现在所有消息都已发送。
【解决方案2】:

使用此代码时,我遇到了同样的错误“一般故障”。但我使用了 array[mMessageSentCount].toString().trim()。 然后它解决了我的问题并且工作正常。 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2015-02-12
    • 2013-10-05
    相关资源
    最近更新 更多