Модифицируем плеер Vanilla Music под Android (часть 2)

в 6:15, , рубрики: android, github, java, open source, opensource projects, Разработка под android, умный плеер

В прошлой статье мы разбирали как можно добавить в плеер с открытым исходным кодом Vanilla Music возможность переключения треков при помощи клавиш громкости, если при этом устройство находится в кармане(например). В этой статье продолжим модификацию основной идеей для которой послужила следующая мысль — как можно переключать треки, не касаясь смартфона, не разблокируя его — в общем с минимальными усилиями.
В итоге было принято решение использовать информацию с датчика приближения (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

Автор: Владимир Корой

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js