Я думаю, что фоновая вибрация "неофициально" поддерживается в веб-приложениях, но вы можете ее активировать. Просто добавьте следующий ключ в свой config.xml:
<tizen:setting background-support="enable" background-vibration="enable" />
Это позволит вам вибрировать, даже если экран выключен. (См. Также стр. 12 в разделе )
Пока это должно работать, но я думаю, что вы не можете загрузить приложение с этой настройкой в Tizen-store ...
[РЕДАКТИРОВАТЬ]
Сегодня немного поигрался с вибрацией и просто хотел добавить свои открытия. Если вы не используете клавишу 'background -ibration = "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.
- Операция управления приложением - ... / view, поэтому приложение установлено как самое верхнее приложение, и экран включен.
- Теперь мы снова находимся в onScreenStateChanged, но на этот раз видим, что экран был включен, и вибрируем
Я знаю, что это кажется перегруженным, чтобы просто вибрировать, но я думаю, что это единственный способ заставить вибрацию на 100% работать после выключения экранов. В https://www.w3.org/TR/2014/WD-vibration-20140211/ они описывают, что если приложение не отображается, оно не должно вибрировать, поэтому я думаю, что именно поэтому экраны должны быть включены, а приложение должно быть на переднем плане. Мне почему-то кажется логичным, что приложение не может вибрировать, если оно находится в фоновом режиме ...
Надеюсь, это поможет ;)
person
motu
schedule
17.05.2016