Android Toddlerアプリでホームボタンを無効にしますか?
-
28-09-2019 - |
質問
私は開発し、それぞれをタップするときに音を再生する写真のスライドショーであるアプリです。 2〜4歳の絵本のようなものです。
問題は、Androidがホームボタンを押して、本質的に無効にすることができないため、親が子供に電話を渡して無人(勇敢な親)と遊ぶとき、子供は順調にアプリを終了して電話をかけるか、電話をかけることができます。それ以外の場合は、電話を微調整します。
現在、この問題に対してPSUEDOの修正がある他の2つのアプリがあります。アプリは幼児ロックとトッドルフォンです。私はこれらのアプリの開発者にいくつかのガイダンスのために連絡しようとしましたが、彼らは何も開示するつもりはありませんでした。
これらの他のアプリの両方がホーム画面交換アプリのように機能しているようです。これらのアプリで「チャイルドプルーフモード」を有効にすると、ユーザーはアクションのために選択し、アプリを選択するように求められ、選択肢は「ランチャー、ランチャープロなど」です。さらに、幼児アプリ。その後、幼児アプリをデフォルトとvoilaにする必要があります。電話は「ロック」されており、キーの組み合わせを使用して「ロック解除」したり、画面の四隅に触れたりすることができます。通常のホーム画面アプリのデフォルトが復元されました。次回「チャイルドプルーフモード」を有効にしたときに、幼児アプリをデフォルトにする必要さえありません。
これらの2つのアプリにはSamsungの携帯電話に問題があり、修正するために工場出荷時のリセットが必要な無限のクラッシュアンドRestartループを引き起こす可能性があることを読みました。明らかに、これは問題の理想的な解決策ではありませんが、この時点で利用できるのは唯一のもののようです。
「子育てモード」を実装する方法について誰かが何かアイデアを持っていますか?
解決
ホームスクリーンの交換については正しいと思います。私が知っている幼児のロックは、ホームボタンをオーバーライドしません。なぜなら(少なくともLG GW620では)ホームボタンを保持している間、Alt -Tabタイプのメニューが表示されるため、電話がクラッシュする傾向があります。
Android Devサイトには、ソースコードを備えたホームスクリーン交換アプリがあります。
http://developer.android.com/resources/samples/home/index.html
編集:また、adw.launcher:
他のヒント
幼児に新しいアプリをロックする必要があり、ランチャーを使用したくありませんでした。これが私がしたことです、あなたはでアプリを見ることができます https://play.google.com/store/apps/details?id=com.justforkids.animalsounds
- ロックがアクティブになったら、サービスを開始し、ロックが非アクティブ化されたら停止します
- サービスはトップランニングアプリをチェックし、それが私のアクティビティでない場合、サービスは私のアクティビティを起動します
- ユーザーが「ホーム」をクリックすると、アクティビティが再び開始されるまでに約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" />
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やゼリービーンでは機能せず、アプリでクラッシュします
次のコードを使用して、デフォルトのホームランチャーを交換しました。
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以上の場合、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>