ДонНТУ   Портал магистров

Решение прикладной задачи

Известно, что даже оригинальные кабели питания для смартфонов со временем изнашиваются и не могут обеспечить номинальный ток заряда. Однако сам смартфон не даёт никакой информации о качестве заряда. Когда я столкнулся с такой ситуацией, что дома не обнаружилось ни одного хорошего кабеля для зарядки было решено написать приложение для получения данных о токе заряда, так как это дает возможность определить хороший кабель или изношеный.

Так как обычные приложения для Android я писал уже уверенно, то я решил написать виджет. Писать виджеты мне еще не доводилось, поэтому эта задача убъет двух зайцев – решение практической задачи и изучение подхода для написания виджетов.

Информационные виджеты обычно отображают несколько важных информационных элементов и отслеживают, как эта информация изменяется с течением времени. Хорошими примерами информационных виджетов являются виджеты погоды, виджеты часов или виджеты отслеживания спортивных результатов. Прикосновение к информационным виджетам обычно запускает соответствующее приложение и открывает подробное представление информации о виджете.

Виджеты имеют ряд ограничений по сравнению с полноценными приложениями. Это связано с производительностью и энергопотреблением устройства. Поскольку виджеты находятся на главном экране, они должны сосуществовать с установленной там навигацией. Это ограничивает поддержку жестов, доступную в виджете, по сравнению с полноэкранным приложением. В то время как приложения, например, могут позволять пользователям перемещаться между экранами по горизонтали, этот жест уже используется на главном экране с целью перехода между главными экранами. Так же достпны не все элементы разметки, в том числе те, что требуют недоступные для виджета жесты [1].

Так как у виджета простая задача – отображение значения тока, то и разметка у него простая. Состоит из двух полей – одно для отображение тока, второе для отображения времени обновления измерения. Время необходимо, так как система Android обновляет виджеты раз в пол часа для экономии заряда батареи.

Разметка графичекого интерфейса виджета:


				<?xml version="1.0" encoding="utf-8"?>
				<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
				    android:orientation="vertical" android:layout_width="match_parent"
				    android:background="@drawable/widget_background"
				    android:layout_height="match_parent">
				        <TextView
				            android:id="@+id/tv"
				            android:layout_width="match_parent"
				            android:layout_height="wrap_content"
				            android:clickable="true"
				            android:focusable="true"
				            android:fontFamily="@font/mult"
				            android:textAlignment="center"
				            android:textSize="32sp" />        
				        <TextView
				            android:id="@+id/tve"
				            android:layout_width="match_parent"
				            android:layout_height="wrap_content"
				            android:textAlignment="center"
				            android:textColor="#aaa"
				            android:textSize="14sp" />
				  </LinearLayout>
      

Далее реализуется WidgetProvider, тут будет находится код, исполняемый виджетом. А именно метод onUpdate будет вызываться каждый раз, когда система решит обновить виджет. Исходный код (фрагмент):


				package dpr.svich.ampereassist;

				public class CurrentWidget extends AppWidgetProvider {

				    private BatteryManager mBatteryManager;

				    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm::ss");

				    @Override
				    public void onEnabled(Context context) {
				        super.onEnabled(context);
				    }

				    @Override
				    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
				        super.onUpdate(context, appWidgetManager, appWidgetIds);
				        ...
				    }
      

Для получения данных о токе заряда, нужно обратиться к BatteryManager. Этот класс предоставляет методы для запроса свойств аккумулятора и зарядки. Можно получить сведения о заряде, каким источником заряжается устройство [2]. Можно определить энергопотребление устройств Android, которые включают датчик уровня заряда аккумулятора, например Summit SMB347 или Maxim MAX17050 (доступен на многих устройствах Nexus).

Для типичной конструкции сенсорного резистора 10 мОм ток смещения должен быть лучше 1,5 мА, что означает, что любое измерение составляет +/- 1,5 мА (компоновка печатной платы также может повлиять на это изменение). Например, при измерении большого тока (200 мА) можно ожидать следующее:

Суммарная погрешность составляет 5,5 мА (2,75%). Сравните это со средним током (50 мА), где тот же процент ошибок дает общую ошибку 7%, или с небольшим током (15 мА), где +/- 1,5 мА дает общую ошибку 10% [3].

Исходный кода для получения значения тока выглядит следующим образом:


      	mBatteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);

        //  Receive battery current
        int nowCurrent = mBatteryManager
                .getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW);
        //  if hardware don`t support
        if(nowCurrent == 0){
            nowCurrent = mBatteryManager
                    .getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE);
        }
        int capacity = mBatteryManager
                .getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);
        //  Current time
        Date curentTime = new Date();
        //  Change view
        RemoteViews widgetView = new RemoteViews(context.getPackageName(), R.layout.widget);
        //  Color of charge
        widgetView.setTextColor(R.id.tv,
                context.getColor((nowCurrent>0)?R.color.colorRed:R.color.colorGreen));
        //  Preparing current value for display
        nowCurrent = Math.abs(nowCurrent);
        String ampere;
        if(nowCurrent > 1000){
            if(nowCurrent/1000 > 900){
                ampere = String.format("%2.3f A", (double)nowCurrent / 1000000);
            } else {
                ampere = (nowCurrent/1000) + " mA";
            }
        } else {
            ampere = nowCurrent + " \u00b6A";
        }
        widgetView.setTextViewText(R.id.tv, ampere);
        //  Updating time
        widgetView.setTextViewText(R.id.tve, sdf.format(curentTime));
      

После установки приложения на смартфон, необходимо добавить виджет на домашний экран. На рисунке 1 приведены скриншоты работы виджета. Как можно заметить, ток заряда растет плавно и достигает пика. Максимальный ток заряда зависит от номинала зарядного адаптера, пропускной возможности кабеля, заряда батареии и ее температуры.

Рисунок 1 – Внешний вид и работа виджета

Рисунок 1 – Внешний вид и работа виджета

Выводом данного раздела могу сделать следующее: навыки программирования дают человеку колосальные возможности, ограниченные лишь его фантазией и возможностями платформы. В разделе представлено решение одной из множества практических задач, которые можно решить реализовав программный продукт.

Список использованной литературы

1. App widgets overview [Электронный ресурс]. – Режим доступа: https://developer.android.com/guide/topics/appwidgets/overview
2. Monitor the Battery Level and Charging State [Электронный ресурс]. – Режим доступа: https://developer.android.com/training/monitoring-device-state/battery-monitoring
3. Measuring Device Power [Электронный ресурс]. – Режим доступа: https://source.android.com/devices/tech/power/device?hl=en