Tizen app振动背景

时间:2016-05-12 22:07:27

标签: tizen tizen-wearable-sdk tizen-web-app samsung-gear

我有一个三星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 个答案:

答案 0 :(得分:1)

第一种方法:

您可以先打开屏幕灯然后振动。

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

这很棘手,但很有效。

第二种方法:

  1. 创建一个从服务器接收数据的服务应用程序

  2. 创建需要针对所需功能启动的UI应用。

  3. 在UI应用中引用指向服务应用

  4. 的参考
  5. 当服务从服务器接收数据时,它会振动并在UI应用程序中休息。

  6. 在服务应用中,

    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. 如果您需要将数据从服务应用程序发送到UI应用程序,请使用消息端口。

答案 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”'键,你似乎有两个选择,但两者更像是一种解决方法:

  1. 只需使用通知(Notification)这将推动一个 通知手表的通知区域包括a 振动选项
  2. 警报的另一种方式是另一种方式,但它需要一个 不仅仅是一个警报。
  3. 您的应用需要一些条件才能从背景中振动:

    • 屏幕需要打开
    • 您的应用需要处于前台

    因此,对于第二种方式,您需要做更多的事情。我使用向导创建了一个新项目(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();
    } () );

    那么这里做了什么:

    1. 在onload事件中我们注册了一个远程消息端口 (MessagePort)并为“page show”添加一些事件监听器 改变屏幕状态。
    2. 应用程序启动后,我们等到应用程序进入后台和屏幕 关闭
    3. 在onScreenStateChanged中,我们得到屏幕关闭     我们添加一个新警报,将在10秒内触发。
    4. 警报会触发app和pageShow事件 checkLaunchRequest将被调用。
    5. 应用程序控制操作是... / view,因此应用程序设置为最顶层 应用程序和屏幕已打开
    6. 现在我们再次进入onScreenStateChanged,但这一次看到了 屏幕已打开并振动
    7. 我知道这似乎是超负荷振动,但我认为这是在屏幕关闭后让振动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();