应用层用不了这个dismiss的方法,因为就根本没有IWindowManager.。
IWindowManager的方法dismissKeyguard,不同版本参数不一样, o版本是一个参数void dismissKeyguard(IKeyguardDismissCallback callback);。,P,S上是两个参数void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message);
可以写成wm.dismissKeyguard(null,null);
不管是KeyguardManager.KeyguardLock kl的kl.disableKeyguard();
两者都只能解锁滑动解锁,如果设置了图案密码照样不可以解锁,但等于说只是给了个上滑的操作
这边是在BatterService里面执行
wm = IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SER
一定要在方法体里面用,不然没效果的,但至少不会服务崩溃,至少能开机。如果是用keyguard的disable或reenable就必须放在方法体里面,不然服务崩溃,开机不了。
+import android.os.PowerManager;
+import android.view.IWindowManager;
private PowerManager pm;
+ private PowerManager.WakeLock wl;
+ private IWindowManager wm;
pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,"bright");
public void wakeAndUnlock(Context context){
+ android.util.Log.i("yantao","wake unlock");
wm = IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
+
+ try {
+ wm.dismissKeyguard(null);
+ } catch (Exception e) {
+
+ }
wl.acquire();
+ wl.release();
+ }
比如就要发com.action.unlockbright这个广播。
override/frameworks/base/services/core/java/com/android/server/BatteryService.java
一般在这个电池服务里面进行接受,这个apk应该已经静态注册过广播了,并且这个apk应该是后台无法消除的,但是在这服务里面public final class BatteryService extends SystemService {还是动态注册一个
IntentFilter filter = new IntentFilter();
filter.addAction("com.action.unlockbright");
filter.addAction(Intent.ACTION_SCREEN_OFF); //黑屏再把锁恢复
mContext.registerReceiver(mReceiver, filter);
然后接收(到这一步就可以了)
BroadcastReceiver mReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
else if(action.equals("com.action.unlockbright")){
+ wakeAndUnlock(context);
/*/下面的不需要了,下面的这个解锁方法不推荐,会永久消除锁
else if(action.equals(Intent.ACTION_SCREEN_OFF)){
+ kl.reenableKeyguard();
下面这个不搭噶
现在最前面把初变量定义好,别放在方法内定义,这样就全局了,主要是解锁,亮屏无所谓,解锁需要相同的context才可以恢复。
private KeyguardManager km;
+ private KeyguardManager.KeyguardLock kl;
km = (KeyguardManager) mContext.getSystemService(mContext.KEYGUARD_SERVICE); kl=km.newKeyguardLock("unlock");
。以下是错误的!但是在activity可以用,service里面会导致服务崩溃,可能KEYGUARD_SERVICE比较轻量,而POWER_SERVICE与battery服务本身就冲突,无法在服务构造方法中获取服务实例。而且先禁止锁屏后恢复本来就不是最优解,就只是让它暂时解锁。服务里面的全局对象就不能太耗时,亮屏的服务Context.POWER_SERVICE还好可以放全局,当然也可以放方法体,像这个Context.WINDOW_SERVICE,和Context.KEYGUARD_SERVICE就不行,这对象需要去解锁了,这是我的理解。主要是这个方法题如下
public void wakeAndUnlock(Context context){
kl.disableKeyguard();
PowerManager pm= (PowerManager) context.getSystemService(context.POWER_SERVICE);
PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,"bright");
wl.acquire();
wl.release();
别忘了导包+import android.app.KeyguardManager; 这个是屏锁管理器
+import android.os.PowerManager; 这个是电源管理器对象
kl.disableKeyguard();解锁 wl.acquire(); 亮屏。wl.release(); 这个需要释放空间
先获取屏锁管理器管理km,然后用这个km去获取具体的锁屏能力kl,最后用kl解锁
同理下面的电源管理器也是的,不同的是最后要释放空间。
但是这个就是 kl.disableKeyguard();是一直禁止锁屏,就是写了之后彻底解除锁屏,必须得kl.reenableKeyguard();,但是这里面就必须用到同一个context, km = (KeyguardManager) context.getSystemService(context.KEYGUARD_SERVICE);这里面的。但是广播每次在接收时,都会重新进这个Broadreceiver这类。,如果没有kl.disableKeyguard();,那么再使用kl.reenableKeyguard();,也会无效。