【问题标题】:Disable home button in android toddler app?在android幼儿应用程序中禁用主页按钮?
【发布时间】:2011-05-15 18:42:16
【问题描述】:

我开发了一款图片幻灯片应用程序,当您点击它们时,每张图片都会播放声音。这就像一本 2-4 岁的图画书。

问题是,由于 android 不会让您捕获按下主页按钮并基本上禁用它,所以当父母将手机交给他们的孩子与无人看管的(勇敢的父母)一起玩时,孩子可能会无意中退出应用程序,然后拨打电话或以其他方式调整手机。

目前还有另外两个应用程序对此问题进行了伪修复。这些应用程序是 Toddler Lock 和 ToddlePhone。我已尝试联系这些应用的开发人员以获取一些指导,但他们不愿意透露任何信息,如果可以的话,但是这里有人有什么建议吗?

看起来这两个其他应用都像主屏幕替换应用一样。当您在这些应用程序上启用“儿童保护模式”时,系统会提示用户选择该操作的应用程序,选择是“Launcher、LauncherPro 等”。加上蹒跚学步的应用程序。然后,您必须将幼儿应用程序设为默认值,瞧,手机已“锁定”,只能在“解锁”手机时使用组合键或触摸屏幕的四个角等“解锁”。您的正常主屏幕应用程序默认已恢复。下次启用“儿童保护模式”时,您甚至不必将幼儿应用设为默认应用。

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

有人对如何实施“儿童保护模式”有任何想法吗?

【问题讨论】:

    标签: android replace children android-homebutton


    【解决方案1】:

    我需要让幼儿锁定新应用程序,并且不想使用启动器。 这是我做的,你可以在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" />
    

    【讨论】:

    • 执行此操作要好得多!太棒了!
    • 请你帮我添加覆盖主屏幕几秒钟的顶视图..提前谢谢你。
    • @AmolSawant96Kuli : 你能创建顶视图吗?
    • @Yoah :我能够完成前两个步骤。但是,无法完成顶视图步骤。你能帮我提供一个示例代码吗?
    • @venkat 编辑并添加了一个示例
    【解决方案2】:

    我认为您对主屏幕更换的看法是正确的。我知道幼儿锁不会覆盖主页按钮,因为(至少在我的 LG GW620 上)在幼儿锁中按住主页按钮会调出 ALT-TAB 类型菜单 - 这往往会导致手机崩溃。

    在 android 开发网站上有一个带有源代码的主屏幕替换应用程序:

    http://developer.android.com/resources/samples/Home/index.html

    编辑:还有,ADW.Launcher:

    http://code.google.com/p/adw-launcher-android/

    【讨论】:

    • 所以我想做类似的事情。我已经安装了adw。如何禁用按钮?
    • 在下面查看 yoah 的答案。这是这个问题的最佳解决方案。
    【解决方案3】:
    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;
            }
           }
    

    编辑: 这适用于所有旧版本的android。但在 ICS 和果冻豆中不起作用,并且会让你在应用程序中崩溃

    【讨论】:

    • @sixeightzero 但是没有指定有问题的 android 版本..!我已经编辑了一些澄清的答案
    【解决方案4】:

    我使用以下代码替换了默认主页启动器:

    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);
    

    【讨论】:

      【解决方案5】:

      对于 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>
      

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2011-12-25
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多