Дельта синхронизация без облака

Ранее мы показывали разные способы синхронизации криптодиска между ПК и Android-устройством.

Смотрим плавность хода с помощью BMW Rheingold

Всем знакома ситуация, когда двигатель немного "троит", но пропусков зажигания нет...

Дельта-синхронизация крипто-дисков

Существуют разные способы зашифровать "облако". Один из них - поместить в облако крипто-диск. В предыдущей статье мы писали, почему это не всегда удобно.

Облачный хостинг VDS за 2 минуты

Настоящий облачный VDS-хостинг от UltraVDS: тестируем производительность

Соединение с внешним миром


Отправка SMS

Для отправки SMS используется класс SmsManager. В ранних версиях Android этот класс был помещен в пакет android.telephony.gsm, сейчас (начиная с версии 1.5) он находится в пакете android.telephony.

Отправить SMS довольно просто. Первым делом нужно добавить в файл манифеста соответствующее разрешение:

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

Затем нужно определить объект класса SmsManager, для этого используется статический метод getDefault(). Далее нужно определить получателя сообщения (его номер телефона) и текст самого сообщения:

import android.telephony.SmsManager;
import android.telephony.SmsMessage;
...
SmsManager sendSMS = SmsManager.getDefault();
String num = "номер получателя";
String msg = "My first SMS";
sendSMS.sendTextMessage(num, null, msg, null, null);

Метод sendTextMessage() отправляет SMS. Обычно нужно указать первый и третий параметры. Первый параметр задает номер телефона получателя, третий — текст сообщения. Второй параметр позволяет указать номер SMS-центра. Если указано значение null, будет использован номер SMS-центра, указанный в настройках телефона. Четвертый и пятый параметры используются, соответственно, для отсле-живания факта отправки и доставки сообщения.

Разберемся, как использовать четвертый и пятый параметры:

// Определяем флаги отправки и доставки SMS
String SENT_SMS_FLAG = "SENT_SMS";
String DELIVER_SMS_FLAG = "DELIVER_SMS";
// Создаем соответствующие действия

// Действие, связанное с отправкой SMS
Intent sent_sms = new Intent(SENT_SMS_FLAG);
// Отложенная деятельность, связанная с sent_sms
PendingIntent spin = PendingIntent.getBroadcast(this,0,sent_sms,0);

// Аналогично для доставки:
Intent deliver_sms = new Intent(DELIVER_SMS_FLAG);
PendingIntent dpin = PendingIntent.getBroadcast(this,0,deliver_sms,0);
Теперь создаем BroadcastReceiver, необходимый для получения результата. Такой BroadcastReceiver нужно зарегистрировать для каждого отложенного действия:
// Получаем отчет об отправке
BroadcastReceiver sentReceiver = new BroadcastReceiver(){
@Override public void onReceive(Context c, Intent in) {
      switch(getResultCode()){
             case Activity.RESULT_OK:
                   // SMS отправлено, выполняем какие-то действия
                  break;
             default:
                  // Сбой
                  break;
     }
} };
// Получаем отчет о доставке
BroadcastReceiver deliverReceiver = new BroadcastReceiver(){
@Override public void onReceive(Context c, Intent in) {
      switch(getResultCode()){
             case Activity.RESULT_OK:
                    // SMS доставлено, выполняем какие-то действия
                    break;
             default:
                    // Сбой
                    break;
     }
} };
// Регистрируем BroadcastReceiver
registerReceiver(sentReceiver, new IntentFilter(SENT_SMS_FLAG));
registerReceiver(deliverReceiver, new IntentFilter(DELIVER_SMS_FLAG));

В большинстве случаев SMS не должно превышать 140 символов. Для отправки более длинных сообщений используется метод divideMessage(), разбивающий сообщения на фрагменты, равные максимальному размеру SMS-сообщения. Отправка такого сообщения осуществляется методом sendMultipartTextMessage(), который используется вместо метода sendTextMessage(). Для получения отчета о доставке (или отправке) нужно использовать уже не одно отложенное событие, а массив таких событий. Количество элементов в таком массиве будет равно количеству частей, на которые было разбито исходное сообщение:

ArrayList<String> multiSMS = sendSMS.divideMessage(msg);
ArrayList<PendingIntent> sent_sms = new ArrayList<PendingIntent>();
ArrayList<PendingIntent> deliver_sms = new ArrayList<PendingIntent>();

for(int i=0; i< multiSMS.size(); i++){
        sentIns.add(sentIn);
        deliverIns.add(deliverIn);
}

sendSMS.sendMultipartTextMessage(num, null,
multiSMS, sentIns, deliverIns);

Ранее было сказано, что максимальная длина SMS составляет 140 байтов. Обратите внимание: именно байтов, а не символов. Когда вы отправляете SMS латинскими символами, то 140 байтов означает 140 символов. Когда же вы используете в SMS-сообщении символы национальных алфавитов, например, кириллицу, то максимальная длина сокращается до 70 символов. Для кодирования символов национальных алфавитов используется кодировка UCS-2, где каждый символ представлен 2 байтами (16 битами), поэтому количество символов, которые можно отправить в одной SMS, сокращается до 70. Помните об этом!

Работа с браузером

Запустить браузер для отображения заданной странички можно с помощью дейст-вия ACTION_NEW, сделать это достаточно просто:

Intent browser = Intent(Intent.ACTION_VIEW);

browser.setData(Uri.parse("https://www.dkws.org.ua"));
startActivity(browser);

Но запуск браузера нам мало интересен. Подумайте сами: напишете вы приложение, запускающее браузер. И какой толк от него будет? Пользователю проще напрямую запустить браузер.

Было бы гораздо интереснее создать свой браузер на основе класса WebView. Класс WebView использует движок WebKit (открытый движок браузера) — этот же движок использует браузер Apple Safari и некоторые другие для отображения Web-страниц.

В файл манифеста для использования Интернета нужно добавить разрешение:

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

К приложению нужно подключить два пакета:

import android.webkit.WebView;
import android.webkit.WebSettings;

Есть два способа заполучить объект класса WebView. Первый заключается в использовании конструктора класса WebView, второй — получить объект из разметки приложения (предварительно его нужно поместить в разметку с помощью визуального редактора разметки):

// Первый способ
WebView browser = new WebView(this);
// Второй способ
WebView browser = (WebView) findViewById(R.id.webview);
После этого можно загрузить документ:
browser.loadUrl("https://www.dkws.org.ua/");
При желании можно загружать HTML-код из строки:
String html = "HTML-код";
browser.loadData(html, "text/html", "utf-8");
Для настройки браузера используется класс WebSettings:
WebSettings webSettings = webView.getSettings();
// Блокируем картинки для экономии трафика
webSettings.setBlockNetworkImage(true);
// Запрещаем сохранять данные форм
webSettings.setSaveFormData(false);
// Разрешаем JavaScript
webSettings.setJavaScriptEnabled(true);
// Запрещаем сохранять пароли
webSettings.setSavePassword(false);
// Устанавливаем размер шрифта по умолчанию (от 1 до 72)
webSettings.setDefaultFixedFontSize(2);
// Устанавливаем название нашего браузера
webSettings.setUserAgentString("My browser v 1.0");

Подробно о методах класса WebSettings (а значит, и о параметрах браузера) вы мо-жете прочитать в руководстве разработчика Android:

https://developer.android.com/reference/android/webkit/WebSettings.html

Класс WebView тоже описан в руководстве разработчика:

https://developer.android.com/reference/android/webkit/WebView.html