2016-07-21 164 views
0

我已经构建了短信短信应用,它既发送又接收短信。在MainActivity中,我有一个人名和电话号码的二维数组,并且在发送类中,我有一个for循环,它通过遍历每个数字向所有收件人发送相同的消息:短信应用多次收到短信

for (i=0; i<names.length; i++) { 
    phoneNo = names[i][2] + names[i][3]; 
    sendMessage(phoneNo, message); 
} 

private void sendMessage(String phoneNo, String message) { 
    try { 
     SmsManager smsManager = SmsManager.getDefault(); 
     smsManager.sendTextMessage(phoneNo, null, message, null, null); 
     Toast.makeText(getApplicationContext(), "SMS sent", Toast.LENGTH_LONG).show(); 
    } 
    catch (Exception e) { 
     Toast.makeText(getApplicationContext(), "SMS failed. Please try again!", Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } 
} 

当我通过应用程序发送消息时,从我自己的三星消息应用程序中可以看到相同的消息被发送到列表中的每个数字,这非常完美。

这是我的缩短接收器类:

public class Receiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 
     SmsMessage[] smgs = null; 
     String infoSender = ""; 
     String infoSMS = ""; 

     if (extras != null) { 
      // Retrieve the sms message received 
      Object[] pdus = (Object[]) extras.get("pdus"); 
      smgs = new SmsMessage[pdus.length]; 

      for (int i = 0; i < smgs.length; i++) { 
       smgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       infoSender += smgs[i].getOriginatingAddress(); 
       infoSMS += smgs[i].getMessageBody().toString(); 
      } 
     } 

我发现,尽管被发送的消息出来后给每个收件人,有些收件人(这个程序)收到超过一次连续多。因此,我怀疑我的接收器代码有问题,它看起来将一个接收到的消息视为几个连续收到的消息。这不是一个一致的问题,因为不同的人在不同的时间收到连续的消息。

但是,我还发现,如果我在发送类中将phoneNo硬编码为仅一个电话号码,或者MainActivity中的数组中只有一个电话号码,则不会发生此问题。该消息仍然只发送给该电话号码一次,但接收方将始终按照预期接收该消息。

我现在很困惑,所以有人请给我一些建议,我可以试试吗?从字面上看,在最后一分钟,我认为这可能是一个与createFromPdu被弃用的问题?如果是这样,请告知如何更改我的接收器代码,因为我无法找到任何类似于我当前代码的东西。

提前:-)

+0

你是如何确定正在接收的消息多次?你是否收到多个通知?消息是否在短信应用中多次出现?另外,多少倍?只是两次?两次以上?你是否将自己的信息保存在代码中的某个地方?也就是说,你是否在任何地方使用ContentResolver?是否有某些版本的Android,这只发生在?例如,它发生在KitKat之前的版本中,但不是更新的版本? –

+0

该消息在收件人的SMS收件箱中实际上收到两次,尽管它只发送一次。是的 - 它也出现在我的短信应用程序两次。到目前为止,它通常出现两次,但它也出现过四次。我正在使用应用程序将我的消息保存在txt文件中,但我没有在任何地方使用ContentResolver。我使用冰淇淋三明治实施这个应用程序,但它似乎与所有手机发生。 –

+0

我得到的印象是,我的应用程序中的Receiver类的行为太快,因此当一条SMS消息进入时,它会感知两个或更多个连续的消息,并因此记录两次。如果有帮助,有什么办法可以延迟阅读这条信息吗? –

回答

0

非常感谢做这样的你在做下面的代码错误检查。

 if (bundle != null) { 
      // get sms objects 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      if (pdus.length == 0) { 
       return; 
      } 
      // large message might be broken into many 
      SmsMessage[] messages = new SmsMessage[pdus.length]; 
      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < pdus.length; i++) { 
       messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       sb.append(messages[i].getMessageBody()); 
      } 
      senderNum = messages[0].getOriginatingAddress(); 
      message = sb.toString(); 
     } 

更新:要检查默认应用

public class Receiver extends BroadcastReceiver { 
     public void onReceive(Context context, Intent intent) { 

      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
       final String myPackageName = context.getPackageName(); 
       if (Telephony.Sms.getDefaultSmsPackage(context).equals(
         myPackageName)) { 
        // you are default 

        Bundle extras = intent.getExtras(); 
        SmsMessage[] smgs = null; 
        String infoSender = ""; 
        String infoSMS = ""; 

        if (extras != null) { 
         // Retrieve the sms message received 
         Object[] pdus = (Object[]) extras.get("pdus"); 
         smgs = new SmsMessage[pdus.length]; 

         for (int i = 0; i < smgs.length; i++) { 
          smgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
          infoSender += smgs[i].getOriginatingAddress(); 
          infoSMS += smgs[i].getMessageBody().toString(); 
         } 
        } 
       } else { 
        // you are not ignore 
       } 
      } else { 
       // for below KitKat do like normal 
       Bundle extras = intent.getExtras(); 
       SmsMessage[] smgs = null; 
       String infoSender = ""; 
       String infoSMS = ""; 

       if (extras != null) { 
        // Retrieve the sms message received 
        Object[] pdus = (Object[]) extras.get("pdus"); 
        smgs = new SmsMessage[pdus.length]; 

        for (int i = 0; i < smgs.length; i++) { 
         smgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
         infoSender += smgs[i].getOriginatingAddress(); 
         infoSMS += smgs[i].getMessageBody().toString(); 
        } 
       } 

      } 
     } 
    } 
+0

感谢您的代码,但我担心它仍然没有解决problemm问题,并且仍然收到多条消息。我注意到的一件事是,只有安装了此应用程序的手机才能收到多条消息。另一件事是,这似乎发生在手机接收有点差。因此,消息1到达的延迟将在接收再次良好时使其到达两次。不过,我不确定这是否一致。我的Android Studio确实表示createFromPdu已被弃用 - 您是否能够建议如何解决这个问题? –

+0

我会在哪里更新代码? –

+0

kitkat只有默认的消息应用程序可以使用db ....操作后,如果你的应用程序是默认使用上面的代码片段,如果你不是默认的,那么不要通知,否则忽略。更好地展示您的完整接收器? –