기기 관리자 개요

기기 관리자 지원 중단. 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()에서 이 작업을 처리합니다. 지원을 받으려면 다른 앱에서 악용할 수 없도록 수신기도 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))
...
}

Java

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
}

Java

@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)

Java

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

정책 관리

DevicePolicyManager는 기기에 적용된 정책을 관리하기 위한 공개 클래스입니다. DevicePolicyManager는 하나 이상의 DeviceAdminReceiver 인스턴스에 대한 정책을 관리합니다.

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

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Java

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

Java

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)

Java

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)

Java

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)

Java

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)

Java

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)

Java

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)

Java

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)

Java

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

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

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Java

DevicePolicyManager dpm;
dpm.lockNow();

데이터 초기화 실행

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

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

Kotlin

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

Java

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)

Java

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)

Java

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

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

추가 코드 샘플

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