Часто в процессе разработки встает необходимость узнать какая версия Android работает на устройстве.
Это бывает необходимо знать, когда используешь новые или устаревшие (deprecated) методы.
Перед работой с сетью, нужно проверить, а есть ли с ней соединение? И если есть , то какое?
Иначе может случиться так, что закачка файла в 300Mb по мобильному интернету вылетит пользователю в копеечку.
Лучше всего его об этом предупредить пользователя заранее, и только после этого начинать закачку.
Платформа Android с радостью сообщит всю эту информацию, стоит только спросить.
Допишем пример из предыдущей статьи так, чтобы узнать всю эту информацию.
Изменим единственный файл разметки activity_main.xml
[cce lang=»xml» tab_size=»2″ no_links=»false»]
<RelativeLayout xmlns:android=»http://schemas.android.com/apk/res/android»
xmlns:tools=»http://schemas.android.com/tools»
android:layout_width=»match_parent»
android:layout_height=»match_parent»
tools:context=»${relativePackage}.${activityClass}» >
<TextView
android:id=»@+id/tv_info»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:text=»@string/hello_world» />
<TextView
android:id=»@+id/tv1″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_below=»@+id/tv_info»
android:layout_marginTop=»20dp»
android:text=»@string/hello_world» />
<TextView
android:id=»@+id/tv2″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_below=»@+id/tv1″
android:layout_marginTop=»20dp»
android:text=»@string/hello_world» />
<TextView
android:id=»@+id/tv3″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_below=»@+id/tv2″
android:layout_marginTop=»20dp»
android:text=»@string/hello_world» />
</RelativeLayout>
[/cce]
В элемент TextView с id tv_info будем выводить в один столбец всю нужную информацию.
Чтобы информация выводилась построчно, в конец каждой строки будем добавлять символ перевода строки \n.
Для получения информации о подключении к сени интернет, допишем в класс Tools функцию isOnline:
[cce lang=»java» tab_size=»2″ no_links=»false»]
public static boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
[/cce]
На вход она получает контекст (Context), использует ConnectivityManager и NetworkInfo и на выходе дает логическое значение (boolean) ,
означающее доступность или отсутствие подключения к интернету.
ConnectivityManager может дать информацию о доступности Wi-Fi или мобильного интернета (GPRS/EDGE/3G).
Для этого у него есть метод public boolean requestRouteToHost (int networkType, int hostAddress) нужно только указать тип подключения и адрес для проверки доступности(т.е. строку из ресурсов String). Вернёт метод логическое значение (boolean) , означающее доступность иди недоступность адреса по указанному соединению.
Вот пример вызова :
[cce lang=»java» tab_size=»2″ no_links=»false»]
boolean isWiFi = false;
boolean isMobile = false;
ConnectivityManager cm = (ConnectivityManager) getActivity()
.getSystemService(Context.CONNECTIVITY_SERVICE);
// проверяем хост по вайфай
isWiFi = cm.requestRouteToHost(ConnectivityManager.TYPE_WIFI,
R.string.host_to_get);
// проверяем хост по мобильному
isMobile = cm.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI,
R.string.host_to_get);
[/cce]
Проверка доступности сети требует нужных прав у приложения (ACCESS_NETWORK_STATE) , поэтому добавим в манифест строчку:
[cce lang=»xml» tab_size=»2″ no_links=»false»]
<uses-permission android:name=»android.permission.ACCESS_NETWORK_STATE» />
[/cce]
Название модели, производителя,версии ПО и версии SDK получим из класса Build (android.os.Build).
Вот измененный код метода активности onStart:
[cce lang=»java» tab_size=»2″ no_links=»false»]
@Override
protected void onStart() {
super.onStart();
TextView tv_info = (TextView) findViewById(R.id.tv_info);
String info = «Доступ к интернет:»
+ (Tools.isOnline(this) ? «есть» : «нет»)+»\n»;
info += «Модель:» + Build.MODEL + «\n»;
info += «Производитель:» + Build.MANUFACTURER + «\n»;
info += «Версия ПО: » + Build.VERSION.RELEASE + «\n»;
info += «Версия SDK: » + Build.VERSION.SDK_INT + «\n»;
tv_info.setText(info);
TextView tv1 = (TextView) findViewById(R.id.tv1);
tv1.setText(«Уровень заряда батареи » + Tools.getBatteryLevel(this));
TextView tv2 = (TextView) findViewById(R.id.tv2);
tv2.setText(«Температура батареи » + Tools.getBatteryTemperatute(this));
TextView tv3 = (TextView) findViewById(R.id.tv3);
tv3.setText(«Список доступных сенсоров на устройстве »
+ Tools.getSensorsList(this).toString());
}
[/cce]
В стоку info собираем все нужные данные, в первой строке присутствует тернарный условный оператор (Tools.isOnline(this) ? «есть» : «нет»).
Логика его такова, что в случае выполнения первого условия выполняется первый оператор, в обратном второй.
Далее идет последовательное добавление строк.
Теперь я покажу результаты запуска программы на всех сейчас доступных устройствах.
Первое