Статьи

Как работать с СМС в Android разработке

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

Как запустить приложение SMS из вашей программы.

Сейчас мы собираемся создать небольшое приложение, которое скажет «привет» нашим друзьям, отправив SMS-сообщение. Это приложение будет принимать номер друга у пользователя, затем приложение запустит приложение SMS на мобильные телефоны с введенным пользователем номером и, наконец, отправит сообщение «привет».

Шаг 1: Создание пользовательского интерфейса и макета

Сначала создайте простое действие под названием LaunchSMS, затем мы создадим макет следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="2dip" android:paddingRight="4dip" android:text="Recipient Number" /> <EditText android:id="@+id/messageNumber" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cursorVisible="true" android:editable="true" android:singleLine="true" /> <Button android:id="@+id/sayhello" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Say Hello!" android:onClick="sayHello" /> </LinearLayout> 

Выше мы создали линейный макет с одним TextView, чтобы сообщить пользователю, что он должен ввести номер получателя. Затем у нас есть один EditText для получения числа от пользователя и одна кнопка, которая при нажатии вызывает метод sayHello.

Код для деятельности выглядит следующим образом:

 package launchSMS.com; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class LaunchSMS extends Activity { /** Called when the activity is first created. */ private EditText messageNumber; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); messageNumber=(EditText)findViewById(R.id.messageNumber); } public void sayHello(View v) { String _messageNumber=messageNumber.getText().toString(); String messageText = "Hi , Just SMSed to say hello"; Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:"+_messageNumber)); sendIntent.putExtra("sms_body", messageText); startActivity(sendIntent); } } 

Шаг 2: Инициализация действия

Используя метод onCreate, мы установим основной макет, который мы создали, как представление контента. Затем я создал личный член для хранения EditBox для номера сообщения.

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); messageNumber=(EditText)findViewById(R.id.messageNumber); } 

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

Шаг 3: Запуск приложения SMS

 public void sayHello(View v) { String _messageNumber=messageNumber.getText().toString(); String messageText = "Hi , Just SMSed to say hello"; Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:"+_messageNumber)); sendIntent.putExtra("sms_body", messageText); startActivity(sendIntent); } 

В функции sayHello мы сначала получаем номер, который пользователь ввел в EditText. Затем мы создаем переменную String для хранения текста сообщения, которое мы хотим отправить.

Теперь, чтобы запустить приложение SMS, нам нужно создать следующее:

 Intent sendIntent = new Intent(Intent.ACTION_VIEW); 

Затем мы устанавливаем данные о намерениях с помощью числа, введенного пользователем, следующим образом:

 sendIntent.setData(Uri.parse("sms:"+_messageNumber)); 

Наконец, текст сообщения передается как дополнительные данные в намерении с использованием метода putExtra в намерении.

 sendIntent.putExtra("sms_body", messageText); 

Затем намерение отправляется путем передачи созданного намерения в startActivity. Это запустит приложение SMS пользователя с уже заполненным номером и текстом сообщения. Пользователь может вносить изменения, если он или она хочет, и тогда ему просто нужно нажать «отправить», чтобы отправить сообщение своему другу.

Таким образом, используя намерения, мы можем запустить приложение SMS из нашей программы.

Как отправить SMS напрямую через API, предоставляемый Android

Теперь мы собираемся создать приложение, в котором DirectSendSMS будет расширенной версией предыдущего приложения. Это приложение будет напрямую отправлять пользователю сообщение «привет» с помощью Android SMS API.

Шаг 1: Создание пользовательского интерфейса и макета

Сначала нам нужно создать новый вид деятельности DirectSendSMS. Пользовательский интерфейс этого приложения будет таким же, как описанный выше, поэтому для этого мы также создадим линейный макет и добавим один Textiew, один EditText и одну кнопку.

Макет выглядит следующим образом:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="2dip" android:paddingRight="4dip" android:text="Recipient Number" /> <EditText android:id="@+id/messageNumber" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cursorVisible="true" android:editable="true" android:singleLine="true" /> <Button android:id="@+id/sayhello" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Say Hello!" android:onClick="sayHello" /> </LinearLayout> 

Шаг 2: Инициализация действия

Инициализация действия также такая же, как описано в предыдущем приложении. В функции onCreate мы устанавливаем основной макет в качестве представления содержимого и принимаем EditBox в приватную переменную.

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); messageNumber=(EditText)findViewById(R.id.messageNumber); } 

Шаг 3. Указание разрешения на отправку SMS

