在android中创建自定义锁屏

在android中创建自定义锁屏,android,lockscreen,Android,Lockscreen,我正在开发自定义锁屏应用程序。它在4.0以下运行良好,但在4.0以上,当我们按下home按钮时,应用程序停止。是否有解决方案?在解锁屏幕之前,按下home按钮时,任何应用程序都不会停止。(如go locker应用程序)自定义启动器基本上是一个应用程序(你可以让它表现得像网格、列表、实现你自己的拖放等)然后,你只需要将这些行添加到主要活动的意图过滤器中,完成后,安装你的应用程序并按下home按钮,你的应用程序将显示在可用的homescreens列表中 <category android:na

我正在开发自定义锁屏应用程序。它在4.0以下运行良好,但在4.0以上,当我们按下home按钮时,应用程序停止。是否有解决方案?在解锁屏幕之前,按下home按钮时,任何应用程序都不会停止。(如go locker应用程序)

自定义启动器基本上是一个应用程序(你可以让它表现得像网格、列表、实现你自己的拖放等)然后,你只需要将这些行添加到主要活动的意图过滤器中,完成后,安装你的应用程序并按下home按钮,你的应用程序将显示在可用的homescreens列表中

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />


我找不到替换锁屏的方法,而禁用手机锁屏和在自定义启动器中使用活动等黑客行为实际上并没有替换锁屏^^

您可以使用以下方法在android中禁用Home键:

@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
}

开发锁屏应用程序的另一种方法是使用视图,我来解释一下

首先,在某些设备中,您可以通过禁用
键盘保护来“禁用”系统锁定屏幕:

((KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock("IN").disableKeyguard();
您应该将这行代码放在
服务中

之后,您可以在每次屏幕关闭时启动活动:

public class AutoStart extends BroadcastReceiver {

    public void onReceive(Context arg0, Intent arg1) {
        if(arg1.getAction().equals("android.intent.action.SCREEN_OFF")) {
            Intent localIntent = new Intent(arg0, LockScreen.class);
            localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            localIntent.addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
            arg0.startActivity(localIntent);
        }
    }
}
如果您阅读了WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
的文档,它解释了这是一种内部系统错误窗口,可以显示在所有窗口的顶部。在多用户系统中,仅显示在拥有用户的窗口上

因此,现在您有了一个活动,但按下
HOME
按钮将退出该活动

这里是视图出现的地方。您可以从布局资源中膨胀视图,并将其作为
类型系统错误添加到
WindowManager
,因此将处于最重要的位置。由于您可以控制何时删除此视图,因此最好的位置是您的
onDestroy
活动
,因为按
主页
按钮只会暂停您的活动,并且视图仍然可见

public WindowManager winManager;
public RelativeLayout wrapperView;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                PixelFormat.TRANSLUCENT);
        this.winManager = ((WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE));
        this.wrapperView = new RelativeLayout(getBaseContext());
        getWindow().setAttributes(localLayoutParams);
        View.inflate(this, R.layout.lock_screen, this.wrapperView);
        this.winManager.addView(this.wrapperView, localLayoutParams);
}

 public void onDestroy()
    {
        this.winManager.removeView(this.wrapperView);
        this.wrapperView.removeAllViews();
        super.onDestroy();
    }
为了避免显示的通知栏,我添加了标志
FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN
,以使用所有指针事件

不要忘记将这两行添加到清单中:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


从这里开始,你只需要添加锁屏应用程序的逻辑,让用户使用他的智能手机:)

我正在三星Galaxy S4 5.0上开发,对我有效的只是将
getWindow().setFlags(…)
更改为
getWindow().addFlags(…)

我认为首先你应该问问自己,你是否真的想劫持主钥匙。有时候你可能想要它。但我认为,在很多情况下,将应用程序放在安卓锁屏上,让home键正常工作,让底层安卓锁屏负责保护设备的密码才是你真正想要的(除非你想改变默认的方式)。
一句话,让一个应用程序显示在安卓锁屏上与编写自己的自定义锁屏非常接近。而且绝对更容易,因为你不必自己管理密码。更不用说它更安全、更可靠,因为您不会劫持主钥匙。
我就是这样做的,效果很好。您可以在此处查看详细信息:

问题是关于在锁屏上显示网站,因为这是我感兴趣的,但答案更一般,它适用于任何应用程序。 你可以在这里看到Google Play上的一个应用程序,其编写方式如下:


抱歉,我无法回答您的问题,但我很好奇您是如何制作定制锁屏的,还没有找到任何制作指南,只有制作定制启动器的教程^^^有什么建议吗?@nunoh123所以如何开发go locker之类的定制启动器。@nunoh123这里是我设计锁屏的链接,谢谢米格尔,然而,它是不完整的,首先也是最重要的,你没有提到如何处理主页按钮旁边的方形按钮(我称之为以前的应用程序按钮),这确实是最严重的问题,因为它的意图已从android 5.0改变,与安卓4x不同,你也检查过android 5上主页按钮的解决方案吗?它在那里工作吗?@ErfanMowlaei它在Android 5.1上工作得很好,我测试过它。@prince所以它可以处理AppSwitch按钮?我指的是主按钮旁边的方形按钮。@ErfanMowlaei是的,它正按原样操作按钮。上面发布的代码不会阻止任何按钮执行其工作,但窗口位于所有操作之上,因此操作永远不会被感觉到。例如,方形按钮将显示所有最近使用的应用程序,如果我们单击窗口背面的按钮,将显示最近使用的应用程序,但我们无法对其执行任何操作。@prince好吧,这是一件坏事,锁屏应该完全阻止该键,以防止显示最近的应用程序。