在Android幼儿园应用中禁用主页按钮?

时间:2010-11-25 15:20:07

标签: android replace children android-homebutton

我开发的应用程序是一个幻灯片放映的图片,当你点击它们时每个都播放声音。这就像2-4岁的图画书。

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

目前还有其他两个应用程序针对此问题进行了psuedo修复。这些应用程序是Toddler Lock和ToddlePhone。我曾尝试联系这些应用程序的开发人员以获取一些指导,但他们并不愿意透露任何内容,如果没有问题,但是这里有人有任何建议吗?

看起来这两个应用程序都像主屏幕替换应用程序。当您在这些应用程序上启用“儿童防护模式”时,系统会提示用户选择和应用该操作,选项为“Launcher,LauncherPro等”。再加上幼儿应用。然后你必须使幼儿应用程序成为默认设置,然后手机被“锁定”,只能在你“解锁”手机时使用按键组合或触摸屏幕的四个角等“解锁”。您正常的主屏幕应用程序默认恢复。下次启用“儿童防护模式”时,您甚至不必将幼儿应用程序设为默认应用程序。

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

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

5 个答案:

答案 0 :(得分:17)

我需要在新的应用程序中使用幼儿锁,并且不想使用启动器。 这是我做的,您可以在https://play.google.com/store/apps/details?id=com.justforkids.animalsounds

看到该应用
  1. 激活锁定时,启动服务,并在取消锁定时停止服务
  2. 该服务会检查最常运行的应用,如果不是我的活动,则该服务会启动我的活动
  3. 还有一个问题是,当用户点击“主页”时,我的活动再次启动需要大约6秒钟。我认为这是Android中的安全功能,但不确定。为了绕过这一点,当服务检测到另一个应用程序可见时,它会添加一个顶视图(作为警报窗口),覆盖主屏幕,使应用程序重新启动几秒钟。
  4. 对于第3步,更多细节如下:

    创建叠加布局,例如file 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" />
    

答案 1 :(得分:5)

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

在Android开发网站上有一个主屏幕替换应用程序,包含源代码:

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

编辑:同样,ADW.Launcher:

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

答案 2 :(得分:1)

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和果冻豆中工作,并且会让你在app中崩溃

答案 3 :(得分:0)

我使用以下代码替换了Default Home启动程序:

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

答案 4 :(得分:0)

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