Подтвердить что ты не робот

Отправка текстовых сообщений программно в android

OK. Я отправляю текстовые сообщения через свое приложение. После отправки текстового сообщения он отправляет обновление статуса на сервер. Эта часть работает нормально, но проблема, с которой я сталкиваюсь, двояка. Я не уверен, связаны ли они, но я предполагаю, что они есть.

Мое приложение имеет возможность отправлять один текст нескольким пользователям. Вот пример кода...

if(phoneNumbers.length > 0 && message.getText().toString().equals("") == false)
{
    for(int i=0;i<phoneNumbers.length;i++)
    {
        sms = SmsManager.getDefault();
        try
        {
            sms.sendTextMessage(phoneNumbers[i], null, message.getText().toString(), null, null);
            sentQuantity++;
        }
        catch(IllegalArgumentException e)
        {

        }
    }
}

В принципе, он просто просматривает массив телефонных номеров и отправляет текст по одному. Вот где часть моей проблемы. Если я выберу 3 или более номеров для отправки текста, иногда не все тексты действительно отправляются. Это происходит очень случайным образом.

Я предполагаю, что это связано с тем, что между отправкой каждого отдельного сообщения существует задержка, но код не ждет достаточно долго. Я пришел к этому предположению, потому что, если я вхожу в программу с использованием eclipse и вручную просматриваю приложение, все всегда работает нормально.

Другая проблема заключается в отправке обновления состояния текстового сообщения на веб-сервер.

Сразу же после отправки текстовых сообщений приложение затем подключается к Интернету и сообщает серверу через http сообщение о количестве отправленных текстов. Вот мой фрагмент интернет-кода...

for(int i = 0; i < postNames.length; i++)
{
    nameValuePairs.add(new BasicNameValuePair(postNames[i], postValues[i]));
    }

    //http post
    try{

            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 10000;

            HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection );

            HttpClient httpclient = new DefaultHttpClient(httpParameters);              
            HttpPost httppost = new HttpPost(webAddress);
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

Этот раздел только компилирует элементы для сообщения, подключается к веб-странице и отправляет сообщение. Ключ здесь - это 10-минутный тайм-аут соединения. Еще раз, как я уже говорил, подключение к Интернету происходит сразу же после отправки текстов. Итак, если я перехожу в режим отладки и вручную выполняю этот процесс, все работает нормально. Но если я просто запустил приложение на своем телефоне, я получу ошибку тайм-аута соединения.

Теперь я надеюсь, что, если я смогу уменьшить количество текстовых сообщений на один текст, независимо от количества получателей, это будет потрясающе. Я попытался разделить номера телефонов запятой, и это не сработало. Я также попытался выделить числа с помощью двоеточия (точно так же, как Microsoft Outlook или GMail позволяет добавлять нескольких получателей к электронной почте). Никто из них не работал у меня. У кого-нибудь есть предложения? Даже если есть совсем другой подход, это было бы оценено. О, и я не хочу использовать намерение Google Messaging отправлять сообщения, мне нужно использовать собственное приложение.

4b9b3361

Ответ 1

Вам действительно нужно отправить следующие sms после отправки предыдущего сообщения, для этого вам нужно проверить статус отправленного sms, пожалуйста см. этот учебник, в нем говорится:

Если вам нужно отслеживать состояние процесса отправки SMS-сообщений, вы можете фактически использовать два объекта PendingIntent вместе с двумя объектами BroadcastReceiver, например:

 //---sends an SMS message to another device---
    private void sendSMS(String phoneNumber, String message)
    {        
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);

        //---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 sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);        
    }

Ответ 2

Я думаю, это то, что вам нужно. В приведенном ниже фрагменте предлагается ввести длинное сообщение и разделить его на части и отправить каждому из них индивидуально для данного контакта или даже для группы контактов

public void sendLongSMS() {

    String phoneNumber = "0123456789";
    String message = "Hello World! Now we are going to demonstrate " + 
        "how to send a message with more than 160 characters from your Android application.";

    SmsManager smsManager = SmsManager.getDefault();
    ArrayList<String> parts = smsManager.divideMessage(message); 
    smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null);
}

Ответ 3

Сначала вы должны добавить разрешение в файл AndroidManifest.xml

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

тогда напишите этот код

try {

                String ph="1234568790";
                String msg="Haiii friend";

                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(ph, null,msg, null, null);
                Toast.makeText(MainActivity.this, "Message Sent",
                        Toast.LENGTH_LONG).show();
            }
            catch (Exception e)
            {
                Toast.makeText(MainActivity.this, "Message not Sent",
                        Toast.LENGTH_LONG).show();
            }

Ответ 4

Вы можете попробовать это

SmsManager.getDefault().sendTextMessage(phoneNUmber, null, messageToSend, null, null);

Спасибо