Android의 키오스크 모드


114

저는 CF .NET 엔터프라이즈 애플리케이션이 Android 장치에서 실행되도록 이식 될 수 있는지 여부와 방법을 평가하는 중입니다. Windows Mobile 전화의 응용 프로그램은 부팅 후 응용 프로그램이 전체 화면 모드에서 자동 시작되고 사용자가 실수로 또는 의도적으로 전화의 다른 부분에 액세스 할 수없는 키오스크 모드에서 실행됩니다.

Android에서 부팅 후 하나의 애플리케이션 만 자동 시작되도록하고 사용자가 실수로 (또는 의도적으로) Android 기기의 다른 부분에 액세스하는 것을 방지 할 수 있습니까?


당신은 당신의 문제를 해결합니까?
Menna-Allah Sami

3
예, 가능합니다. 나는 이것에 대한 (매우) 긴 블로그 게시물을 만들었습니다 : andreas-schrade.de/2015/02/16/…
funcoder

나는 또한 롤리팝를 사용하여이에 대한 블로그 게시물을 (부분적으로) 만든 -이 제외 부팅 수신기 부분 생각 : sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi

잠긴 일회용 장치를 만드는 다른 방법에 대한 유사한 질문에 여기에 답했습니다. stackoverflow.com/a/43644803/2888763
Trevor Halvorson

답변:


29

android.intent.action.BOOT_COMPLETEDBroadcastReceiver 에서 인 텐트를 듣고 거기에서 활동을 시작하여 부팅시 애플리케이션을 자동으로 시작할 수 있습니다. 활동에서 자신을 새로운 기본 홈 화면 [1]으로 등록하고 키를 처리 할 수 ​​있습니다.

프레임 워크를 수정하지 않고는 처리 할 수없는 인스턴스가 있다고 생각합니다 (예 : 현재 활성화 된 애플리케이션을 표시하기 위해 홈을 길게 누르기).하지만 착각 할 수도 있습니다.

그러나 충분할 수있는 프로토 타입의 경우.

재미있게 땜질하세요!

[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>

1
당신은 당신이 실행기로 이동 뒤로 버튼 누를 때 당신은 또한 다른 첫번째 acitivty의 onbackpressed 오버라이드 (override)하는 필요
ademar111190

시스템 대화 상자를 달성 N 알림 코드를 비활성화 바 방법
Gnanam R

1
@GnanamR : 내 대답을 확인하십시오 : stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumar 전체 화면 모드에서 앱을 실행합니다.
John61590 2014 년

17

키오스크를 활성화하기 위해이를 사용자 정의 (메뉴에 대한 액세스 비활성화, 응용 프로그램 추가 제한 등) 할 수 있습니다. http://code.google.com/p/android-launcher-plus/


7
왜 이것이 비추천인지 알 수 있습니까? 나는 안드로이드 런처 플러스 위에서 편집 및 개발하여 현재 배포 된 본격적인 안드로이드 키오스크 앱을 작성했습니다.
rbot dec.

1
이 경우에, 나는 당신의 대답과 의견 ;-) 모두 찬성 투표
Mawg는 분석 재개 모니카 말한다

@rbot 어떻게 그랬어? 나는 오랫동안 키오스크 애플리케이션을 구축하려고 노력해 왔으며 알림 트레이가 열리지 않는지 확인하는 것 외에 거의 모든 것을 해결했습니다.
Wakka02 2013

1
@ Wakka02 나는 onwindowchanged 또는 유사한 이벤트 (알림 트레이 열기를 나타낼 수 있음)를 찾고 트레이를 닫은 것 같습니다. 오래 전에했기 때문에 세부 사항을 기억하지 마십시오.
rbot


17

새로운 Android L Preview에서 Google은 정확히 그렇게하는 Task Locking 을 발표 했습니다. 그러나 루트가 필요한 것 같습니다.

L 개발자 미리보기에는 사용자가 앱을 떠나거나 알림으로 인해 중단되는 것을 일시적으로 제한 할 수있는 새로운 작업 잠금 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().


2
여기에 전체 설치와 작업 잠금에 대한 나의 기사는 알고리즘으로 pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

잠시 동안 이것을 검색 한 후 좋은 해결책을 찾았습니다. 이것은 루팅 된 장치에서만 작동하지만이 앱에만 해당된다면 루팅은 문제가되지 않을 것입니다.

또 다른 방법은 http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ 을 확인하십시오.


5

부팅시 앱 시작

이를 수행하는 가장 좋은 방법은 앱을 런처로 설정하는 것입니다.

<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

먼저 앱을 기기 소유자로 설정해야합니다. 주의 : 장치는 프로비저닝되지 않아야합니다. 등록한 경우 공장 초기화를 수행하고 계정 등록을 건너 뛰어야합니다.

앱을 등록 할 수 있으려면 먼저 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에서 다음 명령을 실행할 수 있습니다 ( 루트 필요 없음 ).

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

안드로이드가 앱을 고정하기 위해 사용자 권한을 요청하지 않도록하려면 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();
}


3

Android 개발자의 단일 목적 장치 설정 페이지 에서 더 많은 정보를 쉽게 알 수있는 것에 대해 설명했습니다.

이제 Android 6.0 Marshmallow 이상 기기를 회사 소유의 일회용 (COSU) 기기 로 쉽게 구성 할 수 있습니다 .


2

포럼 게시물 에서 다른 가능한 기술을 찾았 습니다 . 해당 게시물 인용 :

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

다음 방법을 사용하여 "일반"사용자가 귀하의 응용 프로그램이 아닌 다른 것을 사용하지 못하도록하는 응용 프로그램을 구축 할 수 있습니다.

응용 프로그램은 두 개의 모듈로 구성됩니다. 주요 활동 및 서비스. 서비스는 부팅시 시작되도록 구성됩니다. 서비스가 시작되면 활동이 실행 중인지 여부를 확인합니다. 실행 중이 아니면 타이머를 사용하여 기본 활동을 시작합니다.

활동이 일시 중지되면 1 초 후에 서비스가 시작되도록 예약합니다. 코드 :

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

사용자가 홈 화면을 누르면 홈 화면이 몇 초 동안 나타납니다. 그러나 응용 프로그램은 몇 초 후에 전면으로 돌아가고 사용자는 다른 응용 프로그램과 상호 작용하거나 설정을 변경할 수 없습니다.

서비스가 포 그라운드 서비스로 설정됩니다. 이것은 Android가 서비스를 종료하는 것을 방지합니다. 키오스크 모드를 비활성화하려면 중지 버튼을 누릅니다.

있을 나타납니다 다운로드 할 수 있습니다 예를 키오스크 모드 코드 ZIP 파일 도.


2

Xposed 프레임 워크 는 이것을 할 수 있습니다. 루트가 필요하며 모든 플랫폼에서 작동하지 않을 가능성이 있습니다. android.app.StatusBarManager 클래스에서 disable () 메서드를 찾습니다 .

여기 Android 소스 코드에서

자신의 모듈을 작성하는 방법에 대해서는 여기를보십시오 : Xposed 개발 튜토리얼

언뜻 생각보다 훨씬 쉽습니다. 행운을 빕니다!


이 작업을 수행한다고 생각하는 Xposed 모듈이 있습니까?
Firelord

0

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

이렇게하면 뒤로 버튼, 앱 및 홈 버튼이 완전히 숨겨집니다.


알림 표시 줄은 어떻습니까?
Elshan 2016-06-07
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.