Androidのキオスクモード


114

現在、CF .NETエンタープライズアプリケーションを移植してAndroidデバイスで実行できるかどうか、およびその方法を評価しています。Windows Mobileフォンのアプリケーションはキオスクモードで実行され、アプリケーションは起動後に全画面モードで自動起動し、ユーザーは誤ってまたは意図的に電話の他の部分にアクセスできません。

Androidでは、起動後に1つのアプリケーションのみを自動起動して、ユーザーが誤って(または喜んで)Androidデバイスの他の部分にアクセスするのを防ぐことはできますか?


あなたはあなたの問題を解決しますか?
Menna-Allah Sami

3
はい、可能です。:私はこれについて(非常に)長いブログ記事作成andreas-schrade.de/2015/02/16/...
funcoder

Lollipopを使用してこれについて(部分的に)ブログ投稿も作成しました。ただし、ブートレシーバーの部分は除きます。sureshjoshi.com
mobile

ロックダウンされた使い捨てデバイスを作成するさまざまな方法について、ここで同様の質問に回答しました:stackoverflow.com/a/43644803/2888763
Trevor Halvorson

回答:


29

android.intent.action.BOOT_COMPLETEDBroadcastReceiverでインテントをリッスンし、そこからアクティビティを開始することで、起動時にアプリケーションを自動起動できます。アクティビティでは、新しいデフォルトのホーム画面[1]として自分を登録し、キーを処理できます。

フレームワークを変更せずに処理できないインスタンスがあると思います(Homeを長押しして現在アクティブなアプリケーションを表示するなど)。

しかし、十分なプロトタイプの場合。

楽しくいじりましょう!

[1]:

<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

1
また、あなたはあなたがランチャーに戻るボタンを押したときに最初のelse acitivtyのonbackpressedオーバーライドする必要が
ademar111190

システムダイアログn通知バーをコードで無効にする方法
Gnanam R 2013

1
@GnanamR:で私の答えを確認してください:stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumarアプリを全画面モードで実行します。
John61590 2014年

17

これをカスタマイズして(メニューへのアクセスを無効にし、アプリケーションの追加を制限するなど)、キオスクを有効にすることができます。http://code.google.com/p/android-launcher-plus/


7
なぜこれが反対投票されたのか知っていますか?私は、Androidランチャープラスの上で編集および開発することにより、本格的な、現在展開されているAndroidキオスクアプリを作成しました。
rbot

1
その場合、私はあなたの答えとあなたのコメントの両方に
賛成票を投じ

@rbotどうやってやったの?私は何年にもわたってキオスクアプリケーションを構築しようとしていましたが、通知トレイが開かないことを確認することを除いて、他のほとんどすべてを解決しました。
Wakka02 2013

1
@ Wakka02 onwindowchangedまたは同様のイベント(通知トレイが開いている可能性があります)を探してトレイを閉じていたと思います。私はずっと前にそれをしたので、詳細を覚えていません。
RBOT

@ Wakka02:私の答えを確認してください:stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

17

新しいAndroid Lプレビューで、Google はまさにそれを行うタスクロックを発表しました。ただし、rootが必要なようです。

L Developer Previewには、ユーザーがアプリを離れたり、通知によって中断されたりすることを一時的に制限できる新しいタスクロックAPIが導入されています。これは、たとえば、Androidでハイステークスアセスメントの要件をサポートする教育アプリを開発している場合に使用できます。アプリがこのモードをアクティブにすると、アプリがモードを終了するまで、ユーザーは通知を表示したり、他のアプリにアクセスしたり、ホーム画面に戻ったりすることができなくなります。

不正使用を防ぐために、許可されたアプリのみがタスクロックをアクティブ化できます。さらに、タスクロックの承認は、特別に構成されたデバイス所有者アプリによって、android.app.admin.DevicePolicyManager.setLockTaskComponents()メソッドを通じて付与される必要があります 。

デバイスの所有者を設定するには、次の手順に従います。

  • Android userdebugビルドを実行しているデバイスを開発マシンに接続します。
  • デバイス所有者アプリをインストールします。
  • device_owner.xmlファイルを作成/data/systemし、デバイス上のディレクトリに保存します。
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

アプリでタスクロックAPIを使用する前に、DevicePolicyManager.isLockTaskPermitted()を呼び出してアクティビティが承認されていることを確認してください。

タスクのロックを有効にするにandroid.app.Activity.startLockTask() は、許可されたアクティビティから呼び出します。

タスクロックがアクティブな場合、次の動作が有効になります。

  • ステータスバーは空白で、ユーザー通知とステータス情報は非表示になっています。
  • [ホーム]ボタンと[最近のアプリ]ボタンは非表示になっています。
  • 他のアプリは新しいアクティビティを起動しない場合があります。
  • 現在のアプリは、新しいタスクを作成しない限り、新しいアクティビティを開始できます。
  • 承認されたアクティビティが呼び出されるまで、ユーザーはアプリにロックされたままです Activity.stopLockTask()

