2017-08-22 15 views
5

Tôi đang phát triển một ứng dụng mà tôi cần gửi hơn 100 tin nhắn. Sau khi đi qua vài chủ đề tôi đã biết có giới hạn về việc gửi tin nhắn như 100 tin nhắn có thể được gửi trong một giờ. Để làm như vậy tôi chia danh sách người nhận của tôi thành các đoạn và trì hoãn thời gian 5 giây giữa mỗi đoạn và chậm trễ 3 giây trong mỗi thư. Sự chậm trễ giữa các phần tăng sau mỗi đoạn và khi nó được đến 100 giây nó sẽ thiết lập lại đến 5 giây. Sau đó nó làm việc OK cho 50 tin nhắn nhưng khi tôi nâng cao danh sách người nhận nó gây ra vấn đề một số tin nhắn đã không đi ở vị trí đầu tiên và hiển thị như là thông báo lỗi trong bản địa.Gửi hơn 50 tin nhắn gây ra sự cố dẫn đến lỗi chung

Có cách nào tiêu chuẩn để đạt được điều này tôi có thể cần phải gửi hơn 100 tin nhắn, làm cách nào tôi có thể gửi nhiều tin nhắn mà không gặp bất kỳ lỗi nào cùng một lúc. Nếu tôi cần phải đặt chậm trễ những gì nên là sự chậm trễ thích hợp giữa các khối hoặc tin nhắn.

Xin cảm ơn trước.

private final int MAX_SMS_IN_ONE_TIME = 10; 
private final int DELAY_BETWEEN_CHUNKS = 5000; 

public void sendMessage(arguments){ 
    // Send long messages in chunk of 20 messages and put gap of increasing 5 seconds till 50 seconds and then reset. 

    final Iterator iterator = messageChunks.iterator(); 
    new Thread(new Runnable() { 
     @Override 
     public void run(){ 

     int interval =1; 
     while (iterator.hasNext()) { 

      for (final Contact contact : 
       (List<Contact>) iterator.next()) { 

       sendSMS(body, contact.getmMobileNumbers().get(0)); 

       App.trackEvent("Message", "Sent", "Messages from our sms app"); 
      } 
     } 
     try { 
      Log.i("chunk", "chunk # " + interval + " delay is " + DELAY_BETWEEN_CHUNKS); 
      Thread.sleep(DELAY_BETWEEN_CHUNKS * interval); 
      interval++; 
      if (interval == 10) { 
       interval = 1; 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     } 
     } 
    }).start(); 
} 

public void sendSMS(final String message, final String phoneNo) { 
    try { 
     String SENT = "com.ebryx.smscustommessagegeneration"+""+System.currentTimeMillis()+""+((int)this.getmMessageId()); 
     Intent intentMessageASendStatus = new Intent(SENT); 

     final PendingIntent pi = PendingIntent.getBroadcast(App.getContext(), ((int)this.getmMessageId()), 
       intentMessageASendStatus, PendingIntent.FLAG_CANCEL_CURRENT); 
     final ArrayList<PendingIntent> sentPI = new ArrayList<PendingIntent>(){{add(pi);}}; 

     App.getContext().registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 


       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 

         Log.i("tag","sent successfully "); 
      break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 

         Log.i("tag","Generic Failure"); 
       break; 

        case SmsManager.RESULT_ERROR_NO_SERVICE: 

         Log.i("tag","No service failure"); 
      break; 

     case SmsManager.RESULT_ERROR_NULL_PDU: 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 

         Log.i("tag","Airplane mode failure"); 
         break; 
       } 
      } 
     }, new IntentFilter(SENT)); 

     final SmsManager smsManager = SmsManager.getDefault(); 
     final ArrayList<String> parts = smsManager.divideMessage(message); 

     new Timer().schedule(new TimerTask() { 
       @Override 
       public void run() { 
        smsManager.sendMultipartTextMessage(phoneNo, null, parts, sentPI, null); 

       }}, 3000); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

gì được thông báo lỗi bạn đang nhìn thấy? –

+0

@ScottNewson, tôi không thấy bất kỳ thông báo lỗi nào nhưng một vài thư không đi do lỗi chung. –

+0

Tại sao bạn tăng thời gian gửi tin nhắn? –

Trả lời

4

Bạn nên sử dụng hai bộ thu phát với mục đích đang chờ xử lý cho SENT và DELIVER.

