14

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

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

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

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

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

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

4

5 回答 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" />
于 2013-05-26T09:59:53.917 回答
5

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

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

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

编辑:另外,ADW.Launcher:

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

于 2010-11-25T15:27:49.073 回答
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 和果冻豆中不起作用,并且会让你在应用程序中崩溃

于 2012-05-07T07:10:14.143 回答
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);
于 2012-05-07T09:42:30.093 回答
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>
于 2015-07-01T17:41:24.747 回答