【问题标题】:Creating custom LockScreen in android [closed]在android中创建自定义LockScreen [关闭]
【发布时间】:2014-03-25 20:41:04
【问题描述】:

我正在开发自定义锁屏应用程序。它在 4.0 以下但在 4.0 以上工作正常,当我们按下主页按钮时,应用程序停止。有没有解决方案,当按下主页按钮直到解锁屏幕时,没有应用程序会停止。(如去储物柜应用程序)

【问题讨论】:

  • 抱歉,无法回答您的问题,但我很好奇您是如何制作自定义锁屏的,还没有找到任何制作教程,只有制作自定义启动器^^ 有什么建议吗?跨度>
  • @nunoh123 那么如何开发像 go locker 这样的自定义启动器..
  • @nunoh123 这是我设计锁屏的链接stackoverflow.com/questions/16911049/…

标签: android lockscreen


【解决方案1】:

另一种开发 LockScreen 应用的方法是使用 Views,让我解释一下。

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

((KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock("IN").disableKeyguard();

你应该把这行代码放在你的Service中。

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

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 作为TYPE_SYSTEM_ERROR,因此将在所有内容之上。而且由于您可以控制何时删除此视图,因此最好的位置是在您的Activity 中的onDestroy,因为按下HOME 按钮只会暂停您的活动,而视图仍将可见。

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" />

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

【讨论】:

  • 感谢 Miguel,但它不完整,首先,最重要的是,你没有提到如何处理主页按钮旁边的方形按钮(我称之为以前的应用程序按钮),确实是最糟糕的问题,因为它的意图已经从 android 5.0 改变并且与 andoird 4x 不同,你也检查过你在 android 5 上的主页按钮的解决方案吗?它在那里工作吗?
  • @ErfanMowlaei 它在 Android 5.1 上完美运行,我测试过了。
  • @prince 所以它处理 AppSwitch 按钮?我的意思是主页按钮旁边的方形按钮。
  • @ErfanMowlaei 是的,它正在处理按钮。上面发布的代码不会阻止任何按钮执行其工作,但窗口位于所有操作之上,因此永远不会感觉到操作。例如,方形按钮会显示所有最近使用的应用程序,如果我们单击窗口背面的那个按钮会显示最近的应用程序,但我们无法对其执行任何操作。
  • @prince 好吧,这是一件坏事,锁屏应该完全阻止该键以防止显示最近的应用程序。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我认为首先你应该问自己是否真的想劫持 home 键。有时你可能想要它。但我认为将应用程序放在 Android 锁屏上,让 Home 键正常运行并让底层的 Android 锁屏处理密码保护设备是你在很多情况下真正想要的(除非你想更改默认情况下这样做)。
        最重要的是,让应用程序显示在 Android 锁定屏幕上非常接近于编写您自己的自定义锁定屏幕。而且绝对更容易,因为您不必自己管理密码。更不用说它更安全、更可靠,因为您不会劫持主页密钥。
        我这样做了,效果很好。您可以在此处查看详细信息:

        show web site on Android lock screen

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

        https://play.google.com/store/apps/details?id=com.a50webs.intelnav.worldtime

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-23
          • 2017-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多