android源代码 锁屏灭屏来电接通后立即息屏、通话过程中息屏对方挂断不亮屏

来源:互联网 发布:编译原理java版 编辑:程序博客网 时间:2024/04/20 08:59

Android源码实际开发中遇到这样两个问题:锁屏灭屏来电接通后立即息屏、通话过程中息屏对方挂断不亮屏;由于唤醒亮屏的问题很多地方都用到,不想轻意修改其源码代码,怕引出其它更多的问题。

所以再解决这两个问题时,采用一个直接的办法,就是:锁屏灭屏来电接通后立即息屏,那么就点亮屏,几秒之后再释放;如果:通话过程中息屏对方挂断不亮屏,那么就点屏,几秒之后再释放;

   这种亮屏的方法,可以放在电话监听的三个状态的 Call_STATE_IDLECall_State_OFFHooK中来做处理。

   在这两个状态中会遇到这样一个问题:明明做一锁的释放,但屏还是暗亮点。一点不会黑屏下去不会待机。其实问题还时没有释放所有的亮屏锁,如果在状态Call_STATE_IDLECall_State_OFFHooK 中将锁new 多次,则每次产生的锁也是不一样的,即使时同一个锁名,但下面不会认同是同一个锁,故锁没有释放,不会息屏。所以在Call_STATE_IDLECall_State_OFFHooK中一定要限定new出来的锁只进行一次,并释放对应的锁。这样就可达到亮屏后,几秒钟(通过message来进行控制时间)再息屏。

   代码初记如下:

[java] view plaincopyprint?
  1. TelephonyManager mTelephonyMgr = (TelephonyManager) this  
  2.                 .getSystemService(Context.TELEPHONY_SERVICE);  
  3.       
  4.         mTelephonyMgr.listen(new TeleListener(),  
  5.                 PhoneStateListener.LISTEN_CALL_STATE);  
  6. //=============================  
  7.   
  8.     //Add by kylin 2011.11.22 begin  
  9.       
  10.     Handler myHandler = new Handler(){  
  11.         @Override  
  12.         public void handleMessage(Message msg) {  
  13.             // TODO Auto-generated method stub  
  14.             super.handleMessage(msg);  
  15.             if (null != wl) {  
  16.                 wl.release();  
  17.             }  
  18.         }  
  19.           
  20.     };  
  21.     
  22.     Handler myHandler2 = new Handler(){  
  23.         @Override  
  24.         public void handleMessage(Message msg2) {  
  25.             // TODO Auto-generated method stub  
  26.             super.handleMessage(msg2);  
  27.             if (null != wl2) {  
  28.                 wl2.release();  
  29.             }  
  30.         }  
  31.           
  32.     };  
  33.       
  34.     //end  
  35.   
  36. //================================================  
  37.   
  38. class TeleListener extends PhoneStateListener {  
  39.   
  40.         @Override  
  41.         public void onCallStateChanged(int state, String incomingNumber) {  
  42.             super.onCallStateChanged(state, incomingNumber);  
  43.             switch (state) {  
  44.             case TelephonyManager.CALL_STATE_IDLE: {  
  45.                 //Add by kylin 2011.10.21  
  46.                      
  47.                 String getElapsedTimeTemp=mCallCard.getElapsedTime().toString();  
  48.                   
  49.                   
  50.             if(getElapsedTimeTemp!=null && !getElapsedTimeTemp.trim().equals("") && PhoneApp.getInstance().isVTCall()==false){  
  51. //              if(PhoneApp.getInstance().isVTCall()==false){  
  52.                      getToast();  
  53.                     }     
  54.    
  55.                 pm.setBtnBacklight(false);  
  56.       
  57.                 mFlag=false;   
  58.                   
  59.                 mFlag2 = false;  
  60.                     
  61.   
  62.                 //end  
  63.                 break;  
  64.             }  
  65.   
  66.             case TelephonyManager.CALL_STATE_OFFHOOK: {  
  67.                 mFlag=true;  
  68.                 pm.setBtnBacklight(true);  
  69.                   
  70.                 if(!mFlag2){  
  71.                     pm2=(PowerManager) getSystemService(Context.POWER_SERVICE);  
  72.                     wl2 = pm2.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "InCallScreen");  
  73. //                  wl2.setReferenceCounted(false);  
  74.                     wl2.acquire();  
  75.   
  76.                     Message msg2 = new Message();  
  77.                     msg2.what = 200;  
  78.                     myHandler2.sendMessageDelayed(msg2, 5000);    
  79.                     mFlag2 = true;  
  80.                 }  
  81.                   
  82.                 break;  
  83.             }  
  84.   
  85.             case TelephonyManager.CALL_STATE_RINGING: {  
  86.                 pm.setBtnBacklight(true);  
  87.                 break;  
  88.             }  
  89.             default:  
  90.                 break;  
  91.             }  
  92.         }  
  93.   
  94.     }  
  95. //==================================  
  96.   
  97. private void getToast(){  
  98.           
  99.          if(mFlag==true){     
  100.              pm=(PowerManager) getSystemService(Context.POWER_SERVICE);  
  101.              wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "InCallScreen");  
  102.              wl.acquire();  
  103.               
  104.              mFlag=false;     
  105.                
  106.              Message msg = new Message();  
  107.              msg.what = 100;  
  108.              myHandler.sendMessageDelayed(msg, 2000);  
  109.               
  110.             // wl.release();   
  111.          }  
  112.     }