기기 관리자 개요

기기 관리자 지원 중단. Android 9(API 수준 28)부터 일부 관리자 정책은 기기 관리자가 호출할 때 지원 중단으로 표시됩니다. 이제 이 변경 사항에 대응할 준비를 하는 것이 좋습니다. 자세히 알아보고 이전 옵션을 보려면 기기 관리자 지원 중단을 읽어보세요.

Android는 Android Device Administration API를 제공하여 엔터프라이즈 앱을 지원합니다. Device Administration API는 시스템 수준에서 기기 관리 기능을 제공합니다. 이 API를 사용하면 IT 전문가가 직원 기기를 철저하게 제어해야 하는 기업 환경에 유용한 보안 인식 앱을 만들 수 있습니다. 예를 들어 내장 Android 이메일 앱은 이 API를 활용하여 Exchange 지원을 개선했습니다. Exchange 관리자는 이메일 앱을 통해 기기 전반에 영숫자 비밀번호 또는 숫자 PIN 등의 비밀번호 정책을 시행할 수 있습니다. 관리자는 분실하거나 도난당한 휴대전화를 원격 초기화(즉, 출고 시 기본값으로 복원)할 수도 있습니다. Exchange 사용자는 이메일 및 캘린더 데이터를 동기화할 수 있습니다.

이 문서는 Android 지원 기기의 기업용 솔루션을 개발하려는 개발자를 대상으로 합니다. 이 문서에서는 Android를 지원하는 직원 기기에 더 강력해진 보안을 제공하기 위해 Device Administration API에서 제공하는 다양한 기능에 관해 설명합니다.

참고 Android for Work 배포를 위한 작업 정책 컨트롤러 빌드에 관한 자세한 내용은 기기 정책 컨트롤러 빌드를 참조하세요.

헤드리스 기기 소유자 모드

Android 14(API 수준 34)에는 헤드리스 시스템 사용자 모드(UserManager.isHeadlessSystemUserModetrue를 반환하는 기기)가 도입되었습니다. 헤드리스 시스템 사용자 모드에서 시스템 사용자는 백그라운드 사용자이며 최종 사용자 상호작용에 추가 포그라운드 사용자를 사용합니다. Android 14에는 헤드리스 기기 소유자 연결 모드도 도입되었습니다. 이 모드는 기기 소유자가 설정된 시스템 사용자를 제외한 모든 연결된 사용자에 프로필 소유자를 추가합니다.

헤드리스 시스템 사용자로 구성된 기기(시스템 사용자가 백그라운드에서 실행됨)에서는 범위가 전역인 기기 정책(모든 사용자에게 적용되는 정책)만 포그라운드 사용자 또는 사용자에게 적용됩니다. 자세한 내용은 addUserRestriction를 참고하세요.

Android 기기 제조업체는 source.android.com에 게시된 안내를 참고할 수 있습니다.

Device Administration API 개요

다음은 Device Administration API를 사용할 수 있는 앱 유형의 예입니다.

  • 이메일 클라이언트
  • 원격 초기화를 실행하는 보안 앱
  • 기기 관리 서비스 및 앱

기본 원리

Device Administration API를 사용하여 사용자가 기기에 설치하는 기기 관리자 앱을 작성합니다. 기기 관리자 앱이 원하는 정책을 시행합니다. 작동 방식은 다음과 같습니다.

  • 시스템 관리자는 원격/로컬 기기 보안 정책을 시행하는 기기 관리자 앱을 작성합니다. 이 정책은 앱에 하드 코딩되거나, 앱이 서드 파티 서버에서 동적으로 정책을 가져올 수 있습니다.
  • 이 사용자의 기기에 설치됩니다. Android에는 현재 자동화된 프로비저닝 솔루션이 없습니다. 시스템 관리자가 앱을 사용자에게 배포할 수 있는 몇 가지 방법은 다음과 같습니다.
    • Google Play.
    • 다른 스토어에서 설치하도록 사용 설정
    • 이메일이나 웹사이트와 같은 다른 수단을 통해 앱을 배포
  • 시스템은 사용자가 기기 관리자 앱을 사용 설정하도록 메시지를 표시합니다. 이 메시지가 표시되는 방법과 시기는 앱을 구현한 방식에 따라 다릅니다.
  • 사용자가 기기 관리자 앱을 한번 사용 설정하면 앱의 정책에 따라 관리됩니다. 일반적으로 이 정책을 준수하면 민감한 시스템 및 데이터에 액세스하는 것과 같은 혜택이 제공됩니다.

