【问题标题】:Why do I get "Generic Failure" error while sending SMS?为什么我在发送 SMS 时收到“一般故障”错误?
【发布时间】:2019-07-04 15:33:52
【问题描述】:

我正在开发需要发送 SMS 的 android 项目。我的应用通过使用网络服务来收集所需的信息,这些信息是非常短且纯文本的。然后这些信息以 SMS 的形式发送。

我使用了广播接收器,它将跟踪 SMS 是否发送成功,并简单地添加一个日志条目。我使用 SmsManager发送短信

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

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

我google了一下,发现有人说要关闭WiFi。但是为了使用网络服务,我需要开启 WiFi。

任何人都可以对此提供一些见解吗?这个问题有解决办法吗?

【问题讨论】:

    标签: android sms broadcastreceiver


    【解决方案1】:

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

    接下来,如果您确实延迟,您必须确保它不在 UI 线程中完成,否则您将获得 ANR。

    尝试使用处理程序,我的朋友建议这样做,我试过了,效果很好。

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

    希望这些信息有用。

    【讨论】:

    • 感谢您的回复。真的,我一起发了很多短信。所以我改变了这个 n 现在一次发送一条短信,将 Generic Failure 错误的数量减少到最少,几乎为零。再次感谢。
    【解决方案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
    }
    

    【讨论】:

    • 是的,苏尼尔,我也是这样做的。我在两个连续的消息发送方法调用之间使用了一些延迟,然后它工作正常。
    • 好的,谢谢@kavitaDev 可以延迟 40 秒还是需要更多时间?
    • 我指定了 20 秒的延迟,它对我来说效果很好。
    【解决方案3】:

    试试这个:

    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】:

      在您的 AndroidManifest 文件中添加此权限

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

      【讨论】:

      • 我已经添加了所需的权限。必须有其他原因导致一般故障。感谢您的及时回复。
      • 不添加会导致SecurityException not Generic_Failure
      【解决方案5】:

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

      所以大家有这个问题,请先查电话号码!

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,发现我的手机余额已用完。

        【讨论】:

          【解决方案7】:

          我发现一旦数据超过 160 个字符,我就会遇到一般故障。

          【讨论】:

            【解决方案8】:

            我遇到了同样的问题,我通过从sendTextMessage 移除 SIM 手机并使其成为null 解决了它

            【讨论】:

              猜你喜欢
              • 2015-02-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多