Sau khi tin nhắn được gửi, bạn phải thêm cơ chế gọi lại để thông báo cho msg đã được gửi và stat gửi tin nhắn mới. Cuộc gọi này phải là đồng bộ.

  1. Tạo một HashMap và gửi từng phương thức bên dưới theo trạng thái phân phối mà chúng tôi nhận được trong bộ thu phát sóng dưới đây.

    /** 
        * Sends an SMS message to another device 
        * 
        * @param phoneNumber Number to which msg send 
        * @param message Text message 
        */ 
    private void sendSMS(String phoneNumber, String message) { 
        // Intent Filter Tags for SMS SEND and DELIVER 
        String SENT = "SMS_SENT"; 
        String DELIVERED = "SMS_DELIVERED"; 
    // STEP-1___ 
        // SEND PendingIntent 
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
          SENT), 0); 
    
        // DELIVER PendingIntent 
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
          new Intent(DELIVERED), 0); 
    // STEP-2___ 
        // SEND BroadcastReceiver 
        BroadcastReceiver sendSMS = 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; 
          } 
         } 
        }; 
    
        // DELIVERY BroadcastReceiver 
        BroadcastReceiver deliverSMS = new BroadcastReceiver() { 
         @Override 
         public void onReceive(Context arg0, Intent arg1) { 
          switch (getResultCode()) { 
          case Activity.RESULT_OK: 
           // TODO : notify from here to send new message. 
           // Add callback mechanism 
           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; 
          } 
         } 
        }; 
    // STEP-3___ 
        // ---Notify when the SMS has been sent--- 
        registerReceiver(sendSMS, new IntentFilter(SENT)); 
    
        // ---Notify when the SMS has been delivered--- 
        registerReceiver(deliverSMS, new IntentFilter(DELIVERED)); 
    
        SmsManager sms = SmsManager.getDefault(); 
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
    } 
    } 
    
  2. Bạn cũng có thể loại bỏ các yếu tố từ HashMap của bạn như SMS GIAO Điều này có thể hữu ích cho bạn để theo dõi có bao nhiêu tin nhắn được gửi thành công.
+0

Cảm ơn câu trả lời của bạn @jitesh đánh giá cao nó. Nhưng tôi đọc trên một câu trả lời rằng "At & T điện thoại di động không hỗ trợ báo cáo gửi tin nhắn". Tôi đã thử nghiệm trên Lg g3 và Samsung S5 trên cả hai điện thoại phát sóng thu phát sóng không được gọi. Vì vậy, đặt logic kinh doanh vào nó là điều nguy hiểm để làm. –

+0

trong khi điều tra nó tôi đi qua có giới hạn được xác định trước để gửi tin nhắn trong thời gian, như 100 msgs mỗi giờ và 30 msgs mỗi nửa giờ. Để tránh điều này, bạn cần phải nhổ tận gốc điện thoại và thay đổi giới hạn đó. Sau khi đọc nó tôi xem xét các tin nhắn gửi không thành công có thể là lý do của nó là giới hạn chính xác của tôi nếu tôi sai. hãy chia sẻ suy nghĩ của bạn về nó. liên kết là folllowing: https://stackoverflow.com/questions/19079151/is-there-a-limit-to-the-number-of-numbers-to-send-an-sms –

0

Dường như không có tài liệu chính thức về giới hạn gửi SMS, từ những gì tôi có thể tìm thấy và trang web sau.

Unfortunately dường như không có tài liệu công khai từ Nhóm phát triển Android của Google về vấn đề này.

Đây là từ 17 Tháng năm 2017

Những con số chỉ về giới hạn sms tôi đã có thể tìm được từ trang web Commonsware 's:

SMS Sending Limitations
Các ứng dụng chạy trên thiết bị Android 1.x và 2.x bị giới hạn gửi 100 tin nhắn SMS một giờ, trước khi người dùng bắt đầu được nhắc với mỗi SMS cho tôi yêu cầu ssage để xác nhận rằng họ thực sự muốn gửi nó.

Apps chạy trên các thiết bị Android 4.x, các giới hạn hiện nay có 30 SMS tin nhắn trong 30 phút .../...

Có vẻ như không có cách nào xung quanh tăng rằng giới hạn without rooting điện thoại . Nơi bạn cần thay đổi các cài đặt sau.Sau đây sẽ cho phép gửi 1000 SMS mỗi 180000ms == 30 phút.

SMS_OUTGOING_CHECK_MAX_COUNT 1000 
SMS_OUTGOING_CHECK_INTERVAL_MS 1800000 

Các sự cố Android thông thường (bực bội) với hiệu suất khác nhau trên các thiết bị cũng được áp dụng. Một điện thoại có thể hoạt động ở một mức độ khác nhau.

Công ty này đã xác định dung lượng SMS tối đa cho một số điện thoại di động với sản phẩm của họ. SMS sending limits with FrontlineSync and Android. Họ cũng khuyên rằng rễ điện thoại có thể cần thiết để tăng giới hạn.

nguồn lực liên quan:

Check android package SMS limit?

is there a limit to the number of numbers to send an SMS?

Android Java: How To Send SMS & Receive SMS & Get SMS Messages ngày 30 Tháng Tám, 2017.

Các vấn đề liên quan