A toddler-safe app on later versions of Android
Asked Answered
D

2

6

I have an app, that should be toddler safe. Meaning that, it blocks any single key touch, yet handles long pressing for exiting the app.

This is so that, the toddler will be safe from doing (too) nasty things while playing.

Up to version 2.3.4 (Gingerbread), I succeeded in achieving this. However, now I have two problems:

  1. On Android 3 (Honeycomb), I have the status bar notifications which can be pressed on. Also, I have the switch-windows key which can be pressed. The only thing I succeeded with it is to dim the status bar.

  2. On Android 4.0 (Ice Cream Sandwich) (using the emulator, I still don't have a real device with this version), when calling the next code, I get an exception which cannot even be caught.

The exception:

java.lang.IllegalArgumentException: Window type can not be changed after the window is added.

The code:

@Override
public void onAttachedToWindow()
{
  this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
  super.onAttachedToWindow();
}

What can I do?

Dewdrop answered 9/11, 2011 at 22:51 Comment(7)
How are you blocking the presses to the home key?Probable
@Probable have you tried what i've just written? it is written in the activity class.Dewdrop
@androiddeveloper i am also getting same error in my application and i am also using same onAttachedTowindow() code... how did you solved this problem?Pellegrino
there is a way to block the home key which is very problematic (since it requires your code to be totally bug free, and since it breaks the idea of home key as a panic button ) . it is being enforced in some apps such as the widgetLocker app.Dewdrop
the safer way would be to make the app also a launcher .Dewdrop
@androiddeveloper please see #12560680Pellegrino
it seems the blocking mechanism used on widgetLocker and other locker apps don't work anymore . perhaps google has patched the OS so it can't work .Dewdrop
D
2

For Android version 4 (API 14 and up), it might be possible to use:

getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

However, on the emulator, it doesn't block the home button, so it's kinda useless.

I still don't know if it works fine on real devices.

Maybe it's possible to use the following workaround: Set the app as the default home screen app. If the home button was pressed while the application was active, capture it and do nothing. If the home button was pressed while the application was on the background (or closed), open the previously selected default home app.

Alternatively, I could ask the user to set the default home launcher app as mine for each time it is started, and reset it again (either to the previous one, or total reset) after it is closed.

Is it possible? If so, how?


Since Android 5.0 (Lollipop) (version 5.0 which is API 21), there is a way of screen-pinning, and this can be turned on by the user or the app (link here):

There are two ways to activate screen pinning:

Manually: Users can enable screen pinning in Settings > Security > Screen Pinning, and select the tasks they want to pin by touching the green pin icon in the recents screen. Programmatically: To activate screen pinning programmatically, call startLockTask() from your app. If the requesting app is not a device owner, the user is prompted for confirmation. A device owner app can call the setLockTaskPackages() method to enable apps to be pinnable without the user confirmation step.

What does it do? Read further and see:

When task locking is active, the following behavior happens:

The status bar is blank, and user notifications and status information are hidden. The Home and Recent Apps buttons are hidden. Other apps cannot launch new activities. The current app can start new activities, as long as doing so does not create new tasks. When screen pinning is invoked by a device owner, the user remains locked to your app until the app calls stopLockTask(). If screen pinning is activity by another app that is not a device owner or by the user directly, the user can exit by holding both the Back and Recent buttons.

Not only that, but according to this post, you can also toggle this without user-confirmation, and exiting this special state would be under your app's logic.

It seems like the perfect thing for toddler safe app.

Dewdrop answered 14/1, 2012 at 12:5 Comment(0)
G
1

For me below code is hiding the home button in Android 4.0 (Ice Cream Sandwich) (version 4.4.4)

public void onCreate(Bundle savedInstanceState) {

    this.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION);
    super.onAttachedToWindow();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
Gascony answered 13/3, 2015 at 21:6 Comment(1)
How did you find this solution?Dewdrop

© 2022 - 2024 — McMap. All rights reserved.