上方廣告

2012年9月15日 星期六

HTC Sense3.0待機(鎖屏or關屏)模式下無法使用Toast提示訊息

最近在開發手機來電監聽的APP,有個需求就是要有電話打進來的時候,要跳出客製的來電訊息,等到我一切在模擬器上面測試都OK的時候,放到實體機器上面測試,馬上就破功,電話打進來的時候毫無反應,一開始我想說會不會是Android的版本關係,於是我就換了其它版本的模擬器,還是正常可以正常執行,但是我在這時候發現原來實機上面是會運作的,只是在待機模式下面程式都沒有反應。
原本我的需求是要彈出一個Activiy來顯示客製的訊息,經過交叉測試過後發現我的實體機上面不管Activity還是Toast都不會顯示,但是模擬器上執行卻是OK的,Google了一陣子也沒有找到人家有這類的問題,於是我就開始懷疑該是HTC Sense的關係。

HTC Sense3.0的鎖屏介面調整成下圖的模式,我發現電話打進來的時候程式雖然有進來執行且沒任何錯誤發生,但是手機卻當作沒有任何情形發生,HTC Sense3.0版本在鎖屏模式下打電話進來並不會跳到Android預設的接電話的畫面,而是使用自己的待機接聽模式,所以我就更確定是被HTC鎖屏的機制檔下來了。

網路上找了一下人家也沒有任何解決辦法,於是我就只好用偷吃步的方法來完成,下面我就大概敘述一下我是如何解決的。PS.應該有更好的解決辦法只是我不知道 ~”~。 

話說Android本身有提供鎖屏的機制,而且還不只一種,因此如果要針對每種機制都去處理也太浪費時間成本了,於是我就想到搞不好可以針對解除待機模式來處理。查了一下Android本身就有提供這個機制的完善配套辦法【KeyguardManager.KeyguardLock】, 該類別提供了兩個方法disableKeyguard()、reenableKeyguard()。

disableKeyguard : 解除鍵盤鎖的模式,需要權限android.permission.DISABLE_KEYGUARD。
reenableKeyguard : 重新啟用鍵盤鎖,這個方法很貼心的會幫我們判斷先前有沒有呼叫過disableKeyguard或者呼叫disableKeyguard之前的狀態並且回到當時的狀態。

了解了這個類別,那就可以處理我要的case了,再來的時候先解除鍵盤鎖,等到掛掉通話後回到當初的狀態,下面就簡單的使用方法,自己看一下應該就懂了。
//螢幕鎖定&解除
KeyguardManager keyguardManager = (KeyguardManager )Context.getSystemService(Context.KEYGUARD_SERVICE);
String lockTag=this.getClass().getName();
KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(lockTag);

//解除鎖屏
keyguardLock.disableKeyguard();
//回復鎖屏
keyguardLock.reenableKeyguard();


 參考聯結 : http://blog.csdn.net/qinjuning/article/details/7505703