仕事用プロファイル

Android プラットフォームでは、デバイスで 仕事 プロファイル(管理対象プロファイルとも呼ばれます)を利用できます。仕事用プロファイルが管理されている 使用可能で、利用可能な機能は ユーザーのプライマリ プロファイルの機能を設定します。このアプローチにより、組織は ユーザーのデバイス上で企業固有のアプリやデータが実行されている環境 ユーザーは各自の個人用アプリとプロファイルを使用できます。

このレッスンでは、アプリケーションを変更して機能させる方法について説明します。 仕事用プロファイルでデバイス上のデータを確実に保護できます。何もする必要はありません 通常のアプリ開発のベスト プラクティスに加えられます。ただしこれらのベスト プラクティスの中には 仕事用プロファイルが設定されたデバイスでは特に重要になります。この ドキュメントに、注意すべき問題が記載されています。

概要

ユーザーは多くの場合、エンタープライズ設定で個人所有のデバイスを使用します。この 組織がジレンマをもたらす可能性があります。ユーザーが独自の 機密情報(たとえば従業員など)の情報が漏洩していないことを メールと連絡先など)が、組織が管理していないデバイス上にある。

この状況に対処するため、Android 5.0(API レベル 21)では、 仕事用プロファイルの設定デバイスに仕事用プロファイルが設定されている場合、 IT 管理者の管理下にあります。「 IT 管理者はそのプロファイルで許可するアプリを選択でき、 プロファイルで使用できるデバイス機能のみを制御できます。

