我有一个三星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);
此操作失败,因为服务不正确。我怎样才能让它发挥作用?
答案 0 :(得分:1)
第一种方法:
您可以先打开屏幕灯然后振动。
tizen.power.turnScreenOn();
navigator.vibrate(1000);
这很棘手,但很有效。
第二种方法:
创建一个从服务器接收数据的服务应用程序
创建需要针对所需功能启动的UI应用。
在UI应用中引用指向服务应用
当服务从服务器接收数据时,它会振动并在UI应用程序中休息。
在服务应用中,
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 :(得分:1)
以下方法:
您可以先打开屏幕灯然后振动。
tizen.power.turnScreenOn();
navigator.vibrate(1000);
还没有完成任务。我不得不为振动添加一个延迟:
tizen.power.turnScreenOn();
setTimeout(function (){
navigator.vibrate(1000);
}, 500);
答案 2 :(得分:0)
您可以使用闹钟。
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);
当您的应用从服务器接收信息时添加此代码片段。
答案 3 :(得分:0)
我认为网络应用程序支持背景振动“非官方”,但您可以激活它。 只需将以下密钥添加到config.xml:
<tizen:setting background-support="enable" background-vibration="enable" />
即使屏幕关闭,也可以振动。 (另见tizen-2.3-wrt-core-spec.pdf中的第12页)
到目前为止,这应该有效,但我认为您无法将具有此设置的应用上传到Tizen商店......
[编辑]
今天我玩了一下振动,只想添加我的发现。 如果你不使用'background-vibration =“enable”'键,你似乎有两个选择,但两者更像是一种解决方法:
您的应用需要一些条件才能从背景中振动:
因此,对于第二种方式,您需要做更多的事情。我使用向导创建了一个新项目(TAU basic)并将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();
} () );
那么这里做了什么:
我知道这似乎是超负荷振动,但我认为这是在屏幕关闭后让振动100%工作的唯一方法。 在https://www.w3.org/TR/2014/WD-vibration-20140211/中,他们描述了如果应用程序不可见,它不应该振动,所以我认为这就是屏幕需要打开并且应用程序需要处于前台的原因。 不知怎的,对我来说,如果应用程序在背景中不会振动,这似乎是合乎逻辑的......
我希望这会有所帮助;)
答案 4 :(得分:0)
这适合我。
在 config.xml 中找到application.lauch
参数ID。
请参阅下面的示例以及所需的权限和设置。
<强> 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();