2014-10-06 79 views
1

我知道有一些明显的错误,但我试过很多东西并不能得到这种方法来读取全局字符串:sendSMS()方法无法读取字符串

public void sendSMS(String phoneNumber) { 
    SmsManager smsManager = SmsManager.getDefault(); 

    String message = mMessage; 
    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); 
    Log.i("Order", message); 
    Toast.makeText(getBaseContext(), message, 
      Toast.LENGTH_SHORT).show(); 

    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)); 
    smsManager.sendTextMessage(phoneNumber, null, message, sentPI, 
      deliveredPI); 
    /* 
    * sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, 
    * deliveryIntents); 
    */ 
} 

这种方法在保存ViewPager片段的MainActivity。字符串被收集,然后连接起来的片段用下面的方法:

public void getListToString(){ 
    StringBuilder sb = new StringBuilder(); 
    for(ReviewItem item : mCurrentReviewItems){ 
     sb.append(item.getTitle() + ": " + item.getDisplayValue() + "\n"); 
    } 

    String msg = sb.toString(); 
    ((MainActivity)getActivity()).setMessage(msg);    
} 

可以肯定 - 我做了记录与mMessage和祝酒词。每个项目都显示,但sendSMS()不想发送它。虽然,当在String消息而不是mMessage时,我把“一些字符串在这里”,它完美的作品。任何人都可以捕捉到让sendTextMessage无法访问的公共String mMessage?

+1

我注意到你已经注释掉了'sendMultipartTextMessage()'方法。你确定你没有达到'sendTextMessage()'的最大字符数限制吗? – 2014-10-07 00:05:14

+0

它没有它的其他应用程序工作,所以可能并非如此。无论如何,我使用的是Moto G,因此很难达到极限;) – 2014-10-07 11:23:51

+1

我不认为你明白字符限制的含义。 SMS协议为单个消息定义了160个字符的限制(对于纯ASCII)。这个数字可能会更低,这取决于使用的字母表。如果总消息比这更长,则需要将其拆分并使用多部分方法发送。这与设备型号没有任何关系。我建议你使用多部分方法进行测试,因为如果消息太长,'sendTextMessage()'就会失败。 – 2014-10-07 11:43:19

回答

1

看来您的问题在于您的字符串超过了单个SMS消息的最大字符长度,需要拆分并使用sendMultipartTextMessage()发送。

这个最大长度将取决于所使用字母表的字符比特大小:对于标准GSM 7位字母表,它是160个字符;对于8位字母表,它是140个字符;和16位字母表(其中包括任何非拉丁Unicode字符),它只有70个。

如果您尝试发送的邮件超出长度限制,sendTextMessage()将自动失败,并且没有错误或抛出异常,并且没有表示写入提供者的尝试(如果适用)。