사용자가 기기 관리자 앱을 사용 설정하지 않으면 앱은 기기에 비활성 상태로 남아 있습니다. 사용자는 앱 정책의 적용을 받지 않고 반대로 앱의 혜택도 받지 않습니다(예: 데이터 동기화를 사용할 수 없을 수도 있음).

사용자가 정책을 준수하지 않는 경우(예: 사용자가 가이드라인을 위반하는 비밀번호를 설정한 경우) 이를 처리하는 방법은 앱에서 결정합니다. 그러나 일반적으로 이런 경우 사용자는 데이터를 동기화할 수 없습니다.

기기가 Device Administration API에서 지원하지 않는 정책을 요구하는 서버에 연결을 시도한다면 연결은 허용되지 않습니다. Device Administration API는 현재 부분적인 프로비저닝을 허용하지 않습니다. 즉, 기기(예: 기존 기기)에서 명시된 정책을 모두 지원하지 않는다면 기기가 연결되도록 허용할 방법은 없습니다.

기기에서 사용 설정된 관리자 앱을 여러 개 포함한다면 가장 엄격한 정책이 시행됩니다. 특정 관리자 앱을 타겟팅하는 방법은 없습니다.

기존의 기기 관리자 앱을 제거하려면 사용자가 먼저 관리자로 앱 등록을 취소해야 합니다.

정책

기업 환경에서는 직원 기기가 기기 사용을 관리하는 엄격한 정책을 준수해야 하는 경우가 많습니다. Device Administration API는 표 1에 나열된 정책을 지원합니다. Device Administration API는 현재 화면 잠금용 비밀번호만 지원합니다.

표 1. Device Administration API에서 지원하는 정책

정책 설명
비밀번호 사용 설정 기기에서 PIN 또는 비밀번호를 요청해야 합니다.
비밀번호 최소 길이 비밀번호에 필요한 문자 수를 설정합니다. 예를 들어, PIN 또는 비밀번호를 6자 이상으로 설정하도록 요청할 수 있습니다.
비밀번호에 영숫자 필요 비밀번호는 문자와 숫자의 조합으로 이루어져야 합니다. 기호 문자를 포함할 수 있습니다.
복잡한 비밀번호 필요 비밀번호에는 최소한 하나의 문자, 숫자 및 특수 기호가 포함되어야 합니다. Android 3.0에서 도입되었습니다.
비밀번호에 필요한 최소 문자 수 모든 관리자 또는 특정 관리자의 비밀번호에 필요한 최소 문자 개수입니다. Android 3.0에서 도입되었습니다.
비밀번호에 필요한 최소 소문자 수 모든 관리자 또는 특정 관리자의 비밀번호에 필요한 최소 소문자 개수입니다. Android 3.0에서 도입되었습니다.
비밀번호에 필요한 최소 비문자 수 모든 관리자 또는 특정 관리자의 비밀번호에 필요한 비문자(문자가 아닌 글자)의 최소 개수입니다. Android 3.0에서 도입되었습니다.
비밀번호에 필요한 최소 숫자 수 모든 관리자 또는 특정 관리자의 비밀번호에 필요한 숫자의 최소 개수입니다. Android 3.0에서 도입되었습니다.
비밀번호에 필요한 최소 기호 수 모든 관리자 또는 특정 관리자의 비밀번호에 필요한 최소 기호 개수입니다. Android 3.0에서 도입되었습니다.
비밀번호에 필요한 최소 대문자 수 모든 관리자 또는 특정 관리자의 비밀번호에 필요한 최소 대문자 개수입니다. Android 3.0에서 도입되었습니다.
비밀번호 만료 시간 제한 비밀번호가 만료되면 기기 관리자가 만료 시간 제한을 설정한 때부터 밀리초 단위의 델타로 표시됩니다. Android 3.0에서 도입되었습니다.
비밀번호 기록 제한 이 정책은 사용자가 마지막 n 개의 고유 비밀번호를 다시 사용하지 못하게 합니다. 일반적으로 이 정책은 지정된 시간이 경과한 후 사용자가 비밀번호를 업데이트하도록 강제하는 setPasswordExpirationTimeout()과 함께 사용됩니다. Android 3.0에서 도입되었습니다.
잘못된 비밀번호 입력을 시도할 수 있는 최대 횟수 기기가 데이터를 완전히 삭제하기 전에 사용자가 잘못된 비밀번호를 입력할 수 있는 횟수를 지정합니다. 관리자는 Device Administration API를 사용하여 원격으로 기기를 출고 시 기본값으로 재설정할 수 있습니다. 이는 기기를 분실하거나 도난당했을 때 데이터를 보호합니다.
최대 비활성 상태 시간 잠금 사용자가 마지막으로 화면을 터치하거나 버튼을 누른 후 기기가 화면을 잠그기 전까지의 시간을 설정합니다. 이 경우 사용자가 PIN이나 비밀번호를 다시 입력해야 기기를 사용하고 데이터에 액세스할 수 있습니다. 값은 1분에서 60분 사이가 될 수 있습니다.
저장소 암호화 필요 기기가 지원한다면 저장소 영역을 암호화하도록 지정합니다. Android 3.0에서 도입되었습니다.
카메라 사용 중지 카메라를 중지하도록 지정합니다. 영구적으로 중지하는 것은 아닙니다. 카메라는 컨텍스트, 시간 등에 기반하여 동적으로 사용 설정 또는 중지될 수 있습니다. Android 4.0에서 도입되었습니다.

