Вибрация фон приложения 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" ', кажется, у вас есть два варианта, но оба больше похожи на обходной путь:

  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. Операция управления приложением.../ просмотр, поэтому приложение установлено как самое верхнее приложение, и экран включен
  6. Теперь мы снова в onScreenStateChanged, но на этот раз видим, что экран включен и вибрировать

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

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

Первый метод:

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

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. Если вам нужно отправить данные из приложения-службы в приложение пользовательского интерфейса, используйте порт сообщения.

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

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();
Другие вопросы по тегам