客制apk需要发送广播达到解锁并亮屏的功能。

应用层用不了这个dismiss的方法,因为就根本没有IWindowManager.

IWindowManager的方法dismissKeyguard,不同版本参数不一样, o版本是一个参数void dismissKeyguard(IKeyguardDismissCallback callback);。,PS上是两个参数void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message);

可以写成wm.dismissKeyguard(null,null);

不管是KeyguardManager.KeyguardLock klkl.disableKeyguard();

两者都只能解锁滑动解锁,如果设置了图案密码照样不可以解锁,但等于说只是给了个上滑的操作

这边是在BatterService里面执行

wm = IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SER

一定要在方法体里面用,不然没效果的,但至少不会服务崩溃,至少能开机。如果是用keyguarddisablereenable就必须放在方法体里面,不然服务崩溃,开机不了。

+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_SERVICEbattery服务本身就冲突,无法在服务构造方法中获取服务实例。而且先禁止锁屏后恢复本来就不是最优解,就只是让它暂时解锁。服务里面的全局对象就不能太耗时,亮屏的服务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();,也会无效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Youth King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值