----------汗,居然不能贴图片。为了方便大家看,贴在了自己的博客上:http://goo.gl/KNw7  ---------------我想要做个demo,大概的效果类似于WaveSecure这个软件。它拿到了ADC2的全球所有类别的第三名,是个安全软件。现在我在做锁定屏幕这个功能时遇到了问题,一直无法解决,所以我想知道WaveSecure它是大概如何实现功能的? 我拿自己的S60系统测试了下,大概效果如下图:http://goo.gl/XlPP当手机被远程锁定以后,要在客户端解锁,用户必须输入特定的密码。(这个时候,键盘还是可以用的,因此它并没有拿SCREEN_BRIGHT_WAKE_LOCK 因为这样Keyboard就直接不能用了。)所以,我觉得WaveSecure肯定是用某种方法替换了系统自带的锁屏功能。我搜索了很久,唯一的发现就是两个可能有用的包:android.app.KeyguardManager
android.os.PowerManager但是我阅读了相关Android Docs后,还是没啥突破。很觉得KeyguardManager是解决这个问题的关键,但是我只能实现disableKeyguard,而无法自定义一个新的Keyguard,难道直接继承KeyguardManager这个类?重写里面的方法?关于WaveSecure是如何实现它的锁屏功能的,你有什么idea吗?thx:)

解决方案 »

  1.   

    App分别调disableKeyguard(), reenableKeyguard()来解锁,加锁
      

  2.   

    要拦截键盘、屏幕输入,重新绘制Screen Lock界面,貌似只有修改frameworks,重新编译整个Android了,因为在Application层做不到这些。
      

  3.   


    WaveSecure它是直接提供apk文件安装的,并不需要重新编译内核。
    我现在觉得它使用全屏的Activity来一直控制屏幕,并且只有当输对密码时才让你进入正常界面。你觉得呢?
      

  4.   

    能不能通过全屏的Activity来变相地实现这个功能?
      

  5.   

    把你的window的WindowManager.LayoutParams.type设置为WindowManager.LayoutParams.TYPE_KEYGUARD。这样key和pointer都会给你。我没有实际做过,但是TYPE_KEYGUARD肯定应该是必须的。
      

  6.   


    thx:) 今天晚上实践下。
      

  7.   


    是说我的哪种方法?这几天都在搞GAE服务端,都忘了这边发的这个帖子了-_-!
      

  8.   


    能否再解释下pointer(指针)是啥意思?
    key应该是获取键盘码的意思吧。
      

  9.   

    sorry,让你误会了,pointer是MotionEvent,就如PC上的鼠标事件,key是KeyEvent,认为就是键盘码的意思吧。
      

  10.   


    我现在就是KEYCODE_HOME禁用有问题,不知道怎么解决了?能私信一下,给个邮箱我吗?
      

  11.   

    你设置了TYPE_KEYGUARD,home键就会给你
    就在这里说吧,人多力量大
      

  12.   


    我用了的啊,但是没有效果,是我写的不对吗?    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setFlags( WindowManager.LayoutParams.TYPE_KEYGUARD, WindowManager.LayoutParams.TYPE_KEYGUARD); 
            setContentView(R.layout.main);
        }    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_HOME){
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
      

  13.   

    是setType不是setFlags
    另外TYPE_KEYGUARD肯定不是随便设的,需要什么permission你自己找找吧。
      

  14.   


    嗯,谢谢指出setType。但还是没用哦,尝试了好多权限。我用Log.v()记录了一下,KEYCODE_HOME和KEYCODE_ENDCALL始终就是捕捉不到的,google的人说做了特别的处理。但是,又想不通的是google为啥要搞个TYPE_KEYGUARD这样一个类型码。难道是要求你把系统默认的KEYGUARD给disable掉,建自己的?
    因为我看WaveSecure里面有这样一个权限:android.permission.DISABLE_KEYGUARD。
    它的所有权限可看这里:http://cn.androlib.com/android.application.com-wsandroid-qwBq.aspx兄台,这边有篇很不错的文章:http://kb.cnblogs.com/a/1629435/ 我觉得对解决这个问题会有用。但是我看不大懂,这几天还得搞python服务端,先把简单的搞定。不知道你看了之后是否有啥好的idea?不甚感激!
    a confused student:(
      

  15.   

    修改Framework的办法是可行的,不过我也想和楼主一样,想知道怎么做到不修改framework,就能控制锁屏,这个囧大了,我最近也在着急想知道。BTW:修改FrameWork的办法是,流程是
    SystemServer->
    WindowManagerService->
    Policy.java->
    PhoneWindowManager->
    KeyguardViewMediator->
    KeyguardViewManager->
    LockPatternKeyguardView.java
    最终跟踪到这个类的话,是可以修改的,不过我是还没修改过看过,真要实际试了才知道。
      

  16.   

    昨天刚用ddms跟踪从keyguard,今天就看到这个贴,人品好啊。借宝地问一下,怎么调用disableKeyguard来给屏幕解锁啊?我主要是想黑屏的时候能够通过某个程序触发自动亮屏解锁。
      

  17.   

    在写程序时,需要捕获KEYCODE_HOME、KEYCODE_ENDCALL、KEYCODE_POWER这几个按键,但是这几个按键系统做了特殊处理,在进行dispatch之前做了一些操作,HOME除了Keygaurd之外,不分发给任何其他APP;ENDCALL 和POWER也类似,所以需要我们 在系统处理之前 进行处理。
      

  18.   

    自己定义一个FLAG,在自己的程序中添加此FLAG,然后在 WindowManagerServices.java中获取当前窗口的FLAG属性,
    哪位知道flag怎么在定义
      

  19.   

    楼主是不是想加入一个登陆的窗口?可以在launcher里添加。
      

  20.   

    针对Home键,可否在监听new activity时判断如果是launcher,则把launcher干掉呢?
      

  21.   

    public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

    super.onAttachedToWindow();
    }
    可屏蔽HOME键