2014-07-17 39 views
1

我正在开发一个基于websocket的应用程序,允许我用我的电脑发送短信与我的Android手机。 服务器和客户端之间的通信基于包含必须从两个部分解释的命令的简单字符串的交换。 当我发送单个部分的短信时,客户端可以很好地管理它们,但是当我发送多部分短信时,它经常冻结,关闭与服务器的连接。发送多部分短信给许多收件人w/Android

我需要能够发送大量的短信(每天约3000条)。 下面是例程的代码片段,它允许我发送它们。

   SmsManager sms = SmsManager.getDefault(); 
       ArrayList<String> parts = sms.divideMessage(messaggio); 
       ArrayList<PendingIntent> sentPI = new ArrayList<PendingIntent>(); 
       final int parts_size = parts.size(); 

       registerReceiver(new BroadcastReceiver(){ 
        int msgparts = parts_size; 
        @Override 
        public void onReceive(Context arg0, Intent arg1) { 
         switch (getResultCode()) 
         { 
          case Activity.RESULT_OK: 
           msgparts--; 
           sent_check_debug = 1; 
           break; 
          case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
           msgparts--; 
           sent_check_debug = 2; 
           break; 
          case SmsManager.RESULT_ERROR_NO_SERVICE: 
           msgparts--; 
           sent_check_debug = 3; 
           break; 
          case SmsManager.RESULT_ERROR_NULL_PDU: 
           msgparts--; 
           sent_check_debug = 4; 
           break; 
          case SmsManager.RESULT_ERROR_RADIO_OFF: 
           msgparts--; 
           sent_check_debug = 5; 
           break; 
         } 
         if(msgparts == 0) 
         { 
          sent_check = 1; 
          if(this != null) 
          unregisterReceiver(this); 
         } 
        } 
       }, new IntentFilter(SENT)); 

       for(int i = 0; i < parts.size(); i++) 
        sentPI.add(PendingIntent.getBroadcast(Client.this, 0, new Intent(SENT), 0)); 

       sms.sendMultipartTextMessage(numero, null, parts, sentPI, null); 
       while(sent_check != 1); 

哪里错误? 为什么在发送消息的随机数之后它会冻结?

在此先感谢!

回答

0

你跟BroadcastReceiver乙发送相同的sentPI所有短信,所以如果你的代码发送Sms A和BroadcastReceiver A,然后Sms B,接收方B也会再上一个零件得到通知发送。

更改您发送的意图以及接收它们的IntentFilter根据您发送的Sms而变得唯一。

不确定它会导致冻结,但它可能会导致冻结。

另请注意,Android有一个内置的文本消息速率限制器,它随设备而变化,但用户可能会看到一个警告对话框,说明"This app seems to be sending too many text messages"或类似的东西。

编辑:示例代码:

String msgHash = messaggio.hashCode(); 
... 
registerReceiver(..., new IntentFilter(SENT + "/" + msgHash)); 

for(int i = 0; i < parts.size(); i++) 
    sentPI.add(PendingIntent.getBroadcast(Client.this, 0, new Intent(SENT + "/" + msgHash), 0)); 

现在的意图只会触发其特定的广播接收器,你可以删除while循环等待。 阻止线程并等待回调返回(或BroadcastReceiver)并不是一个好设计。

+0

感谢您的回答。我使用var sent_check来确保多部分SMS的每个部分都被发送,并且广播接收器已经捕获了所有部分。所以这是一种等待代码的方式。 您对改变意图有什么意义,但是每条短信留下IntentFilter是唯一的? –

+0

看到我上面的编辑 – marmor

+0

谢谢!我会尽力让你知道:-) –

相关问题