기타 기능

위의 표에 나열된 정책을 지원하는 것 외에도 Device Administration API를 사용하면 다음 작업을 할 수 있습니다.

  • 사용자에게 새 비밀번호를 설정하라는 메시지 표시
  • 즉시 기기 잠금
  • 기기 데이터를 완전히 삭제(즉, 기기를 출고 시 기본값으로 복원함)

샘플 앱

이 페이지에서 사용된 예는 Device Administration API 샘플을 기반으로 합니다. 이 샘플은 SDK 샘플 (Android SDK Manager를 통해 사용 가능)에 포함되어 있으며 시스템에서 <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java로 있습니다.

샘플 앱은 기기 관리자 기능의 데모를 제공합니다. 샘플 앱은 사용자가 기기 관리자 앱을 사용 설정할 수 있도록 하는 사용자 인터페이스를 제공합니다. 한번 앱을 사용 설정하면 사용자는 사용자 인터페이스에서 버튼을 사용하여 다음 작업을 할 수 있습니다.

  • 비밀번호 품질 설정
  • 최소 길이, 포함해야 하는 최소 숫자 개수 등과 같은 사용자 비밀번호의 요구사항 지정
  • 비밀번호 설정. 비밀번호가 지정된 정책을 준수하지 않으면 시스템에서 오류를 반환합니다.
  • 기기가 초기화(즉, 기본 설정으로 복원)되기 전에 비밀번호 오류가 발생할 수 있는 횟수를 설정합니다.
  • 지금부터 비밀번호가 만료될 때까지 남은 시간 설정
  • 비밀번호 기록 길이 설정(길이는 기록에 저장할 이전 비밀번호의 개수). 이렇게 하면 사용자가 이전에 사용했던 비밀번호 중 마지막 n 개 비밀번호는 재사용하지 못하도록 합니다.
  • 기기가 지원하는 경우 저장소 영역을 암호화하도록 지정
  • 기기가 잠기기 전에 경과할 수 있는 최대 비활성 시간을 설정합니다.
  • 기기를 즉시 잠금
  • 기기의 데이터를 완전히 삭제(즉, 초기화함)
  • 카메라 중지

그림 1. 샘플 앱 스크린샷

기기 관리자 앱 개발

시스템 관리자는 Device Administration API를 사용하여 원격/로컬 기기 보안 정책 시행을 적용하는 앱을 작성할 수 있습니다. 이 섹션에서는 기기 관리 앱을 만드는 절차와 관련된 단계를 요약합니다.

