Отправка текстовых сообщений программно в 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 отправлять сообщения, мне нужно использовать собственное приложение.
Ответы
Ответ 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);
Спасибо