在安卓幼儿应用中禁用主页按钮?

14

我开发了一个应用程序,它是一组图片的幻灯片展示,并且每次轻触图片都会播放声音。这就像是2-4岁儿童的图画书。

问题在于,由于Android不允许您捕获Home按钮按下事件并禁用它,因此当父母将手机交给他们的孩子独自玩耍时(勇敢的父母),孩子可能会意外退出应用程序,然后打电话或以其他方式修改手机。

目前有两个应用程序可以解决这个问题。这些应用程序分别是Toddler Lock和ToddlePhone。我已经尝试联系这些应用程序的开发者以寻求帮助,但他们没有愿意透露任何东西,这是可以理解的,但这里是否有人有建议呢?

看起来这两个应用程序都像是一个主屏幕替换应用程序。当您在这些应用程序上启用“儿童安全模式”时,用户会被提示选择一个操作的应用程序,而可选项包括“Launcher”,“LauncherPro”等,以及儿童应用程序。然后,您必须将儿童应用程序设置为默认值,然后您的手机就会被“锁定”,只能使用键盘组合或轻触屏幕四个角之类的方式来“解锁”。当您“解锁”手机时,将还原正常的主屏幕应用程序。下一次启用“儿童安全模式”时甚至不需要再次将儿童应用程序设置为默认值。

我已经了解到这两个应用程序在三星手机上存在问题,并且可能会导致无限的崩溃和重启循环,需要进行出厂设置才能修复。显然,这不是解决问题的理想方法,但目前看来这是唯一的可用方法。

是否有人有关于如何实现"childproof mode"的任何想法?

5个回答

17

我需要在一个新应用程序中使用儿童锁,而且不想使用启动器。以下是我所做的,您可以在https://play.google.com/store/apps/details?id=com.justforkids.animalsounds上查看该应用程序。

  1. 当锁定被激活时,启动一个服务,并在锁定被取消时停止服务。
  2. 该服务检查顶部运行的应用程序,如果不是我的活动,则启动我的活动。
  3. 仍然存在一个问题,即当用户点击“主屏幕”时,需要大约6秒钟才能再次启动我的活动。我认为这是Android中的安全功能,但不确定。为了绕过这个问题,当服务检测到另一个应用程序可见时,它添加一个顶部视图(作为警报窗口),覆盖主屏幕几秒钟,直到应用程序重新启动。

有关步骤3的更多详细信息:

创建覆盖布局,例如文件locked_overlay.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#d0000000"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="12dp"
        android:text="@string/app_name"
        android:textColor="#fff"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Locked mode is on"
        android:textColor="#fff"
        android:textSize="18sp" />

    </LinearLayout>

</FrameLayout>

使用以下代码来显示或隐藏覆盖层:

  private View lockedOverlay = null;

  private void hideLockedOverlay() {
    if (lockedOverlay != null) {
      WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
      windowManager.removeView(lockedOverlay);
      lockedOverlay = null;
    }
  }

  private void showLockedOverlay() {
    if (lockedOverlay != null) {
      return;
    }

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams viewLayoutParams = new WindowManager.LayoutParams(
    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
        PixelFormat.TRANSLUCENT);
    viewLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;

    LayoutInflater inflater = LayoutInflater.from(this);
    lockedOverlay = inflater.inflate(R.layout.locked_overlay, null);
    windowManager.addView(lockedOverlay, viewLayoutParams);
  }

您需要获得许可。

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

执行这个的方法好多了!太棒了! - AutoM8R
请问您能帮我添加一个顶部视图,覆盖主屏幕几秒钟吗?非常感谢您的帮助。 - Amol Sawant
@AmolSawant96Kuli:你能创建顶视图吗? - venkat
@Yoah:我能完成前两个步骤,但是无法完成顶视图步骤。你能给我提供一个示例代码吗? - venkat
太棒了!你让我的一天变得美好 :) ,不过,有一个丑陋的想法是用虚拟启动器覆盖主屏幕启动器,当用户选择主屏幕时,您可以检查它是否在锁屏状态下,如果是,则忽略它!否则打开默认用户喜欢的启动器并关闭虚拟启动器。 - M_AWADI
显示剩余2条评论

5

1
所以我想做类似的事情。我已经安装了ADW。我该如何禁用这些按钮? - Darren Cato
请查看下面yoah的答案。这是这个问题的最佳解决方案。 - venkat

2
Add in to your Main Activity
@Override 
    public void onAttachedToWindow()
    {  
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
        super.onAttachedToWindow();  
    }

And Override Key down event

@Override 
    public boolean onKeyDown(int iKeyCode, KeyEvent event)
    {

        if(iKeyCode == KeyEvent.KEYCODE_BACK || iKeyCode == KeyEvent.KEYCODE_HOME) 
        {
            return true;
        }
       }

编辑: 这在所有老版本的安卓系统中都有效。但在ICS和Jelly Bean中将无法使用,并会导致应用程序崩溃。


@sixeightzero 但是SO没有在问题中指定Android版本..!我已经编辑了答案以进行一些澄清。 - Jeegar Patel

1

对于4.0及以上版本,您可以避免Android的安全限制并将您的应用设置为启动器。将以下内容添加到您的清单文件中:

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

 <activity
    android:launchMode="singleInstance"
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.HOME" />
    </intent-filter>
</activity>

0
我使用以下代码替换了默认的主屏幕启动器:
Intent selector = new Intent("android.intent.action.MAIN");
selector.addCategory("android.intent.category.HOME");
selector.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity"));
startActivity(selector);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接