- PVSM.RU - https://www.pvsm.ru -
В прошлой статье [1] мы разбирали как можно добавить в плеер с открытым исходным кодом Vanilla Music [2] возможность переключения треков при помощи клавиш громкости, если при этом устройство находится в кармане(например). В этой статье продолжим модификацию основной идеей для которой послужила следующая мысль — как можно переключать треки, не касаясь смартфона, не разблокируя его — в общем с минимальными усилиями.
В итоге было принято решение использовать информацию с датчика приближения (Proximity sensor) [3]. Суть идеи заключается в том чтобы переключать трек при появлении сигнала о приближении с датчика.
Итак, приступим к модификации. Для работы с датчиком приближения необходимо включить в приложении его «прослушивание». Это было сделано еще в прошлой статье [1], но на всякий случай приведу код настройки:
/**
* Setup the accelerometer.
*/
private void setupSensor()
{
if (mSensorManager == null)
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
if (mShakeAction == Action.Nothing)
{
if (mSensorManager != null)
mSensorManager.unregisterListener(this);
}
if(enable_defer_stop)
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),SensorManager.SENSOR_DELAY_NORMAL);
}
Теперь необходимо выполнить отслеживание изменения состояния датчика приближения. Как и в прошлый раз обратимся к методу
public void onSensorChanged(SensorEvent se) [4],
роль которого (судя по его названию) вызываться при изменении состояния зарегистрированных сенсоров. В прошлой статье мы уже определяли какой именно сенсор выдавал изменения, но я также приведу и здесь код отслеживания:
@Override
public void onSensorChanged(SensorEvent se)
{
if (se.sensor.getType() == Sensor.TYPE_PROXIMITY)
{
if( se.values[0] == 0)
isproximity = true;
else
isproximity = false;
}
....
Переменная isproximity — член класса PlayBackService хранит в себе последнее состояние полученное с сенсора(true или false). Теперь необходимо сравнивать его с предыдущим состоянием — для этого добавим еще одну boolean переменную prev_isproximity, по умолчанию установим prev_isproximity = false и добавим установку этой переменной в функцию OnSensorChanged
@Override
public void onSensorChanged(SensorEvent se)
{
if (se.sensor.getType() == Sensor.TYPE_PROXIMITY)
{
if( se.values[0] == 0)
isproximity = true;
else
isproximity = false;
prev_isproximity = isproximity;
....
Переходим к основному коду нашего функционала — переключению треков по условию изменения приближения. Переключение должно происходить при истинности следующих выражений (isproximity!= prev_isproximity) и (isproximity== true). Для того чтобы переключение работало при определенной задержке предмета над датчиком приближения ( например 1 секунду) необходимо также добавить определение разности между текущим временем и предыдущим временем изменения информации от датчика. Для этого объявим в самом классе переменную long mLastProximityChangeTime, которая будет хранить время последнего изменения информации с датчика. На основе разности текущего времени изменения информации с датчика и времени последнего определим их разность, которую и используем для выполения действий:
@Override
public void onSensorChanged(SensorEvent se)
{
if (se.sensor.getType() == Sensor.TYPE_PROXIMITY)
{
if( se.values[0] == 0)
isproximity = true;
else
isproximity = false;
// переключение при помощи нажатия на сенсор приближения
if(enable_proximity_track_next) // boolean переменная для включения опции
{
if(isproximity!= prev_isproximity)
{
long now = SystemClock.elapsedRealtime(); // определяем текущий момент времени
if (now - mLastProximityChangeTime > 1000 ) // если датчик перекрыт в течении 1 секунды
{
if(isproximity) // если датчик показывает приближение
{
performAction(Action.NextSong, null); // переключение трека на следующий
}
}
}
}
prev_isproximity = isproximity;
mLastProximityChangeTime = SystemClock.elapsedRealtime();;
}
else
...
В итоге мы получили аудиоплеер [5], который позволяет переключать треки просто проведением руки над верхней частью смартфона(вместе расположения датчика приближения), при этом затратили совсем немного времени. В этом вновь принцип Open Source показывает себя c лучшей стороны! Скачать модифицированный исходный код проекта вы можете в репозитории github [6]
Автор: Владимир Корой
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/276663
Ссылки в тексте:
[1] статье: https://habrahabr.ru/post/268923/
[2] Vanilla Music : https://github.com/vanilla-music/vanilla
[3] (Proximity sensor): https://developer.android.com/guide/topics/sensors/sensors_position.html#sensors-pos-prox
[4] public void onSensorChanged(SensorEvent se): https://developer.android.com/reference/android/hardware/SensorEventListener.html
[5] аудиоплеер: https://play.google.com/store/apps/details?id=ru.smartinterestapps.android.vanilla
[6] github: https://github.com/wkoroy/vanilla-smart-switch-of-tracks
[7] Источник: https://habrahabr.ru/post/352562/?utm_source=habrahabr&utm_medium=rss&utm_campaign=352562
Нажмите здесь для печати.