2015-12-21 46 views
1

我有一個Android Wear手錶錶盤,我試圖在一小時內振動手錶。除了手錶屏幕關閉的情況外,它正在工作。根據日誌語句,每分鐘調用一次處理程序方法,並在每小時調用一次鐘聲方法。如果我使用Moto 360通過藍牙進行調試,即使屏幕關閉,它也可以工作。如果我安裝了發行版apk,它只會在屏幕打開時振動。如果屏幕在小時的頂部關閉,則不會振動,直到屏幕重新打開。我試圖在沒有運氣的振動之前獲得喚醒鎖。我認爲這可能會工作,如果我在onCreate獲得一個喚醒鎖,並在onDestroy中釋放它,但我寧願不這樣做來保存電池。另一個有趣的事情是,當可穿戴數據api中的某些數據發生變化並且屏幕處於關閉狀態時,我還有另一個功能會發生振動。也許WearableListenerService將手錶喚醒足夠長的時間,以便發生振動。我的邏輯有問題嗎?或者這是某些Android Wear設備的限制?Android Wear手錶臉部振動與屏幕關閉

時間更改處理:

final Handler mUpdateTimeHandler = new Handler() { 
    @Override 
    public void handleMessage(Message message) { 
     switch (message.what) { 
      case MSG_UPDATE_TIME: 
       MyLog.d("Time Tick Message Handler"); 
       doTimeTickStuff(); 

       long timeMs = System.currentTimeMillis(); 
       long delayMs = mInteractiveUpdateRateMs - (timeMs % mInteractiveUpdateRateMs); 

       mUpdateTimeHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs); 

       break; 
     } 
    } 
}; 

doTimeTickStuff()

private void doTimeTickStuff() 
{ 
    MyLog.d("timetickstuff"); 

    try { 
     mCalendar = Calendar.getInstance(); 

     int currMin = mCalendar.get(Calendar.MINUTE); 

     if (currMin == 0) { 
      hourlyChime(); 
     } 
    } 
    catch(Exception ex) 
    { 
     MyLog.e(ex, "Error occurred in time tick handler"); 
    } 

    if (mIsVisible) { 
     invalidate(); 
    } 
} 

hourlyChime()

private void hourlyChime(){ 
    Vibrator v = (Vibrator) getBaseContext().getSystemService(VIBRATOR_SERVICE); 
    if (v.hasVibrator()) { 
     MyLog.d("vibrating"); 
     v.vibrate(1000); 
    } 
    else { 
     MyLog.d("No vibrator"); 
    } 
} 

更新 的起作用的解決方案是創建一個AlarmManager並與在手錶表面的廣播接收機中註冊它的onCreate然後註銷接收機中的onDestroy

的onCreate()

@Override 
public void onCreate(SurfaceHolder holder) { 
    super.onCreate(holder); 

    mChimeAlarmManager = 
      (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent ambientStateIntent = new Intent("packagename.HOURLY_CHIME"); 
    mChimePendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
     1234, ambientStateIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    WeatherTime.this.registerReceiver(chimeReceiver, 
     new IntentFilter("packagename.HOURLY_CHIME")); 

    long alarmMs = getMsTillNextHour() + System.currentTimeMillis(); 

    mChimeAlarmManager.setExact(
     AlarmManager.RTC_WAKEUP, 
     alarmMs, 
     mChimePendingIntent); 
} 

廣播接收機

private BroadcastReceiver chimeReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     hourlyChime(); 

     mChimeAlarmManager.setExact(
      AlarmManager.RTC_WAKEUP, 
      getMsTillNextHour() + System.currentTimeMillis(), 
      mChimePendingIntent); 
    } 
}; 

onDestr Oy()

@Override 
public void onDestroy() { 
    mChimeAlarmManager.cancel(mChimePendingIntent); 

    super.onDestroy(); 
} 
+0

做時,它應該在環境模式剔每小時振動你會得到什麼記錄? –

+0

環境模式與否,我得到我所期望的所有日誌語句。最重要的是,我得到了「振動」日誌,因此它能夠獲得振動器的實例並識別出手表具有振動器,但除非屏幕打開或正在調試,否則振動器不會振動。 –

+0

因此,如果您正在調試,它會在環境模式下振動,對不對?如果你只在調試時遇到問題(這是需要查看日誌的權限?) –

回答

1

當手表進入環境模式時,它進入深度睡眠狀態。因此,使用Handler編寫的代碼將不會運行。因此,您應該使用AlarmManager。有關如何執行此操作的詳細信息,請參閱「更新頻率更高」關於this page about the always-on functionality of Android Wear的部分。

關於藍牙調試模式,我懷疑它是有效的,因爲手錶永遠不會進入深度睡眠。當手錶停靠時開發應用程序時也會發生同樣的情況。最後,至於喚醒頻率,我認爲你的功能很好,因爲它每小時只發射一次。對於閱讀此內容的其他人,請避免每分鐘超過一次以上喚醒手錶,否則會嚴重影響電池壽命。在上傳到Play商店之前,請始終測試您的手錶表面的電池壽命。

+0

使用AlarmManger工作!我添加了上面的更新解決方案。 –

1

在我的項目中我使用Alarm Manager與MyIntentService擴展IntentService。 要喚醒設備(屏幕上)在onHandleIntent 使用下列內容:

if (intent.getAction() != null) { 
    tmp = intent.getAction(); 
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), TAG); 
    wakeLock.setReferenceCounted(true); 
    if(!wakeLock.isHeld()) { 
     wakeLock.acquire(); 
    } 
}