Часто в процессе разработки встает необходимость узнать какая версия 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) ? “есть” : “нет”).
Логика его такова, что в случае выполнения первого условия выполняется первый оператор, в обратном второй.
Далее идет последовательное добавление строк.
Теперь я покажу результаты запуска программы на всех сейчас доступных устройствах.
Первое