2016-05-12 75 views
0

我有一個三星齒輪S和我bussy寫一個Web應用程序。當我從服務器收到消息時,我想振動我的應用程序。我只是使用navigator.vibrate(1000),這工作得很好。但是當我的應用程序轉到背景時,振動不再起作用。我發現這個線程(https://developer.tizen.org/ko/forums/web-application-development/vibration-background?langswitch=ko),他們面臨同樣的問題,但沒有解決方案。有人還建議使用鬧鐘讓你的應用程序處於活動狀態,但我不知道該怎麼做。我想這是這樣的:Tizen應用程序振動背景

var alarm = new tizen.AlarmRelative(1); 
var service = navigator.vibrate(1000); 
tizen.alarm.add(alarm, "org.tizen.browser", service); 

這會失敗,因爲服務不正確。我怎樣才能使這個工作?

回答

1

以下方法:

您可以先打開屏幕燈,然後再振動。

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

現在還不行。我不得不添加的延遲爲振動:

tizen.power.turnScreenOn(); 
setTimeout(function(){ 
    navigator.vibrate(1000); 
}, 500); 
1

第一種方法:

您可以先打開屏幕燈,然後振動。

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

這是棘手的,但工程。

第二種方法:

  1. 創建服務應用程序,它是從服務器

  2. 接收數據創建這就需要推出針對所需功能的UI應用程序。在UI應用

  3. 提及這點的時候服務從服務器接收數據服務的應用程序

  4. ,那麼它會震動和午餐的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); 
  • 如果需要從服務應用程序的數據發送到UI的應用程序,然後使用消息端口。
  • +0

    但我不想做第二個應用程序。服務器會稍後發送一條消息,我想只顯示一個彈出窗口。第一種方法不起作用。有沒有其他方法? – Tim

    +0

    你能否詳細解釋一下你的應用程序?你提到的服務器,它是單獨的應用程序?如果是的話,應用程序在背景時如何接收消息?我猜你已經知道當應用程序處於前景時振動手機的方式。在背景情況下,您需要服務應用程序。 –

    +0

    我有一個球衣網站服務器,以便我從我的Gear S網絡應用程序發送傳感器數據。這在後臺運行。當發現不規則時,服務器將發回一條消息,該消息也在後臺運行。當我收到這條消息時,當應用程序處於後臺時,我可以點亮屏幕,但不能讓它振動。如何才能做到這一點? – Tim

    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); 
    

    當您的應用程序從服務器接收到信息時添加此代碼片段。

    0

    我覺得背景振動是「不正式」支持Web的應用程序,但你可以激活它。 只需添加以下關鍵看你的config.xml:

    <tizen:setting background-support="enable" background-vibration="enable" /> 
    

    這將允許您振動,即使屏幕關閉。(參見第12頁中tizen-2.3-wrt-core-spec.pdf

    到目前爲止,這應該工作,但我認爲你不能上傳使用此設置的Tizen商店的應用程序...

    [編輯]

    今天,我玩了一下振動,只是想增加我的發現。 如果你不使用的背景振動=‘啓用’「鍵,似乎你有兩個選擇,但兩者都更像是一個解決辦法:

    1. 只要使用通知(Notification)這將推動一個 通知到手錶的通知區域包括一個 振動選項
    2. 另一種方式與鬧鐘是另一種方式,但它不僅需要一個警報,而且還需要一個 位。

    您的應用程序需要一定的條件,能夠從後臺振動:

    • 屏幕必須在
    • 您的應用程序需要在前臺

    所以對於第二種方式,你需要做更多的東西。我創建嚮導(TAU基本)的新項目,並作爲midified跟着app.js:在onload事件

    1. var myAlarm = null; 
       
      var page = document.querySelector('#main'); 
       
      var remoteMsgPort = null; 
       
      
       
      (function() { 
       
          window.addEventListener('tizenhwkey', function(ev) { 
       
      \t \t if(ev.keyName === "back") { 
       
      \t \t \t var page = document.getElementsByClassName('ui-page-active')[0], 
       
      \t \t \t \t pageid = page ? page.id : ""; 
       
      \t \t \t if(pageid === "main") { 
       
      \t \t \t \t try { 
       
      \t \t \t \t \t // cleanup 
       
      \t \t \t \t \t showAfterWakeup(false); 
       
      \t \t \t \t \t tizen.power.unsetScreenStateChangeListener(); 
       
      \t \t \t \t \t tizen.application.getCurrentApplication().exit(); 
       
      \t \t \t \t } catch (ignore) { 
       
      \t \t \t \t } 
       
      \t \t \t } else { 
       
      \t \t \t \t window.history.back(); 
       
      \t \t \t } 
       
      \t \t } 
       
      \t }); 
       
      
       
      \t /** 
       
      \t * Method to set the app as topmost app. This causes the app to be shown 
       
      \t * after display turns on, instead of the clock face. 
       
      \t * 
       
      \t * @param {boolena}enable 
       
      \t *   True to enable, false to disable 
       
      \t */ 
       
      \t function showAfterWakeup(enable) { 
       
      \t \t var param = [{ 
       
      \t \t \t key: "state", 
       
      \t \t \t value: enable ? "show" : "hide" 
       
      \t \t }]; 
       
      \t \t 
       
      \t \t if(remoteMsgPort !== null) { 
       
      \t \t \t remoteMsgPort.sendMessage(param); 
       
      \t \t \t console.debug("remoteMsgPort.sendMessage(" + JSON.stringify(param) + ")"); 
       
      \t \t } 
       
      \t } 
       
      \t 
       
      \t function checkLaunchRequest() { 
       
      \t \t var appControl, 
       
      \t \t \t appOperation, 
       
      \t \t \t ret = false; 
       
      \t \t 
       
      \t \t try { 
       
      \t \t \t appControl = tizen.application.getCurrentApplication().getRequestedAppControl().appControl; 
       
      \t \t \t appOperation = appControl.operation; 
       
      \t \t \t console.debug("checkLaunchRequest operation: " + appOperation); 
       
      \t \t \t 
       
      \t \t \t // check if operation view was used, as we set this for the alarm 
       
      \t \t \t if (appOperation.indexOf('http://tizen.org/appcontrol/operation/view') !== -1) { 
       
      \t \t \t \t console.debug("URI: " + JSON.stringify(appControl.uri)); 
       
      \t \t \t \t // set as topmost app to be in foreground when screen turns on 
       
      \t \t \t \t showAfterWakeup(true); 
       
      \t \t \t \t // turn the screen on 
       
      \t \t \t \t tizen.power.turnScreenOn(); 
       
      \t \t \t \t ret = true; 
       
      \t \t \t } 
       
      \t \t } catch (err) { 
       
      \t \t \t console.error("checkLaunchRequest Invalid launch request: " + err); 
       
      \t \t } 
       
      \t } 
       
      \t 
       
      \t function onScreenStateChanged(previousState, changedState) { 
       
      \t \t console.log("Screen state changed from " + previousState + " to " + changedState); 
       
      \t \t 
       
      \t \t if(previousState === "SCREEN_OFF" && changedState !== "SCREEN_OFF"){ 
       
      \t \t \t console.log("screen changed to ON"); 
       
      \t \t \t navigator.vibrate([250,100,350]); 
       
      \t \t \t showAfterWakeup(false); 
       
      \t \t }else if(previousState !== "SCREEN_OFF" && changedState === "SCREEN_OFF"){ 
       
      \t \t \t // Triggers an alarm on a given date/time --> 10sec from now 
       
      \t \t \t var date = new Date(); 
       
      \t \t \t date.setSeconds(date.getSeconds() + 10); 
       
      \t \t \t 
       
      \t \t \t // check if already a alarm was set and remove it to avoid multiple alarms 
       
      \t \t \t if(myAlarm !== null){ 
       
      \t \t \t \t tizen.alarm.remove(myAlarm); 
       
      \t \t \t \t myAlarm = null; 
       
      \t \t \t } 
       
      \t \t \t 
       
      \t \t \t myAlarm = new tizen.AlarmAbsolute(date); 
       
      \t \t \t var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/view"); 
       
      \t \t \t tizen.alarm.add(myAlarm, tizen.application.getCurrentApplication().appInfo.id, appControl); 
       
      \t \t \t console.log("Alarm added set for: " + date.toLocaleTimeString() + " with id: " + myAlarm.id); 
       
      \t \t \t 
       
      \t \t } 
       
      \t } 
       
      \t 
       
      \t /** 
       
      \t * Callback for pageshow event 
       
      \t */ 
       
      \t function onPageShow(){ 
       
      \t \t console.log("pageshow"); 
       
      
       
      \t \t /* 
       
      \t \t * check if alarm called app 
       
      \t \t * if false we interpret as the first app start, not clean but will do it for demo ;) 
       
      \t \t */ 
       
      \t \t if(checkLaunchRequest() !== true){ 
       
      \t \t \t // just for testing vibration 
       
      \t \t \t var text = document.querySelector('.ui-listview'); 
       
      \t \t \t text.addEventListener('click', function(ev) { 
       
      \t \t \t \t console.log("clicked: " + ev.target.nodeName); 
       
      \t \t \t \t navigator.vibrate(500); 
       
      \t \t \t }); 
       
      \t \t } 
       
      \t } 
       
      
       
      \t /** 
       
      \t * init view 
       
      \t */ 
       
      \t function init(){ 
       
      \t \t try { 
       
      \t \t \t remoteMsgPort = tizen.messageport.requestRemoteMessagePort('starter', 'Home.Reserved.Display'); 
       
      \t \t } catch (err) { 
       
      \t \t \t console.error("Exception for requestRemoteMessagePort: " + err); 
       
      \t \t } 
       
      \t \t showAfterWakeup(false); 
       
      \t \t page.addEventListener('pageshow', onPageShow); 
       
      
       
      \t \t // Sets the screen state change listener. 
       
      \t \t tizen.power.setScreenStateChangeListener(onScreenStateChanged); 
       
      \t } 
       
      \t 
       
      \t window.onload = init(); 
       
      }());

      那麼,什麼都是在這裏完成我們註冊了一個遠程消息端口 (MessagePort),併爲「頁面顯示」和屏幕狀態更改添加了一些事件監聽器。

    2. 應用程序啓動後,我們等到的應用程序切換到後臺和屏幕 關閉
    3. 在onScreenStateChanged我們得到的是屏幕關閉 ,我們添加一個新的警報將在10秒被觸發。
    4. 該警報觸發應用程序和pageShow事件,以便調用 checkLaunchRequest。
    5. 的應用控制操作... /視圖,以便應用程序設置爲最頂層 應用程序,並在屏幕開啓時
    6. 現在我們在onScreenStateChanged又是,但是這次看到 屏幕被打開並做振動

    我知道這似乎是超載只是振動,但我認爲這是振動100%的唯一方法是在屏幕關閉後工作。 在https://www.w3.org/TR/2014/WD-vibration-20140211/他們描述,如果應用程序不可見,它不應該振動,所以我認爲這就是爲什麼屏幕需要打開,應用程序需要在前臺。 不知何故,如果應用程序在後臺不能振動,它似乎是合乎邏輯的...

    我希望這有助於;)