매니페스트 생성

Device Administration API를 사용하려면 앱의 매니페스트에 다음이 포함되어야 합니다.

다음은 기기 관리자 샘플 manifest에서 발췌한 내용입니다.

<activity android:name=".app.DeviceAdminSample"
            android:label="@string/activity_sample_device_admin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.SAMPLE_CODE" />
    </intent-filter>
</activity>
<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

참고:

  • 다음 속성은 샘플 앱의 경우 ApiDemos/res/values/strings.xml에 있는 문자열 리소스를 참조합니다. 리소스에 관한 자세한 내용은 애플리케이션 리소스를 참고하세요.
    • android:label="@string/activity_sample_device_admin"은 사용자가 읽을 수 있는 활동의 라벨을 나타냅니다.
    • android:label="@string/sample_device_admin"은 사용자가 읽을 수 있는 권한 라벨을 나타냅니다.
    • android:description="@string/sample_device_admin_description"은 사용자가 읽을 수 있는 권한 설명을 나타냅니다. 설명은 일반적으로 라벨보다 길고 더 많은 정보를 담고 있습니다.
  • android:permission="android.permission.BIND_DEVICE_ADMIN" 는 시스템만 수신자와 상호작용할 수 있도록 하기 위해 DeviceAdminReceiver 서브클래스에 있어야 하는 권한입니다 (앱에는 이 권한이 부여될 수 없음). 이렇게 하면 다른 앱에서 기기 관리자 앱을 악용하는 것을 방지할 수 있습니다.
  • android.app.action.DEVICE_ADMIN_ENABLEDDeviceAdminReceiver 서브클래스가 기기를 관리할 수 있도록 처리해야 하는 기본 작업입니다. 이 작업은 사용자가 기기 관리자 앱을 사용 설정하면 수신기에 설정됩니다. 일반적으로 코드는 onEnabled()에서 이 작업을 처리합니다. 지원을 받으려면 다른 앱에서 악용할 수 없도록 broadcast receiver에 BIND_DEVICE_ADMIN 권한도 있어야 합니다.
  • 사용자가 기기 관리자 앱을 사용 설정하면 특정 시스템 이벤트의 브로드캐스트에 응답하여 작업을 실행할 수 있는 권한이 수신기에 부여됩니다. 적절한 이벤트가 발생하면 앱에서 정책을 시행할 수 있습니다. 예를 들어, 사용자가 정책 요구사항을 충족하지 않는 새 비밀번호를 설정하려고 시도한다면 앱은 사용자가 요구사항을 충족하는 다른 비밀번호를 선택하라는 메시지를 표시할 수 있습니다.
  • 앱을 게시한 후에는 수신기 이름을 변경하지 마세요. 매니페스트의 이름이 변경되면 사용자가 앱을 업데이트할 때 기기 관리자가 중지됩니다. 자세히 알아보려면 <receiver>를 참고하세요.
  • android:resource="@xml/device_admin_sample"은 메타데이터에 사용되는 보안 정책을 선언합니다. 메타데이터는 기기 관리자에 관련된 추가 정보를 제공하며 DeviceAdminInfo 클래스에서 파싱합니다. device_admin_sample.xml의 콘텐츠는 다음과 같습니다.
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</device-admin>

기기 관리자 앱을 설계할 때 모든 정책을 포함할 필요는 없으며 앱과 관련된 정책만 포함하면 됩니다.

매니페스트 파일에 관한 자세한 내용은 Android 개발자 가이드를 참고하세요.

코드 구현

Device Administration API에는 다음 클래스가 포함됩니다.

DeviceAdminReceiver
기기 관리자 구성요소를 구현하기 위한 기본 클래스입니다. 이 클래스는 시스템에서 전송한 원시 인텐트 작업을 해석하는 데 편의성을 제공합니다. 기기 관리자 앱은 DeviceAdminReceiver 서브클래스를 포함해야 합니다.
DevicePolicyManager
기기에서 시행되는 정책을 관리하는 클래스입니다. 이 클래스의 클라이언트는 대부분 사용자가 현재 사용 설정한 DeviceAdminReceiver를 게시했을 것입니다. DevicePolicyManager는 하나 이상의 DeviceAdminReceiver 인스턴스의 정책을 관리합니다.
DeviceAdminInfo
이 클래스는 기기 관리자 구성요소의 메타데이터를 지정하는 데 사용됩니다.