デバイスに仕事用プロファイルが設定されている場合、アプリに影響がある どのプロファイルでアプリが実行されているかは関係ありません。

  • デフォルトでは、ほとんどのインテントがプロファイル間で交差することはありません。もし プロファイルで実行されているアプリがインテントを起動した場合、 もう一方のプロファイルと交差することはできません。 プロファイルの制限によりリクエストが失敗してアプリがシャットダウンする場合がある 予期せぬ結果が生じました
  • プロファイルの IT 管理者は、 仕事用プロファイル。この制限により、IP アドレスに関連付けられた API のハンドラが 一般的なインテントをいくつか紹介します。
  • 個人用プロファイルと仕事用プロファイルには別々のストレージ領域があるため、 あるプロファイルで有効なファイルの URI が、別のプロファイルでは有効ではありません。制限なし 一方のプロファイルで起動されたインテントがもう一方のプロファイルで処理される場合があります(プロファイルに応じて 。

失敗したインテントを防ぐ

仕事用プロファイルが設定されたデバイスでは、インテントが 別のプロファイルに切り替えることができますほとんどの場合、インテントが イベントが発生したのと同じプロファイルで処理されます。ハンドラがない場合 そのプロファイルのインテントの場合、インテントは処理されず、アプリは 起動した各関数が予期せずシャットダウンすることがあり、 もう一方のプロファイルのインテントです

プロファイル管理者は、表示するインテントを プロファイル間の交差を許可する場合に 使用できますIT 管理者は この決定を下したとしても、 この境界を越えることが許可されるインテントを事前に把握しておく必要があります。「 IT 管理者はこのポリシーを設定します。このポリシーは、いつでも自由に変更できます。

アプリがアクティビティを開始する前に、 決定しますマイページ Intent.resolveActivity() を呼び出して、許容される解決策があるかどうかを確認できます。コンバージョン トラッキングが 解決できない場合、メソッドは null。メソッドが非 null を返す場合、少なくとも 1 つの方法で インテントを解決でき、安全にインテントを起動できます。この例では、 インテントが解決可能なのかも 現在のプロファイルにハンドラがある、またはインテントが 他のプロファイルのハンドラと交差できるようになります。(詳細については、 一般的なインテントをご覧ください)。

たとえば、アプリでタイマーを設定する必要がある場合は、 ACTION_SET_TIMER インテント用の有効なハンドラがある。アプリが解決できない場合 場合、そのインテントは適切なアクション(例: エラーの表示 。

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

プロファイル間でファイルを共有する

アプリは、他のアプリに自身のファイルへのアクセスを提供する必要があります。 たとえば、画像ギャラリー アプリでは、画像と画像を共有する場合があります。 。通常、ファイルを共有する方法は 2 つあります。 URIまたはコンテンツ URI

ファイルの URI は file: 接頭辞で始まり、その後に デバイスのストレージにあるファイルの絶対パス。ただし、 仕事用プロファイルと個人用プロファイルは、それぞれ別のストレージ領域を使用します。つまり、 一方のプロファイルで有効な URL がもう一方のプロファイルでは有効でない。この状況 つまり、 インテントにファイル URI を添付すると、そのインテントはもう一方のプロファイルで処理されます。 ファイルにアクセスできません。

代わりに、コンテンツ URI を使用してファイルを共有する必要があります。コンテンツ URI 共有可能な方法で安全に識別できます。コンテンツ URI には、 ファイルパスのほか、ファイルを提供する権限、ID 番号の 特定します。コンテンツ ID は、 FileProvider。そのコンテンツは 他のアプリ(他のプロファイルにあるものも含む)との身分証明書。受信者は、 Content ID を使用して、実際のファイルにアクセスできるようにします。

たとえば、特定のファイルのコンテンツ URI を取得する方法は、次のとおりです。 URI:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

getUriForFile() メソッドを呼び出すと、 ファイル プロバイダの権限(この例では、 "com.example.myapp.fileprovider")を指定します。これは <provider> 要素を追加します。 コンテンツ URI を使用してファイルを共有する方法について詳しくは、以下をご覧ください。 共有 ファイルをご覧ください。

通知をリッスンする

通常、アプリは NotificationListenerService サブクラスを 通知の変更に関するシステムからのコールバックを受信します。対応デバイス 仕事用プロファイルは NotificationListenerService の動作に影響する可能性があります 説明します

仕事用プロファイルの場合

アプリから NotificationListenerService を使用することはできません 自動的に適用されますアプリが仕事用プロファイルで実行されている場合、 システムがアプリの NotificationListenerService を無視する。ただし、 個人用プロファイルで実行されているアプリは通知をリッスンできます。

個人用プロファイルの場合

アプリが個人用プロファイルで実行されている場合、通知が届かないことがあります 仕事用プロファイルで実行されているアプリの場合はデフォルトでは、個人用プロファイルのすべてのアプリが コールバックを受信できるが、IT 管理者は 1 つ以上の個人用プロファイルを許可リストに登録できる 通知の変更をリッスンできるアプリです。その後、システムは 制限されています。Android 8.0(API レベル 26)以降では、 仕事用プロファイルを管理するコントローラ(DPC)により、アプリがリッスンできなくなる可能性がある DevicePolicyManager を使用して仕事用プロファイルの通知に接続できます。 支払い方法 setPermittedCrossProfileNotificationListeners()。 アプリは、個人用スペースに投稿された通知に関するコールバックを引き続き受信します。 選択します。

アプリと仕事用プロファイルとの互換性をテストする

仕事用プロファイルの環境でアプリをテストして、 以下を搭載したデバイスでアプリが失敗する原因となる問題を捕捉します。 仕事用プロファイルを利用できます。特に、仕事用プロファイルのデバイスでのテストは アプリがインテントを適切に処理できるようにします。つまり、 処理できず、クロス プロファイルで機能しない URI をアタッチしないため、 オンにします。

サンプルアプリ TestDPC も用意されています。 これを使用して、以下を搭載した Android デバイスで仕事用プロファイルを設定できます。 Android 5.0(API レベル 21)以降。このアプリでは、Google Chat で アプリを仕事用プロファイル環境で利用できるようにしますまた、このアプリを使用して、 仕事用プロファイルを次のように設定します。

  • 管理対象デバイスで使用できるデフォルトのアプリを指定する プロフィール
  • 1 つのプロファイルからプロファイルへのクロスを許可するインテントを設定する もう一方

仕事用プロファイルの場合、アプリは個人用と仕事用の両方にインストールされます。 選択します。アプリをインストールしたら、 次の条件が適用されます。

  • インテントが通常、デフォルトのアプリ( カメラアプリ)を使用するなどして、仕事用プロファイルでそのデフォルト アプリを無効にしてみます。 アプリがこれを適切に処理するかどうかを確認します。
  • 他のアプリによる処理を想定してインテントを起動した場合は、以下を試します。 あるプロファイルからそのインテントの権限を有効または無効にすることで、 別のものです。どちらの状況でもアプリが正しく動作することを確認します。もし インテントがプロファイル間で交差できない場合、アプリの動作を両方のプロファイル間で検証する アプリのプロファイルに適切なハンドラがある場合と存在しない場合。 たとえば、アプリが地図関連のインテントを起動する場合は、以下のそれぞれを試してください。 シナリオ: <ph type="x-smartling-placeholder">
      </ph>
    • デバイスで、マップ インテントを 1 つのプロファイルから別のプロファイルに交差させることができます。 他のプロファイルに適切なハンドラがある(アプリが 実行先)
    • デバイスでは、マップ インテントをプロファイル間で交差させることはできませんが、 アプリのプロファイルの適切なハンドラである
    • デバイスでプロファイル間でマッピング インテントを行うことができず、かつ デバイスのプロファイルにある地図インテントに適したハンドラではありません
  • インテントにコンテンツをアタッチする場合は、インテントが適切に動作することを確認する アプリのプロファイルで処理される場合と 定義できます。

仕事用プロファイルでのテスト: ヒントとコツ

デバイス上でテストする際に役立ついくつかのコツを 仕事用プロファイル デバイスです。

  • 前述のように、仕事用プロファイルのデバイスにアプリをサイドローディングすると、 インストールされている必要があります必要に応じて、1 つのプロファイルからアプリを削除できます。 もう一方はそのままにします
  • Android Debug Bridge(adb)シェルで使用できるアクティビティ マネージャー コマンドのほとんど --user フラグをサポートしているため、実行するユーザーを指定できます。 できます。ユーザーを指定することで、管理対象外のプライマリ ユーザーとして実行するかどうかを選択できます または仕事用プロファイルを使用します。詳しくは、ADB シェルコマンドをご覧ください。
  • デバイス上のアクティブ ユーザーを確認するには、adb パッケージ マネージャーの list users コマンドを使用します。出力文字列の最初の数字は、 ユーザー ID。--user フラグとともに使用できます。詳細 詳しくは、ADB シェル コマンドをご覧ください。

たとえば、デバイスを使用しているユーザーを検索するには、次のコマンドを実行します。

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

この例では、プライマリ ユーザー(「Drew」)のユーザー ID は 0、 仕事用プロファイルのユーザー ID は 10 です仕事用プロファイルでアプリを実行するには、 次のようなコマンドを使用します。

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER