CF .NETエンタープライズアプリケーションを移植して、Androidデバイスで実行できるかどうか、およびどのように実行できるかを評価しています。起動後にフルスクリーンモードで、ユーザーが電話の他の部分に誤ってまたは喜んでアクセスできないようにします。
Androidで起動後に1つのアプリケーションのみが自動起動し、ユーザーが誤って(または喜んで)Android =デバイス?
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>
新しい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()
を呼び出すまで、ユーザーはアプリでロックされたままになります。
これをカスタマイズして(メニューへのアクセスを無効にし、アプリケーションの追加を制限するなど)、キオスクを有効にすることができます。 http://code.google.com/p/Android-launcher-plus/
しばらくこれを検索した後、私は良い解決策を思いつきました。ただし、これはルート化されたデバイスでのみ機能しますが、この1つのアプリ専用の場合は、ルート化しても問題ないはずです。
以下を追加して、アプリケーションをランチャーにします
<category Android:name="Android.intent.category.HOME" />
あなたの意図フィルターに
アプリがツールバーを折りたたんで通知バーに到達できないことを確認してください ステータスバー/通知バーを無効にする方法Androidプログラムで? または http: //blog.vogella.com/2011/02/28/Android-hidding-the-status-and-title-bar/
その後、他のプログラムが誤って開かないようにするには、アクセシビリティサービスを使用してWindow State Changedを確認し、パッケージをホワイトリストまたはブラックリストと比較し、ActivityManager.killBackgroundProcessesを使用して実行しない場合は強制終了します。
また、別の方法で http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ もチェックしてください。
Googleは最近、 Android Management API をリリースしました。これにより、任意のAndroid実行中のデバイスAndroid 5.1以上、また、他のさまざまなポリシーを設定します。
単一目的のデバイスページの設定 of Android開発者はこのことについて説明しているので、そこからもっと多くのことを簡単に知ることができます。
Android 6.0 Marshmallow以降デバイスを企業所有の使い捨て(COSU)デバイスとして簡単に構成できるようになりました。
これで別の可能なテクニックを見つけました フォーラム投稿 。その投稿を引用:
次の方法を使用して、「通常の」ユーザーがアプリケーション以外のもので遊ぶのを防ぐアプリケーションを構築できます。
アプリケーションは2つのモジュールで構成されています。主な活動とサービス。サービスは、起動時に開始するように構成されています。サービスが開始されると、アクティビティが実行されているかどうかがチェックされます。実行されていない場合は、タイマーを使用してメインアクティビティを開始します。
アクティビティが一時停止すると、サービスは1秒で開始するようにスケジュールされます。コード:
Sub Activity_Pause (UserClosed As Boolean)
If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)
End Sub
ユーザーがホーム画面を押すと、ホーム画面が数秒間表示されます。ただし、アプリケーションは数秒後に前面に戻り、ユーザーは他のアプリケーションと対話したり、設定を変更したりできなくなります。
サービスはフォアグラウンドサービスに設定されています。これにより、Androidがサービスを強制終了するのを防ぎます。キオスクモードを無効にするには、[停止]ボタンを押します。
例:キオスクモードコードのZipファイルがダウンロード可能 もあるようです。
これを実現する最善の方法は、アプリをランチャーとして設定することです
<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();
}
Xposedフレームワークはこれを行うことができます。ルートが必要であり、すべてのプラットフォームで機能しない可能性があります。クラスAndroid.app.StatusBarManagerでdisable()メソッドを探します。
独自のモジュールの作成方法については、こちらをご覧ください。 Xposed開発チュートリアル
一見すると思っているよりずっと簡単です。幸運を!
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);
}
}
});
}
これにより、戻るボタン、アプリ、ホームボタンが完全に非表示になります。