发送短信时为什么会出现“通用故障”错误?

时间:2012-03-19 11:11:05

标签: android sms broadcastreceiver

我正在开发Android项目,我需要发送短信。我的应用通过使用网络服务收集所需信息,此信息非常短且纯文本。此信息将以SMS的形式发送。

我使用广播接收器来跟踪SMS是否成功发送,只需添加日志条目。我使用 SmsManager 发送短信

我的设备具有非常好的WiFi强度和良好的GPRS网络。在发送短信时,我发现广播接收器插入了日志条目,一些用于“成功”,一些用于“通用故障”。

为什么很少有短信因“通用故障”而失败?这背后的原因是什么?

我用谷歌搜索,发现有些人说要关掉WiFi。但是对于消费网络服务,我需要WiFi ON。

任何人都可以对此有所了解吗?有没有解决这个问题的方法?

8 个答案:

答案 0 :(得分:3)

如果你一起发送很多短信,它会淹没你的手机,所以最好有一些延迟。

接下来,如果你确实有延迟,你必须看到它没有在UI线程中完成,否则你将获得ANR。

尝试使用处理程序,我的朋友建议这一点,我试过,它运行正常。

至于通用问题,我不确定......名称Generic让它听起来像是一个正常的网络错误。

希望这些信息有用。

答案 1 :(得分:2)

我已经在时间延迟的帮助下克服了这个通用的失败消息,将一个设备发送到多个号码,它几乎消除了一般故障

for(int index=0; index < phone.length; index++){
             phonenumber=phone[index];
            Toast.makeText(cxt, "Phone number is: "+phonenumber, Toast.LENGTH_LONG).show();
            if(index==0){
                Send_SMS(phonenumber.toString().trim(), textmessage);
            }
            else{
                new Handler().postDelayed(new Runnable() {
                    public void run() {

                        Send_SMS(phonenumber.toString().trim(), textmessage);
                    }
                }, 1000*40);
            }
        }

public void Send_SMS(String phonenumber, String message){

    // here you use sms manager to send the sms
}

答案 2 :(得分:0)

在AndroidManifest文件中添加此权限

   <uses-permission android:name="android.permission.SEND_SMS"/>
   <uses-permission android:name="android.permission.RECEIVE_SMS"/>

答案 3 :(得分:0)

试试这个:

String [] cellArray = phNumbers.getText().toString().split(";");

mMessageSentCount = 0;

String cellno = cellArray[mMessageSentCount].toString().trim();         

startSendMessages(cellno);


private void startSendMessages(String ph){
    registerBroadCastReceivers();
    sendSMS(ph, mBody);
}
private void sendNextMessage(int mMessageSentCount){
    String ph = cellArray[mMessageSentCount].toString().trim();
    sendSMS(ph, mBody);     
}

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

private void sendSMS(final String phoneNumber, String message) {
    Toast.makeText(getBaseContext(), "Phone number is: "+phoneNumber, Toast.LENGTH_SHORT).show();
    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++;
                    if(thereAreSmsToSend()){
                        sendNextMessage(mMessageSentCount);                         
                    } else{
                        Toast.makeText(getBaseContext(), "All SMS have been sent",Toast.LENGTH_SHORT).show();
                    }
                }

                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));
}

答案 4 :(得分:0)

我遇到过类似的问题。几分钟后,我发现我尝试发送的电话号码无效。

因此,任何人都有这个问题,请先查看电话号码!

答案 5 :(得分:0)

我遇到了同样的问题,发现我的移动信用余额已超出我的余额。

答案 6 :(得分:0)

我发现一旦数据超过160个字符,我就会失败。

答案 7 :(得分:0)

我遇到了同样的问题,我通过从sendTextMessage删除SIM卡并将其制成null来解决了该问题