Вибрация фон приложения 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);
Это терпит неудачу, потому что обслуживание не правильно. Как я могу заставить это работать?
5 ответов
Следующий метод:
Вы можете сначала включить подсветку экрана, а затем вибрировать.
tizen.power.turnScreenOn();
navigator.vibrate(1000);
пока не работает Мне пришлось добавить задержку для вибрации:
tizen.power.turnScreenOn();
setTimeout(function (){
navigator.vibrate(1000);
}, 500);
Я думаю, что фоновая вибрация "не официальная" поддерживается в веб-приложениях, но вы можете активировать ее. Просто добавьте следующий ключ в ваш config.xml:
<tizen:setting background-support="enable" background-vibration="enable" />
Это позволит вам вибрировать, даже если экран выключен. (См. Также стр. 12 в tizen-2.3-wrt-core-spec.pdf)
Пока это должно работать, но я думаю, что вы не можете загрузить приложение с этим параметром в магазин Tizen...
[РЕДАКТИРОВАТЬ]
Сегодня я немного поиграл с вибрацией и просто хотел добавить свои открытия. Если вы не используете клавишу 'background-vib = = enable" ', кажется, у вас есть два варианта, но оба больше похожи на обходной путь:
- Просто используйте уведомления ( Уведомление) Это будет толкать Уведомление в область уведомлений часов, включая возможность вибрировать
- Другой способ с сигналом тревоги - это другой путь, но для этого потребуется немного больше, чем просто сигнализация.
Ваше приложение нуждается в некоторых условиях, чтобы иметь возможность вибрировать от фона:
- экран должен быть включен
- ваше приложение должно быть на переднем плане
Так что для второго способа вам нужно сделать немного больше вещей. Я создал новый проект с помощью мастера (базовый 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();
} () );
Итак, что здесь сделано:
- в событии onload мы регистрируем удаленный порт сообщения ( MessagePort) и добавляем прослушиватель событий для "показа страницы" и изменения состояний экрана.
- После запуска приложения мы ждем, пока приложение переходит в фоновый режим и экран выключается
- В onScreenStateChanged мы получаем, что экран выключен, и добавляем новый сигнал тревоги, который будет срабатывать через 10 секунд.
- Тревога вызывает приложение и событие pageShow, так что вызывается checkLaunchRequest.
- Операция управления приложением.../ просмотр, поэтому приложение установлено как самое верхнее приложение, и экран включен
- Теперь мы снова в onScreenStateChanged, но на этот раз видим, что экран включен и вибрировать
Я знаю, что это кажется перегруженным, чтобы просто вибрировать, но я думаю, что это единственный способ заставить вибрацию работать на 100% после выключения экранов. В https://www.w3.org/TR/2014/WD-vibration-20140211/ они описывают, что если приложение не видно, оно не должно вибрировать, поэтому я думаю, именно поэтому экраны должны быть включены, а приложение должен быть на переднем плане. Почему-то мне кажется логичным, что приложение не может вибрировать, если оно находится в фоновом режиме...
Надеюсь, это поможет;)
Первый метод:
Вы можете сначала включить подсветку экрана, а затем вибрировать.
tizen.power.turnScreenOn();
navigator.vibrate(1000);
Это сложно, но работает.
Второй метод:
Создайте приложение службы, которое получает данные с сервера
Создайте свое приложение пользовательского интерфейса, которое нужно запустить для желаемой функции.
Сделать ссылку в приложении пользовательского интерфейса, которая указывает на приложение службы
Когда Сервис получает данные с сервера, он вибрирует и запускает приложение пользовательского интерфейса.
В сервисном приложении,
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);
- Если вам нужно отправить данные из приложения-службы в приложение пользовательского интерфейса, используйте порт сообщения.
Вы можете использовать будильник.
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);
Добавьте этот фрагмент кода, когда ваше приложение получает информацию от сервера.
Это работает для меня.
Найти 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();