이 클래스는 모든 기능을 갖춘 기기 관리자 앱의 기초를 제공합니다. 이 섹션의 나머지 부분에서는 DeviceAdminReceiverDevicePolicyManager API를 사용하여 기기 관리자 앱을 작성하는 방법을 설명합니다.

DeviceAdminReceiver 서브클래스 만들기

기기 관리자 앱을 만들려면 DeviceAdminReceiver의 서브클래스를 만들어야 합니다. DeviceAdminReceiver 클래스는 특정 이벤트가 발생할 때 트리거되는 일련의 콜백으로 구성됩니다.

DeviceAdminReceiver 서브클래스에서 샘플 앱은 단순히 특정 이벤트에 대한 응답으로 Toast 알림을 표시합니다. 예를 들면 다음과 같습니다.

Kotlin

class DeviceAdminSample : DeviceAdminReceiver() {

    private fun showToast(context: Context, msg: String) {
        context.getString(R.string.admin_receiver_status, msg).let { status ->
            Toast.makeText(context, status, Toast.LENGTH_SHORT).show()
        }
    }

    override fun onEnabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_enabled))

    override fun onDisableRequested(context: Context, intent: Intent): CharSequence =
            context.getString(R.string.admin_receiver_status_disable_warning)

    override fun onDisabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_disabled))

    override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) =
            showToast(context, context.getString(R.string.admin_receiver_status_pw_changed))
...
}

자바

public class DeviceAdminSample extends DeviceAdminReceiver {

    void showToast(Context context, String msg) {
        String status = context.getString(R.string.admin_receiver_status, msg);
        Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_enabled));
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.admin_receiver_status_disable_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_disabled));
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) {
        showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
    }
...
}

앱 사용 설정

기기 관리자 앱이 처리해야 하는 주요 이벤트 중 하나는 사용자가 앱을 사용 설정하는 것입니다. 사용자는 정책을 시행하기 위해 앱을 명시적으로 사용 설정해야 합니다. 사용자가 앱을 사용 설정하지 않도록 선택하더라도 앱은 기기에 남아 있지만, 정책은 시행되지 않으며 사용자는 앱의 혜택을 누릴 수 없습니다.

앱을 사용 설정하는 프로세스는 사용자가 ACTION_ADD_DEVICE_ADMIN 인텐트를 트리거하는 작업을 실행할 때 시작됩니다. 샘플 앱에서 사용자가 관리자 사용 설정 체크박스를 클릭하면 프로세스가 시작됩니다.

사용자가 관리자 사용 설정 체크박스를 클릭하면 그림 2와 같이 화면이 변경되어 사용자에게 기기 관리자 앱을 활성화하라는 메시지가 표시됩니다.

그림 2. 샘플 앱: 앱 활성화

다음은 사용자가 관리자 사용 설정 체크박스를 클릭할 때 실행되는 코드입니다. 이렇게 하면 onPreferenceChange() 콜백을 트리거하는 효과가 있습니다. 사용자가 이 Preference의 값을 변경하고 이 값이 곧 설정 또는 유지될 때 이 콜백이 호출됩니다. 사용자가 앱을 사용 설정하고 있으면 그림 2와 같이 화면이 변경되어 사용자에게 기기 관리자 앱을 활성화하라는 메시지가 표시됩니다. 활성화하지 않으면 기기 관리자 앱이 중지됩니다.

Kotlin

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    if (super.onPreferenceChange(preference, newValue)) return true
    val value = newValue as Boolean
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
                    putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample)
                    putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                            activity.getString(R.string.add_admin_extra_app_text))
                }
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN)
                // return false - don't update checkbox until we're really active
                return false
            } else {
                dpm.removeActiveAdmin(deviceAdminSample)
                enableDeviceCapabilitiesArea(false)
                adminActive = false
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value)
    }
    return true
}

