2012-03-19 291 views
3

我正在开发Android项目,我需要发送SMS。我的应用程序收集所需的信息消费Web服务和这个信息是非常短,纯文本。然后以SMS的形式发送此信息。为什么发送短信时会出现“Generic Failure”错误?

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

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

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

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

任何人都可以提供一些见解吗?有没有解决这个问题的方法?

回答

0

在AndroidManifest如果要发送大量短信在一起,它会淹没自己的手机,最好是有一定的延迟添加此权限文件

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

我已经添加了必需的权限。必须有其他的东西导致泛型失败。感谢你的及时回复。 – KavitaDev 2012-03-20 06:01:31

+1

不加入这将导致SecurityException不是Generic_Failure – 2014-03-16 18:30:44

3

接下来,如果你有延迟,你必须看到,它不是在UI线程中完成,否则你会得到ANR。

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

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

希望这些信息很有用。

+0

感谢您的回应。它的确如此,我一起发送了很多短信。所以我改变了这个n,现在每次发送一条短信,这会将** Generic Failure **错误的数量降至最低,几乎为零。再次感谢。 – KavitaDev 2012-11-01 06:17:01

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 
} 
+0

是的,苏尼尔,我也是这样做的。我用了两个连续的消息发送方法调用之间的一些延迟,然后它工作正常。 – KavitaDev 2013-12-16 07:09:19

+0

okk谢谢@kavitaDev可以延迟40秒或需要更多吗? – 2013-12-16 07:18:25

+0

我已经指定了20秒的延迟,对我来说工作得很好。 – KavitaDev 2013-12-17 08:12:11

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

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

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

0

我遇到了同样的问题,发现我的手机已经超出了我的余额。

0

我发现一旦数据超过160个字符,我得到了一个通用的失败。