2010-11-25 70 views
14

我开发的应用程序是一个幻灯片放映的图片,当您点击它们时,每个图片都会播放声音。它就像一本2-4岁的图画书。禁用android幼儿应用程序的主页按钮?

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

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

它看起来像这些其他应用程序都像一个主屏替换应用程序。当您在这些应用上启用“childproof模式”时,将提示用户选择并应用该操作,并且选项为“Launcher,LauncherPro等”。加上幼儿应用程序。然后,您必须将幼儿应用程序设置为默认设置,并且瞧,当您“解锁”手机时,手机将被“锁定”,并且只能使用组合键或触摸屏幕四角等方式“解锁”。您的正常主屏幕应用默认恢复。下次启用“儿童安全模式”时,您甚至不必将幼儿应用程序设为默认应用程序。

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

有没有人有关于如何实施“防止儿童模式”的任何想法?

回答

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/

+1

所以我想做类似的事情。我已经安装了adw。我如何禁用按钮? – 2011-09-10 19:49:36

+0

查看下面的yoah的答案。这是这个问题的最佳解决方案。 – venkat 2014-07-03 07:23:55

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

编辑: 这适用于所有olde Android版本。但不会在ICS和果冻豆的工作,并给你崩溃的应用程序

+0

将无法​​在4.0.x上工作 – 2012-09-23 03:06:06

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