Как послать SMS на определенный номер?

285
18 ноября 2017, 10:08

Приложение должно иметь возможность послать SMS на определенный номер.

Как может выглядеть реализация такой возможности?

Answer 1

Используя Api смс агрегатора. Get или Post запросом на их сервер:

http://смс.агрегатор/messages/v2/send/?phone=%2B71234567890&text=test

Для отправки Http запроса можно использовать HttpUrlConnector из пакетов java, либо HttpClient от Apache, либо любой другой удобной вам реализацией.

Конкретные условия Rest Api смотрите у агрегатора (гугл найдет вам всех, рекламировать не хочу)

Пример с Url java:

URL myUrl = new URL("http://смс.агрегатор/messages/v2/send/?phone=%2B71234567890&text=test");
HttpURLConnection myUrlCon = (HttpURLConnection) myUrl.openConnection();

дальше получаете поток для чтения ответа и читаете:

  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
  String line;
  while ((line = bufferedReader.readLine()) != null){
    content.append(line + "\n");
  }

И что-то делаете с ответом.

HttpClient от Apache :

String url = "http://смс.агрегатор/messages/v2/send/?phone=%2B71234567890&text=test";
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
BufferedReader rd = new BufferedReader(
    new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
    result.append(line);
}
Answer 2

Грубо говоря есть 2 способа:

1) Лайт способ - воспользовать интентом, который обработает дефолтный обработчик СМСок установленный на телефоне:

String number = "123456789";  //номер получателя 
Intent smsIntent=new Intent(Intent.ACTION_VIEW);
smsIntent.putExtra("sms_body", "Test message"); 
smsIntent.setType("vnd.android-dir/mms-sms");
startActivity(smsIntent);  

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

2) Хард способ (как бы незаметно для юзера):

String number = "123456789";  //номер получателя 
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(number, null, "Test message", null, null);

Требуется пермишен и фича:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-feature
    android:name="android.hardware.telephony"
    android:required="true" />

Начиная с API Kitkat (по-моему) там что-то изменилось в пермишенах и так просто послать СМС по второму варианту уже нельзя.

Update

Все таки наврал. Спец. пермишен для API >= KitKat на отсылку смс не требуется.

почитайте здесь

READ ALSO
Параметризированный метод для Class&lt;T&gt;

Параметризированный метод для Class<T>

Есть интерфейс Animal и 2 класса реализующих этот интерфейс : Dog и Cat

252
Вектор пар в Java

Вектор пар в Java

Как создать вектор пар?

302
Как написать обработчик аннотации?

Как написать обработчик аннотации?

У меня задача написать аннотацию подобную @Value в SpringBootТоесть любое поле аннотированое @Prop("${value}") должно получить значение из properties файла

292