среда, 14 ноября 2012 г.

Информация о телефоне

В этой статье рассмотрим как получить информацию о телефоне, sim-карте, сети сотовой связи, а также параметры дисплея и аккумулятора мобильного телефона.


Телефон и сотовая сеть

Для доступа к данным о телефоне, sim и сотовой сети используется класс TelephonyManager. С помощью этого класса можно определить тип и состояние телефона, доступность сотовой сети и состоянии sim-карты.


1. Экземпляр класса TelephonyManager нельзя создать напрямую, для этого необходимо вызвать метод getSystemService() (из класса Context) и передать ему константу Context.TELEPHONY_SERVICE.

  1. TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
2. Для некоторых методов класса TelephonyManager в файл манифеста (AndroidManifest.xml) необходимо добавить разрешение READ_PHONE_STATE (получение информации о состоянии телефона) или ACCESS_COARSE_LOCATION (информация о базовой станции сети сотовой связи). Разрешения в файл манифеста добавляются так:
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:versionCode="1"
  3.     android:versionName="1.0" >
  4.  
  5.     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  6.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  7.  
  8.     <application>
  9. ...
  10.     </application>
  11. </manifest>
3. Посмотрим какую информацию мы можем получить:
- int getCallState() - определяет состояние вызова телефона. Возвращает одну из трех констант: CALL_STATE_IDLE (телефон не активен), CALL_STATE_OFFHOOK (попытка вызова), CALL_STATE_RINGING (соединение с абонентом).

- int getPhoneType () - определяет тип мобильного телефона. Возвращает одну из констант PHONE_TYPE_CDMA, PHONE_TYPE_GSM, PHONE_TYPE_NONE, PHONE_TYPE_SIP.

- int getNetworkType () - определяет тип сотовой сети. Возвращает одну из констант NETWORK_TYPE_UNKNOWN, NETWORK_TYPE_GPRS, NETWORK_TYPE_EDGE, NETWORK_TYPE_UMTS, NETWORK_TYPE_CDMA и др.

- String getNetworkCountryIso () - возвращает код страны в которой зарегистрирован оператор.

- String getNetworkOperator () - возвращает код оператор (MCC+MNC) (mobile country code + mobile network code)

- String getNetworkOperatorName () - возвращает имя оператора

- String getDeviceId () - возвращает ID мобильного устройства

- String getDeviceSoftwareVersion () - возвращает версию программного обеспечения (это не версия android)

- int getDataState () - определяет состояние передачи данных. Возвращает одну из констант DATA_DISCONNECTED, DATA_CONNECTING, DATA_CONNECTED, DATA_SUSPENDED.

- int getDataActivity () - определяет направление передачи данных. Возвращает одну из констант DATA_ACTIVITY_NONE, DATA_ACTIVITY_IN, DATA_ACTIVITY_OUT, DATA_ACTIVITY_INOUT, DATA_ACTIVITY_DORMANT.

- boolean isNetworkRoaming () - определяет находится ли телефон в роуминге.

- CellLocation getCellLocation () - определяет текущее положение устройства. Возвращает экземпляр класса CellLocation, а точнее один из его классов-потомков CdmaCellLocation (для сети CDMA) или GsmCellLocation (для сетей GSM). В классе GsmCellLocation можно определить ID базовой станции сотовой сети (int getCid ()) и код территории в которой находится телефон (int getLac ())). В классе CdmaCellLocation можно получить также ID базовой станции (int getBaseStationId()), а также ее географические координаты (int getBaseStationLatitude(), int getBaseStationLongitude()).

- int getSimState() - определяет состояние sim-карты. Возвращает одну из констант SIM_STATE_UNKNOWN, SIM_STATE_ABSENT, SIM_STATE_PIN_REQUIRED, SIM_STATE_PUK_REQUIRED, SIM_STATE_NETWORK_LOCKED, SIM_STATE_READY.

- String getSimCountryIso() - Возвращает код страны провайдера

- String getSimOperator() - Возвращает код оператора (MCC+MNC)

- String getSimOperatorName() - Возвращает имя провайдера

- String getSimSerialNumber() - Возвращает серийный номер sim-карты.


Дисплей

Для получения информации о дисплее устройства используется класс DisplayMetrics.
  1. DisplayMetrics metrics = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(metrics);
В первой строчке определяется экземпляр класса DisplayMetrics, а во второй этот экземпляр инициализируется.
getWindowManager () (из класса Activity) - возвращает оконный менеджер (экземпляр класса WindowManager)
getDefaultDisplay() (из класса WindowManager) - возвращает дисплей, на котором оконный менеджер создает окна (экземпляо класса Display)
getMetrics() (из класса Display) - метод принимающий out-параметр типа DisplayMetrics для получения параметров экрана.
То есть после этих двух строчек мы получаем metrics, который содержит информацию о дисплее.