자바

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (super.onPreferenceChange(preference, newValue)) {
        return true;
    }
    boolean value = (Boolean) newValue;
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        activity.getString(R.string.add_admin_extra_app_text));
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
                // return false - don't update checkbox until we're really active
                return false;
            } else {
                dpm.removeActiveAdmin(deviceAdminSample);
                enableDeviceCapabilitiesArea(false);
                adminActive = false;
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value);
    }
    return true;
}

intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample) 라인은 mDeviceAdminSample(DeviceAdminReceiver 구성요소)이 타겟 정책인 것을 의미합니다. 이 라인은 그림 2와 같이 사용자에게 기기 관리자를 시스템에 추가하는(또는 거부하는) 방법을 설명하는 사용자 인터페이스를 호출합니다.

앱이 기기 관리자 앱이 사용 설정되어 있는지와 관련된 작업을 실행해야 할 때 앱이 활성화 상태인지 확인합니다. 이 작업을 실행하기 위해 DevicePolicyManager의 메서드 isAdminActive()를 사용합니다. DevicePolicyManager 메서드 isAdminActive()DeviceAdminReceiver 구성요소를 인수로 취합니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)

자바

DevicePolicyManager dpm;
...
private boolean isActiveAdmin() {
    return dpm.isAdminActive(deviceAdminSample);
}

정책 관리

DevicePolicyManager는 기기에서 시행되는 정책을 관리하는 공개 클래스입니다. DevicePolicyManager는 하나 이상의 DeviceAdminReceiver 인스턴스의 정책을 관리합니다.

다음과 같이 DevicePolicyManager에 관한 핸들을 가져옵니다.

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

자바

DevicePolicyManager dpm =
    (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

이 섹션에서는 DevicePolicyManager를 사용하여 관리 작업을 실행하는 방법을 설명합니다.

비밀번호 정책 설정

DevicePolicyManager에는 기기 비밀번호 정책을 설정 및 시행하는 API가 포함됩니다. Device Administration API에서 비밀번호는 화면 잠금에만 적용됩니다. 이 섹션에서는 비밀번호와 관련된 일반적인 작업을 설명합니다.

기기의 비밀번호 설정

이 코드는 사용자에게 비밀번호를 설정하도록 메시지를 표시하는 사용자 인터페이스를 표시합니다.

Kotlin

Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}

자바

Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
비밀번호 품질 설정

비밀번호 품질은 다음 DevicePolicyManager 상수 중 하나가 될 수 있습니다.

PASSWORD_QUALITY_ALPHABETIC
사용자는 최소한 영문자(또는 다른 기호)를 포함하는 비밀번호를 입력해야 합니다.
PASSWORD_QUALITY_ALPHANUMERIC
사용자는 최소한 숫자 영문자(또는 다른 기호)를 모두 포함하는 비밀번호를 입력해야 합니다.
PASSWORD_QUALITY_NUMERIC
사용자는 최소한 숫자를 포함하는 비밀번호를 입력해야 합니다.
PASSWORD_QUALITY_COMPLEX
사용자는 최소한 하나의 문자, 숫자, 특수 기호를 포함하는 비밀번호를 입력해야 합니다.
PASSWORD_QUALITY_SOMETHING
정책에는 몇 가지 종류의 비밀번호가 필요하지만 어떤 종류인지는 중요하지 않습니다.
PASSWORD_QUALITY_UNSPECIFIED
이 정책에는 비밀번호에 대한 요구사항이 없습니다.

예를 들어, 아래 코드는 영숫자 비밀번호를 요구하는 비밀번호 정책을 설정하는 방법입니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
비밀번호 콘텐츠 요구사항 설정

Android 3.0부터는 DevicePolicyManager 클래스에 비밀번호의 콘텐츠를 세부적으로 조정할 수 있는 메서드가 포함되어 있습니다. 예를 들어 비밀번호에 최소 n 개 이상의 대문자가 포함되어야 한다는 정책을 설정할 수 있습니다. 다음은 비밀번호의 콘텐츠를 세부적으로 조정하는 방법입니다.

