Фон вибрации приложения Tizen

У меня Samsung Gear S, и я торопливо пишу веб-приложение. Я хочу, чтобы мое приложение вибрировало, когда я получаю сообщение от моего сервера. Я просто использую navigator.vibrate(1000), и это прекрасно работает. Но когда мое приложение переходит в фоновый режим, вибрация больше не работает. Я нашел эту ветку (https://developer.tizen.org/ko/forums/web-application-development/vibration-background?langswitch=ko), в котором они сталкиваются с той же проблемой, но решения нет. Кто-то также предложил использовать будильники, чтобы сделать ваше приложение активным, но я не знаю, как это сделать. Полагаю, это примерно так:

var alarm = new tizen.AlarmRelative(1);
var service = navigator.vibrate(1000);
tizen.alarm.add(alarm, "org.tizen.browser", service);

Это не удается, потому что служба неверна. Как я могу заставить это работать?


person Tim    schedule 12.05.2016    source источник


Ответы (5)


Первый способ:

Вы можете сначала включить подсветку экрана, а затем завибрировать.

tizen.power.turnScreenOn();
navigator.vibrate(1000);

Это сложно, но работает.

Второй способ:

  1. Создайте служебное приложение, которое будет получать данные с сервера.

  2. Создайте приложение пользовательского интерфейса, которое необходимо запустить для получения желаемой функции.

  3. Сделайте ссылку в приложении пользовательского интерфейса, которое указывает на сервисное приложение

  4. Когда Сервис получает данные с сервера, он вибрирует и запускает приложение пользовательского интерфейса.

В сервисном приложении

var alarm = new tizen.AlarmRelative(10);
var service = new tizen.ApplicationService("http://tizen.org/appsvc/operation/view","http://www.tizen.org");
tizen.alarm.add(alarm, "org.your.app.id", service);
console.log("Alarm added with id: " + alarm.id);
  1. Если вам нужно отправить данные из приложения-службы в приложение пользовательского интерфейса, используйте порт сообщений.
person Arup Sarker    schedule 13.05.2016
comment
Но я не хочу делать второе приложение. Сервер будет время от времени отправлять сообщение, и я хотел бы просто показать всплывающее окно. К сожалению, первый способ не работает. Есть ли другой способ? - person Tim; 14.05.2016
comment
Не могли бы вы подробно рассказать о своем приложении? Сервер, о котором вы говорили, это отдельное приложение? Если это так, то как приложение может получать сообщение, когда оно находится в фоновом режиме? Думаю, вы уже знаете, как вибрировать телефон, когда приложение находится на переднем плане. В случае фона вам понадобится сервисное приложение. - person Arup Sarker; 14.05.2016
comment
У меня есть веб-сервер в джерси, на который я отправляю данные датчиков из веб-приложения Gear S. Это работает в фоновом режиме. При обнаружении неисправности сервер отправит сообщение, которое также работает в фоновом режиме. Когда я получаю это сообщение, я могу включить подсветку экрана, когда приложение работает в фоновом режиме, но я не могу позволить ему вибрировать. Как это может быть сделано? - person Tim; 14.05.2016

Следующий метод:

Вы можете сначала включить подсветку экрана, а затем завибрировать.

tizen.power.turnScreenOn();
navigator.vibrate(1000);

пока не работает. Пришлось добавить задержку вибрации:

tizen.power.turnScreenOn();
setTimeout(function (){
    navigator.vibrate(1000);
}, 500);
person Tim    schedule 15.05.2016

Я думаю, что фоновая вибрация "неофициально" поддерживается в веб-приложениях, но вы можете ее активировать. Просто добавьте следующий ключ в свой config.xml:

<tizen:setting background-support="enable" background-vibration="enable" />

Это позволит вам вибрировать, даже если экран выключен. (См. Также стр. 12 в разделе )

Пока это должно работать, но я думаю, что вы не можете загрузить приложение с этой настройкой в ​​Tizen-store ...

[РЕДАКТИРОВАТЬ]

Сегодня немного поигрался с вибрацией и просто хотел добавить свои открытия. Если вы не используете клавишу 'background -ibration = "enable"', похоже, у вас есть два варианта, но оба они больше похожи на обходной путь:

  1. Просто используйте уведомления (Уведомление). Это подтолкнет Уведомление в области уведомлений часов, включая возможность вибрировать
  2. Другой способ с будильником - это другой способ, но для этого потребуется немного больше, чем просто будильник.

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

  • экран должен быть включен
  • ваше приложение должно быть на переднем плане

Итак, для второго способа вам нужно сделать немного больше. Я создал новый проект с мастером (базовый TAU) и обновил app.js следующим образом:

var myAlarm = null;
var page = document.querySelector('#main');
var remoteMsgPort = null;

( function () {
    window.addEventListener( 'tizenhwkey', function( ev ) {
		if( ev.keyName === "back" ) {
			var page = document.getElementsByClassName( 'ui-page-active' )[0],
				pageid = page ? page.id : "";
			if( pageid === "main" ) {
				try {
					// cleanup 
					showAfterWakeup(false);
					tizen.power.unsetScreenStateChangeListener();
					tizen.application.getCurrentApplication().exit();
				} catch (ignore) {
				}
			} else {
				window.history.back();
			}
		}
	} );

	/**
	 * Method to set the app as topmost app. This causes the app to be shown
	 * after display turns on, instead of the clock face.
	 * 
	 * @param {boolena}enable
	 *            True to enable, false to disable
	 */
	function showAfterWakeup(enable) {
		var param = [{
			key: "state",
			value: enable ? "show" : "hide"
		}];
		
		if(remoteMsgPort !== null) {
			remoteMsgPort.sendMessage(param);
			console.debug("remoteMsgPort.sendMessage(" + JSON.stringify(param) + ")");
		}
	}
	
	function checkLaunchRequest() {
		var appControl,
			appOperation,
			ret = false;
		
		try {
			appControl = tizen.application.getCurrentApplication().getRequestedAppControl().appControl;
			appOperation = appControl.operation;
			console.debug("checkLaunchRequest operation: " + appOperation);
			
			// check if operation view was used, as we set this for the alarm
			if (appOperation.indexOf('http://tizen.org/appcontrol/operation/view') !== -1) {
				console.debug("URI: " + JSON.stringify(appControl.uri));
				// set as topmost app to be in foreground when screen turns on
				showAfterWakeup(true);
				// turn the screen on
				tizen.power.turnScreenOn();
				ret = true;
			}
		} catch (err) {
			console.error("checkLaunchRequest Invalid launch request: " + err);
		}
	}
	
	function onScreenStateChanged(previousState, changedState) {
		console.log("Screen state changed from " + previousState + " to " + changedState);
		
		if(previousState === "SCREEN_OFF" && changedState !== "SCREEN_OFF" ){
			console.log("screen changed to ON");
			navigator.vibrate([250,100,350]);
			showAfterWakeup(false);
		}else if(previousState !== "SCREEN_OFF" && changedState === "SCREEN_OFF" ){
			// Triggers an alarm on a given date/time --> 10sec from now
			var date = new Date();
			date.setSeconds(date.getSeconds() + 10);
			
			// check if already a alarm was set and remove it to avoid multiple alarms
			if(myAlarm !== null){
				tizen.alarm.remove(myAlarm);
				myAlarm = null;
			}
			
			myAlarm = new tizen.AlarmAbsolute(date);
			var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/view");
			tizen.alarm.add(myAlarm, tizen.application.getCurrentApplication().appInfo.id, appControl);
			console.log("Alarm added set for: " + date.toLocaleTimeString() + " with id: " + myAlarm.id);
			
		}
	}
	
	/**
	 * Callback for pageshow event
	 */
	function onPageShow(){
		console.log("pageshow");

		/*
		 * check if alarm called app
		 * if false we interpret as the first app start, not clean but will do it for demo ;)
		 */
		if(checkLaunchRequest() !== true){
			// just for testing vibration
			var text = document.querySelector('.ui-listview');
			text.addEventListener('click', function(ev) {
				console.log("clicked: " + ev.target.nodeName);
				navigator.vibrate(500);
			});
		}
	}

	/**
	 * init view
	 */
	function init(){
		try {
			remoteMsgPort = tizen.messageport.requestRemoteMessagePort('starter', 'Home.Reserved.Display');
		} catch (err) {
			console.error("Exception for requestRemoteMessagePort: " + err);
		}
		showAfterWakeup(false);
		page.addEventListener('pageshow', onPageShow);

		// Sets the screen state change listener.
		tizen.power.setScreenStateChangeListener(onScreenStateChanged);
	}
	
	window.onload = init();
} () );

Итак, что здесь сделано:

  1. в событии onload мы регистрируем порт удаленного сообщения (MessagePort) и добавить прослушиватель событий для «показа страницы» и изменения состояний экрана.
  2. После запуска приложения ждем, пока приложение не перейдет в фоновый режим и экран не выключится.
  3. В onScreenStateChanged мы получаем, что экран выключен, и добавляем новый сигнал тревоги, который сработает через 10 секунд.
  4. Тревога запускает приложение и событие pageShow, поэтому будет вызываться checkLaunchRequest.
  5. Операция управления приложением - ... / view, поэтому приложение установлено как самое верхнее приложение, и экран включен.
  6. Теперь мы снова находимся в onScreenStateChanged, но на этот раз видим, что экран был включен, и вибрируем

Я знаю, что это кажется перегруженным, чтобы просто вибрировать, но я думаю, что это единственный способ заставить вибрацию на 100% работать после выключения экранов. В https://www.w3.org/TR/2014/WD-vibration-20140211/ они описывают, что если приложение не отображается, оно не должно вибрировать, поэтому я думаю, что именно поэтому экраны должны быть включены, а приложение должно быть на переднем плане. Мне почему-то кажется логичным, что приложение не может вибрировать, если оно находится в фоновом режиме ...

Надеюсь, это поможет ;)

