【问题标题】:disable home button in lollipop programmatically以编程方式禁用棒棒糖中的主页按钮
【发布时间】:2016-02-07 13:28:06
【问题描述】:

我想在打开我的应用程序后自动禁用主页和电源按钮,并在点击应用程序中的退出按钮后启用它们。

我通过将我的应用程序作为启动器应用程序实现了这一点,并且它一直工作到 Jellybean(测试到 4.1.2)。

但同样的应用程序在 KitKat 和 Lollipop 版本中无法使用。 我认为使用信息亭技术来禁用 Lollipop 中的主页按钮。 参考https://sdgsystems.com/blog/implementing-kiosk-mode-android-part-3-android-lollipop, 它需要一个设备所有者应用程序和几个步骤来实现它。

虽然我的应用程序是自动屏蔽home键功能,但还是不行。

我的问题是:

  • 是否有任何进程可以禁用棒棒糖中的主页按钮?
  • 如何以编程方式实现?

如果信息亭是技术,那么如何使其适合我的要求? (求攻略)

【问题讨论】:

  • 启动器应用方法不起作用?当您按下主页按钮时,android会调用启动器来显示,那不应该改变
  • 你确定,启动器方法在棒棒糖中有效吗?
  • 您确定已将您的应用设置为默认启动器吗?
  • 是的,我什至尝试过使用 homekeylocker。这一切都很好,直到果冻豆。

标签: android android-5.0-lollipop kiosk-mode


【解决方案1】:

首先抱歉迟到的答案。首先是程序员真的没有阻止主页按钮。他们仅使用技巧将主页按钮进程隐藏在锁定屏幕后面。

你怎么能做到这一点。?简单的。只需将锁定屏幕窗口用作窗口管理器屏幕,这就是为什么按下主页后您的移动屏幕不会最小化的原因。这是大多数成功锁定应用程序中使用的小技巧。

还有一件事是如何重叠手机窗口顶部的系统状态栏。

为此,您可以像这样使用代码,并且可以根据需要进行修改。

    manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));

localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;    

localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|

//WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR |
  WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN |

       // this is to enable the notification to recieve touch events
       //WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN |
        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
       // Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;


//localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (50 *      getResources().getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;

view = new customViewGroup(this);

manager.addView(view, localLayoutParams);   

并像这样创建 customeVIewGroup 类..

public class customViewGroup extends ViewGroup {

    public customViewGroup(Context context) {
        super(context);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v("customViewGroup", "**********Intercepted");
        return true;
    }
}

【讨论】:

    【解决方案2】:

    这是我建议的流程。创建一个设备所有者应用程序并通过 NFC bump 或 adb 获取设备所有权。将您的包名称添加到设备所有者应用中的 setLockTaskPackage()。

    现在,在您要锁定设备的应用程序中,调用 startLockTask() 方法,您的设备将被锁定到此特定应用程序,直到您调用 stopLockTask()。

    可以找到api信息here

    关于如何创建设备所有者应用程序和指南,您可以参考Florent Dupont的网站。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多