В Android необходимо указать все разрешения, необходимые приложению, в AndroidManifest.xml. Таким образом, при установке приложения все разрешения, требуемые приложением, будут показаны пользователю.

Чтобы в нашем приложении можно было отправлять сообщения, нам нужно добавить разрешение android.permission.SEND_SMS в AndroidManifest.xml следующим образом:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="directSendSMS.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".DirectSendSMS" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.SEND_SMS"> </uses-permission> </manifest> ? <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="directSendSMS.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".DirectSendSMS" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.SEND_SMS"> </uses-permission> </manifest> 

Шаг 4: Отправка SMS

 public void sayHello(View v) { String _messageNumber=messageNumber.getText().toString(); String messageText = "Hi , Just SMSed to say hello"; SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(_messageNumber, null, messageText, null, null); } 

В функции sayHello мы получаем число, введенное пользователем. В переменной мы храним текст сообщения, которое мы хотим отправить. Затем мы получаем объект SmsManager следующим образом:

 SmsManager sms = SmsManager.getDefault(); 

Затем, используя метод SmsManager sendTextMessage, мы отправляем сообщение.

Шаг 5: Отображение тоста, когда сообщение успешно отправлено

 public void sayHello(View v) { String _messageNumber=messageNumber.getText().toString(); String messageText = "Hi , Just SMSed to say hello"; String sent = "SMS_SENT"; PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(sent), 0); //---when the SMS has been sent--- registerReceiver(new BroadcastReceiver(){ @Override public void onReceive(Context arg0, Intent arg1) { if(getResultCode() == Activity.RESULT_OK) { Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getBaseContext(), "SMS could not sent", Toast.LENGTH_SHORT).show(); } } }, new IntentFilter(sent)); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(_messageNumber, null, messageText, sentPI, null); } 

Теперь мы улучшили метод sayHello для отображения тоста после успешной отправки сообщения. Мы создаем для этого новый PendingIntent и передаем его в качестве аргумента методу sendTextMessage. Мы также регистрируем получателя для этого намерения, который проверяет код результата и отображает тост с сообщением отправлено.

Теперь приложение будет выглядеть следующим образом:

Как заставить ваше приложение отвечать на SMS-сообщения

Теперь мы собираемся создать приложение, которое будет отвечать при получении SMS. Это приложение будет отображать только входящее сообщение на тосте.

Шаг 1. Создайте новое приложение

Для этого приложения мы собираемся создать BroadcastReciever для перехвата входящего SMS-сообщения. Хотя мы не создаем для этого действие, обычно такие приложения могут создавать действие для страницы настроек таких приложений.

Ниже приводится AndroidManifest.xml для этого приложения:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="recieveSMS.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> </application> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest> ? <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="recieveSMS.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> </application> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest> 

Здесь мы добавляем разрешение android.permission.RECEIVE_SMS в наше приложение, чтобы мы могли отвечать на полученные SMS.

Шаг 2: Создание получателя SMS

Код для получателя SMS следующий:

 package recieveSMS.com; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.widget.Toast; public class RecieveSMS extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsMessage[] recievedMsgs = null; String str = ""; if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); recievedMsgs = new SmsMessage[pdus.length]; for (int i=0; i recievedMsgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); str += "SMS from " + recievedMsgs[i].getOriginatingAddress()+ " :" + recievedMsgs[i].getMessageBody().toString(); } Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } } } 

Мы должны создать класс, который расширяет BroadcastReceiver, и мы должны переопределить метод onRecieve.

В методе onRecieve мы удаляем данные из полученного намерения, удаляем объект SmsMessage и получаем адрес и текст отправителя для отображения на тосте.

Шаг 3: Запуск приложения

Чтобы проверить это, вам понадобятся два экземпляра эмулятора Android. Мы отправим SMS с помощью приложения SMS из одного экземпляра в другой. Вы сможете увидеть номер экземпляра вверху. Как видно ниже, у меня есть номера 5554 и 5556.

Итак, со второго экземпляра я отправлю SMS на первый экземпляр, как показано ниже:

Как только первый экземпляр получит SMS, информация будет отображаться в виде тоста, как показано ниже:

Вывод

SMS стали настолько неотъемлемой и важной частью наших мобильных телефонов сегодня, что может быть множество различных способов интеграции SMS в ваше следующее приложение Android. Удобство использования, а также возможности ваших приложений для Android могут быть значительно увеличены, если SMS должным образом интегрирован.

Как видно выше, Android как платформа обеспечивает очень хорошую поддержку для интеграции SMS в ваши приложения. Итак, отправляйтесь туда и включите SMS в свое следующее потрясающее приложение для Android!