이 StackOverflow 질문 은 Android L 개발자 미리보기에서 기기 소유자 앱과 키오스크 모드를 활성화하는 방법을 탐구합니다. 이 방법에는 Android의 사용자 디버그 빌드, 장치 루팅 및 XML 파일을 루트 파일 시스템으로 복사가 필요하므로 회사 내부의 단일 기능 Android 장치를 대량 배포하는 데 적합하지 않습니다.
프로덕션 Android L 기기에 기기 소유자 앱은 어떻게 설치 되나요?
이 StackOverflow 질문 은 Android L 개발자 미리보기에서 기기 소유자 앱과 키오스크 모드를 활성화하는 방법을 탐구합니다. 이 방법에는 Android의 사용자 디버그 빌드, 장치 루팅 및 XML 파일을 루트 파일 시스템으로 복사가 필요하므로 회사 내부의 단일 기능 Android 장치를 대량 배포하는 데 적합하지 않습니다.
프로덕션 Android L 기기에 기기 소유자 앱은 어떻게 설치 되나요?
답변:
( 편집 : 추가 테스트 후 업데이트 됨)
최신 설명서를 확인하십시오 .
이 기능은 현재 화면 고정이라고하며 앱이 기기 소유자 일 필요는 없습니다. 장치 소유자가 설정되어 있지 않으면 사용자에게 수락하라는 메시지가 표시됩니다. 그러나 키오스크 사용에는 다음과 같은 문제가 있습니다.
화면 고정을 활성화하는 방법에는 두 가지가 있습니다.
수동 : 사용자는 설정> 보안> 화면 고정에서 화면 고정을 활성화하고 최근 화면에서 녹색 핀 아이콘을 터치하여 고정하려는 작업을 선택할 수 있습니다. 프로그래밍 방식 : 프로그래밍 방식으로 화면 고정을 활성화하려면 앱에서 startLockTask ()를 호출하십시오. 요청하는 앱이 기기 소유자가 아닌 경우 확인 메시지가 표시됩니다. 장치 소유자 앱은 setLockTaskPackages () 메서드를 호출하여 사용자 확인 단계없이 앱을 고정 할 수 있습니다.
프로그래밍 방식으로 (화면 소유자가 아닌 앱 소유자) 또는 최근에 핀을 사용하여 장치에서 화면 고정을 활성화하면 다음과 같은 동작이 나타납니다.
화면 고정 기능을 활성화 할 것인지와 종료하기 위해 암호를 요구할 것인지 묻는 대화 상자가 나타납니다. 예를 누르면 상태 표시 줄과 알림이 사라지고 뒤로, 홈 및 최근 버튼이 사라지지 않습니다. 집이나 최근에 두드리면 토스트가 나타나고 화면 고정을 종료하는 방법을 사용자에게 알려줍니다.
그런 다음 사용자는 최근 통화를 누르고 있으면 화면 고정을 종료 할 수 있습니다. 사용자가 비밀번호를 요구하도록 선택한 경우 잠금 화면으로 바로 걷어차 게됩니다. 이 동작은 키오스크 imo에 적합하지 않음을 의미합니다. 키오스크 사용자는 잠금 화면을 너무 쉽게 볼 수 있습니다.
올바른 키오스크 모드를 얻으려면 기기 소유자를 설정해야합니다. Google의 설명서에 따르면 NFC를 사용 하여이 작업을 수행해야한다고 말합니다.
장치 소유자를 배포하고 활성화하려면 장치가 프로비저닝되지 않은 상태에있는 동안 프로그래밍 앱에서 장치로 NFC 데이터 전송을 수행해야합니다.
NFC를 사용하여이를 수행하는 것은 약간 복잡해 보입니다 (기기에 NFC가없는 경우 어떻게됩니까?). 아직 조사하지 않았으므로 NFC로 장치 소유자를 설정하는 방법에 대한 정보를 누구나 제공 할 수 있다면? 이제 질문의 요점이됩니다. (예 : 루팅되지 않은 기기에서 기기 소유자 설정)
그러나 장치를 루팅하면 동작이 예상대로 확인되도록 여기에서 언급 한 것처럼 Google의 이전 지침 (device_owner.xml 추가)에 따라 장치 소유자를 설정할 수 있습니다
이제 앱을 올바르게 잠글 수 있습니다. 최근 통화를 활성화하면 홈 버튼이 사라지고 사용자가 앱을 잠금 해제하지 않으면 앱을 종료 할 수 없습니다. 적절한 키오스크 모드. 최신 Lollipop 빌드로 Nexus 7 2013에서 이것을 테스트했습니다.
다음 스 니펫은 잠금을 설정합니다.
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);
if (mDPM.isDeviceOwnerApp(this.getPackageName())) {
Log.d(TAG, "isDeviceOwnerApp: YES");
String[] packages = {this.getPackageName()};
mDPM.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
Log.d(TAG, "isDeviceOwnerApp: NO");
}
if (mDPM.isLockTaskPermitted(this.getPackageName())) {
Log.d(TAG, "isLockTaskPermitted: ALLOWED");
startLockTask();
} else {
Log.d(TAG, "isLockTaskPermitted: NOT ALLOWED");
}