В прошлой статье мы разбирали как можно добавить в плеер с открытым исходным кодом Vanilla Music возможность переключения треков при помощи клавиш громкости, если при этом устройство находится в кармане(например). В этой статье продолжим модификацию основной идеей для которой послужила следующая мысль — как можно переключать треки, не касаясь смартфона, не разблокируя его — в общем с минимальными усилиями.
В итоге было принято решение использовать информацию с датчика приближения (Proximity sensor). Суть идеи заключается в том чтобы переключать трек при появлении сигнала о приближении с датчика.
Итак, приступим к модификации. Для работы с датчиком приближения необходимо включить в приложении его «прослушивание». Это было сделано еще в прошлой статье, но на всякий случай приведу код настройки:
Теперь необходимо выполнить отслеживание изменения состояния датчика приближения. Как и в прошлый раз обратимся к методу public void onSensorChanged(SensorEvent se), роль которого (судя по его названию) вызываться при изменении состояния зарегистрированных сенсоров. В прошлой статье мы уже определяли какой именно сенсор выдавал изменения, но я также приведу и здесь код отслеживания:
Переменная isproximity — член класса PlayBackService хранит в себе последнее состояние полученное с сенсора(true или false). Теперь необходимо сравнивать его с предыдущим состоянием — для этого добавим еще одну boolean переменную prev_isproximity, по умолчанию установим prev_isproximity = false и добавим установку этой переменной в функцию OnSensorChanged
Переходим к основному коду нашего функционала — переключению треков по условию изменения приближения. Переключение должно происходить при истинности следующих выражений (isproximity!= prev_isproximity) и (isproximity== true). Для того чтобы переключение работало при определенной задержке предмета над датчиком приближения ( например 1 секунду) необходимо также добавить определение разности между текущим временем и предыдущим временем изменения информации от датчика. Для этого объявим в самом классе переменную long mLastProximityChangeTime, которая будет хранить время последнего изменения информации с датчика. На основе разности текущего времени изменения информации с датчика и времени последнего определим их разность, которую и используем для выполения действий:
В итоге мы получили аудиоплеер, который позволяет переключать треки просто проведением руки над верхней частью смартфона(в месте расположения датчика приближения), при этом затратили совсем немного времени. В этом вновь принцип Open Source показывает себя c лучшей стороны! Скачать модифицированный исходный код проекта вы можете в репозитории github.
В итоге было принято решение использовать информацию с датчика приближения (Proximity sensor). Суть идеи заключается в том чтобы переключать трек при появлении сигнала о приближении с датчика.
Итак, приступим к модификации. Для работы с датчиком приближения необходимо включить в приложении его «прослушивание». Это было сделано еще в прошлой статье, но на всякий случай приведу код настройки:
/** * 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), роль которого (судя по его названию) вызываться при изменении состояния зарегистрированных сенсоров. В прошлой статье мы уже определяли какой именно сенсор выдавал изменения, но я также приведу и здесь код отслеживания:
@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 ...
В итоге мы получили аудиоплеер, который позволяет переключать треки просто проведением руки над верхней частью смартфона(в месте расположения датчика приближения), при этом затратили совсем немного времени. В этом вновь принцип Open Source показывает себя c лучшей стороны! Скачать модифицированный исходный код проекта вы можете в репозитории github.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Разрабатывали ли вы свой проект на основе другого opensource проекта?
47.06%Да8
29.41%Нет5
23.53%Хочу посмотреть ответ4
Проголосовали 17 пользователей. Воздержались 11 пользователей.