예를 들어, 이 스니펫은 비밀번호에 최소한 2개 이상의 대문자가 있어야 하는 것을 나타냅니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
비밀번호의 최소 길이 설정

비밀번호가 지정된 최소 길이 이상이어야 한다는 것을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
잘못된 비밀번호를 시도할 수 있는 최대 횟수 설정

기기를 완전 삭제 (초기화)하기 전에 허용되는 비밀번호 오류 최대 횟수를 설정할 수 있습니다. 예를 들면 다음과 같습니다.

Kotlin

val dPM:DevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
비밀번호 만료 시간 제한 설정

Android 3.0부터는 setPasswordExpirationTimeout() 메서드를 사용하여 언제 비밀번호가 만료될지 설정할 수 있으며 이 시간은 기기 관리자가 만료 시간 제한을 설정한 때부터 밀리초 단위의 델타로 표시됩니다. 예를 들면 다음과 같습니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
기록에 따라 비밀번호 제한

Android 3.0부터는 setPasswordHistoryLength() 메서드를 사용하여 이전 비밀번호를 재사용할 수 있는 사용자의 기능을 제한할 수 있습니다. 이 메서드는 저장할 이전 비밀번호 수를 지정하는 length 매개변수를 취합니다. 이 정책이 활성화되면 사용자는 마지막 n 개의 비밀번호와 일치하는 새 비밀번호를 입력할 수 없습니다. 이렇게 하면 사용자가 동일한 비밀번호를 반복해서 사용할 수 없습니다. 일반적으로 이 정책은 지정된 시간이 경과한 후 사용자가 비밀번호를 업데이트하도록 강제하는 setPasswordExpirationTimeout()과 함께 사용됩니다.

예를 들어, 이 스니펫은 사용자가 마지막 5개의 비밀번호를 재사용하지 못하도록 합니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwHistoryLength = 5;
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);

기기 잠금 설정

기기를 잠그기 전에 발생할 수 있는 사용자 비활성 상태의 최대 기간을 설정할 수 있습니다. 예를 들면 다음과 같습니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
long timeMs = 1000L*Long.parseLong(timeout.getText().toString());
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);

프로그래밍 방식으로 기기를 잠그도록 기기에 즉시 알릴 수도 있습니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

자바

DevicePolicyManager dpm;
dpm.lockNow();

데이터 초기화 실행

DevicePolicyManagerwipeData() 메서드를 사용하여 기기를 초기화할 수 있습니다. 이는 기기를 분실하거나 도난당한 경우에 유용합니다. 기기를 초기화하려는 결정은 특정 조건이 충족된 결과인 경우가 많습니다. 예를 들어, setMaximumFailedPasswordsForWipe()를 사용하여 특정 횟수의 비밀번호 시도 실패 후 기기를 초기화해야 한다고 명시할 수 있습니다.

다음과 같이 데이터를 완전히 삭제합니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)

자바

DevicePolicyManager dpm;
dpm.wipeData(0);

wipeData() 메서드는 추가 옵션의 비트 마스크를 매개변수로 취합니다. 현재 값은 0이어야 합니다.

카메라 중지

Android 4.0부터 카메라를 중지할 수 있습니다. 참고로, 영구적으로 중지해야 하는 것은 아닙니다. 카메라는 컨텍스트, 시간 등을 기준으로 동적으로 사용 설정 또는 중지될 수 있습니다.

setCameraDisabled() 메서드를 사용하여 카메라 사용의 중지 여부를 제어합니다. 예를 들어, 이 스니펫은 체크박스 설정에 따라 카메라를 사용 또는 중지로 설정합니다.

Kotlin

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

자바

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

저장소 암호화

Android 3.0부터는 setStorageEncryption() 메서드를 사용하여 지원되는 경우 저장소 영역의 암호화를 요구하는 정책을 설정할 수 있습니다.

예를 들면 다음과 같습니다.

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

자바

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

저장소 암호화를 사용 설정하는 방법에 관한 전체 예는 Device Administration API 샘플을 참고하세요.

추가 코드 샘플

Android AppRestrictionEnforcerDeviceOwner 샘플은 이 페이지에서 다루는 API의 사용을 더 자세히 보여줍니다.