Отправка текстовых сообщений программно в Android - PullRequest
40 голосов
/ 20 декабря 2011

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 для отправки сообщений, мне нужно использовать собственное приложение.

Ответы [ 4 ]

71 голосов
/ 20 декабря 2011

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

Если вам необходимо отслеживать состояние процесса отправки 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);        
    }
18 голосов
/ 17 февраля 2013

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

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);
}
1 голос
/ 28 декабря 2015

Сначала необходимо добавить разрешение в файл 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();
            }
0 голосов
/ 14 ноября 2014

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

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

Спасибо

...