3
developer.android.com/guide/topics/admin/device-admin.html-デバイス管理アプリのデプロイについて。
Toshe 14

2
ここでは、完全なセットアップとタスクのロックについての私の記事は、そのアルゴリズムpvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

これをしばらく検索した後、私は良い解決策を思いつきました。これはルート化されたデバイスでのみ機能しますが、これがこの1つのアプリのためだけである場合、ルート化は問題になりません。

  • 追加して、アプリケーションをランチャーにします

    <category android:name="android.intent.category.HOME" /> 

    あなたのインテントフィルターに

  • アプリがツールバーを折りたたんで、通知バーに到達できないことを確認してください。プログラムでAndroidのステータスバー/通知バーを無効にする方法を参照してくださいまたはhttp://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/

  • 次に、他のプログラムが誤って開かないようにするには、アクセシビリティサービスを使用してウィンドウの状態が変化したかどうかを確認し、パッケージをホワイトリストまたはブラックリストと比較して、ActivityManager.killBackgroundProcessesを使用して実行しない場合は強制終了します。

また、別の方法については、http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/も確認してください。


5

起動時にアプリを起動する

これを達成する最良の方法は、アプリをランチャーとして設定することです

<activity ...
  android:launchMode="singleInstance"
  android:windowActionBar="false">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.HOME" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

アプリをロックする

最も信頼できる方法は、Lollipop以上のデバイスを使用して、

startLockTask

まず、アプリをデバイスの所有者として設定する必要があります。注:デバイスはプロビジョニングを解除する必要があります。デバイスを登録した場合は、出荷時設定にリセットして、アカウント登録をスキップする必要があります。

アプリを登録できるようにするには、まずDeviceAdminReceiverコンポーネントをセットアップする必要があります。

package com.example.myapp;

public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "are you sure?";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        // here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
    }
}

プロビジョニングされていないデバイスを取得したら、adbから次のコマンドを起動できます(ルートは不要です

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

androidがアプリを固定するためのユーザー権限を要求しないようにするには、setLockTaskPackagesを呼び出す必要があります

最後に!

@Override
public void onResume(){
    super.onResume();
    DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
    mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
    startLockTask();
}
@Override
public void finish(){
    stopLockTask();
    super.finish();
}



2

このフォーラム投稿で別の可能なテクニックを見つけました。その投稿を引用:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

次の方法を使用して、「通常の」ユーザーがアプリケーション以外のもので遊ぶのを防ぐアプリケーションを構築できます。

アプリケーションは2つのモジュールで構成されています。主な活動とサービス。サービスは、起動時に開始するように構成されています。サービスが開始されると、アクティビティが実行されているかどうかがチェックされます。実行されていない場合は、タイマーを使用してメインアクティビティを開始します。

アクティビティが一時停止すると、サービスが1秒で開始するようにスケジュールされます。コード:

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

ユーザーがホーム画面を押すと、ホーム画面が数秒間表示されます。ただし、アプリケーションは数秒後に前面に戻り、ユーザーは他のアプリケーションと対話したり、設定を変更したりできなくなります。

サービスはフォアグラウンドサービスに設定されています。これにより、Androidによるサービスの強制終了が防止されます。停止ボタンを押して、キオスクモードを無効にします。

あるように見えるダウンロードすることができますたとえば、キオスクモードのコードのZIPファイルも。


2

Xposedフレームワークはこれを行うことができます。ルートが必要であり、すべてのプラットフォームで機能しない可能性があります。クラスandroid.app.StatusBarManagerdisable()メソッドを探します。

ここAndroidのソースコードで

独自のモジュールを作成する方法については、こちらをご覧ください: Xposed開発チュートリアル

一見想像するよりはるかに簡単です。幸運を!


これを行うと思われるXposedモジュールはありますか?
Firelord、2015

0

アプリケーションをBOOTレシーバーでセットアップし、ステータスバーの拡張を防ぐためのこの回答に加えて、このソリューションは4.4以上で完全なキオスクアプリとして機能します。

onCreate()に配置します。

    final View view = (View) findViewById(android.R.id.content);
    if (view != null) {
        //"hides" back, home and return button on screen. 
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                   View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                   View.SYSTEM_UI_FLAG_FULLSCREEN);
        view.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        // Note that system bars will only be "visible" if none of the
                        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                    View.SYSTEM_UI_FLAG_FULLSCREEN);
                        }
                    }
                });
    }

これにより、戻るボタン、アプリ、ホームボタンが完全に非表示になります。


通知バーはどうですか?
エルシャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.