В классе DisplayMetrics есть следующие открытые поля:
densityDpi - плотность пикселей на экране (dpi)
scaledDensity - фактор масштабирования для шрифтов
heightPixels - высота экрана
widthPixels - ширина экрана
xdpi - точное количество пикселей на дюйм по ширине экрана
ydpi - точное количество пикселей на дюйм по ширине экрана


Аккумулятор

Для получения информации об аккумулятор используется класс BatteryManager. В отличие от двух предыдущих случаев, службы управляющей батарей устройства не существует. Система android рассылает широковещательные сообщения (Broadcast) об изменении состояния аккумулятора. Нам надо подписаться на получение таких сообщений.
Подписаться на широковещательные сообщения можно с помощью метода
registerReceiver(BroadcastReceiver receiver, IntentFilter filter), где
receiver - экземпляр класса унаследовнного от BroadcastReceiver с переопределенным методом OnReceive()
filter - экземпляр класса IntentFilter, определяющий, на какие сообщения мы хотим подписаться.

  1. public void onCreate(Bundle savedInstanceState) {
  2.  ...
  3.  
  4.  BroadcastReceiver receiver = new BroadcastReceiver() {
  5.   @Override
  6.   public void onReceive(Context context, Intent intent) {
  7.    int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
  8.   }
  9.  };
  10.  
  11.  registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  12. }
Мы подписались на сообщения ACTION_BATTERY_CHANGED, теперь при изменении состоянии батареи мобильного телефона, будет вызываться метод OnReceive. В этот метод передается переменная intent, которая содержит набор Extra-параметров, предоставляющих информацию об аккумуляторе.
Получить эти параметры можно с помощью методов
int getIntExtra(String name, int defaultValue) или String getStringExtra(String name)
где name - название параметра
defaultValue - значение по умолчанию, если параметр не определено.
Эти методы возвращают числовое или строковое значение параметра (в классе Intent есть также функции для float, double и т.д., но в данном случае они нам не понадобятся).

В качестве названия параметра (name) передается одна из констант из класса BatteryManager:

EXTRA_HEALTH - состояние батареи. Значением будет одна из следующих констант:
BATTERY_HEALTH_DEAD - батарея неработоспособна
BATTERY_HEALTH_GOOD - батарея в хорошем состоянии
BATTERY_HEALTH_OVERHEAT - батарея перегрета
BATTERY_HEALTH_OVER_VOLTAGE - у батареи повышенное напряжение
BATTERY_HEALTH_UNKNOWN - состояние неизвестно
BATTERY_HEALTH_UNSPECIFIED_FAILURE - батарея неисправна

EXTRA_ICON_SMALL - идентификатор ресурса для значка батареи. Такой значок показывается в строке состояния мобильного телефона и показывает уровень заряда батареи

EXTRA_SCALE - максимальный уровень заряда батареи

EXTRA_LEVEL - текущий уровень заряда батареи (значение от 0 до EXTRA_SCALE)

EXTRA_STATUS - определяет состояние заряда аккумулятора. Значением будет одна из следующих констант:
BATTERY_STATUS_CHARGING - батарея заряжается
BATTERY_STATUS_DISCHARGING - батарея разряжена
BATTERY_STATUS_FULL - батарея заряжена
BATTERY_STATUS_NOT_CHARGING - батарея не заряжается
BATTERY_STATUS_UNKNOWN - состояние не известно

EXTRA_PLUGGED - определяет подключение зарядного устройства. Значением будет одна из следующих констант:
BATTERY_PLUGGED_AC - подключено к зарядному устройству
BATTERY_PLUGGED_USB - подключено к USB

EXTRA_PRESENT - определяет наличие батареи в устройстве (значение типа boolean)

EXTRA_TECHNOLOGY - технология батареи, например “Li-Ion”. (значение типа String)

EXTRA_TEMPERATURE - температура батареи

EXTRA_VOLTAGE - напряжение на батареи

Для получения информации о состоянии аккумулятора необходимо добавить разрешение BATTERY_STATS в AndroidManifest.xml
<uses-permission android:name="android.permission.BATTERY_STATS"/>

Полный код приводить тут не буду, он достаточно банален. При последовательном вызове всех описанных методов получаем что-то такое:


Исходники приложения SysManager можно скачать чуть ниже. В приложении 5 классов:
SysManagerActivity - главное окно приложения, в котором определяются три вкладки. Подробнее как делать вкладки читать тут
TelManager - получение информации о телефоне и sim карте
ScrManager - получение информации о дисплее
BatManager - получение информации об аккумуляторе
Во всех трех классаx полученная информация просто выводится в текстовое поле.
TS - вспомогательный класс, с кучей статических методов, которые переводят интовые константы типа TelephonyManager.NETWORK_TYPE_GPRS в строки (“GPRS”).
Не забывайте про дополнительные разрешения в AndroidManifest.xml :)

Исходники: SysManager.zip

Комментариев нет:

Отправить комментарий