web-dev-qa-db-ja.com

Androidのキオスクモード

CF .NETエンタープライズアプリケーションを移植して、Androidデバイスで実行できるかどうか、およびどのように実行できるかを評価しています。起動後にフルスクリーンモードで、ユーザーが電話の他の部分に誤ってまたは喜んでアクセスできないようにします。

Androidで起動後に1つのアプリケーションのみが自動起動し、ユーザーが誤って(または喜んで)Android =デバイス?

110
Erik

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

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

しかし、プロトタイプの場合は十分かもしれません。

いじくりを楽しんでください!

[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>
26
Valentin

新しいAndroid L Previewで、Googleは Task Locking を発表しました。

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()を呼び出すまで、ユーザーはアプリでロックされたままになります。
17
nhaarman

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

17
rbot

しばらくこれを検索した後、私は良い解決策を思いつきました。ただし、これはルート化されたデバイスでのみ機能しますが、この1つのアプリ専用の場合は、ルート化しても問題ないはずです。

また、別の方法で http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ もチェックしてください。

9
matt_lethargic

Googleは最近、 Android Management API をリリースしました。これにより、任意のAndroid実行中のデバイスAndroid 5.1以上、また、他のさまざまなポリシーを設定します。

4
Fred

単一目的のデバイスページの設定 of Android開発者はこのことについて説明しているので、そこからもっと多くのことを簡単に知ることができます。

Android 6.0 Marshmallow以降デバイスを企業所有の使い捨て(COSU)デバイスとして簡単に構成できるようになりました。

3
Keyur Lakhani

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

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
Big Rich

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

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

<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

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

アプリを登録できるようにするには、最初に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から次のコマンドを起動できます(no root required

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
nonsensei

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

ここでAndroidソースコード

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

一見すると思っているよりずっと簡単です。幸運を!

1
JohnyTex

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

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

0
Kristy Welsh