person motu    schedule 17.05.2016

Вы можете использовать Alarm.

var appId = tizen.application.getCurrentApplication().appInfo.id; 
var alarm = new tizen.AlarmRelative(delay);
console.log('Setting relative alarm to ' + delay + ' seconds.');
tizen.alarm.add(alarm, appId);

Добавьте этот фрагмент кода, когда ваше приложение получит информацию с сервера.

person Arup Sarker    schedule 15.05.2016

У меня это работает.

Найдите идентификатор параметра application.lauch в своем config.xml.

См. Пример ниже и желаемые привилегии и настройки.

config.xml:

<tizen:application id="SHrC13kzHD.Alarm" package="SHrC13kzHD" required_version="2.3.2"/>
<tizen:privilege name="http://tizen.org/privilege/power"/>
<tizen:privilege name="http://tizen.org/privilege/internet"/>
<tizen:privilege name="http://tizen.org/privilege/notification"/>
<tizen:privilege name="http://tizen.org/privilege/application.launch"/>
<tizen:setting background-support="enable" encryption="disable" hwkey-event="enable"/>

function multiVibration() {
  tizen.power.turnScreenOn();   
  tizen.application.launch("SHrC13kzHD.Alarm", onsuccess);
  function onsuccess() {
    console.log("Application launched successfully");
  }
  /* Vibrate SOS */
  setTimeout(function (){  navigator.vibrate([100,30,100,30,100,200,200,30,200,30,200,200,100,30,100,30,100]);
    }, 500);
}

//test
multiVibration();
person Tony    schedule 29.04.2018