以编程方式禁用棒棒糖中的主页按钮

时间:2015-11-06 11:47:38

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

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

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

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

虽然我的应用程序是自动阻止主页按钮功能,但它并没有解决。

我的问题是:

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

如果信息亭是技术,那么如何使它适合我的要求? (寻找指南)

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

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

您可以找到api信息here

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