Kiosk mode in Android

后端 未结 11 1822
感情败类
感情败类 2020-11-22 11:26

I\'m in the process of evaluating if and how a CF .NET enterprise application can be ported to run on Android devices. The application on Windows Mobile phones are run in ki

11条回答
  •  伪装坚强ぢ
    2020-11-22 11:39

    Starting your app on boot

    the BEST way to accomplish this is setting your app as the launcher

    
        
          
          
          
        
    
    

    Locking your app

    the most reliable way is to use a device with Lollipop or greater and make use of

    startLockTask
    

    first you must set your app as the device owner. NB your device must be unprovisioned: if you registered it you should do a factory reset and skip the account registration.

    to be able to register your app you must first setup a DeviceAdminReceiver component:

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

    once you have an unprovisioned device you can launch the following command from adb (no root required)

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

    to avoid android asking the user permissions to pin your app you must call setLockTaskPackages

    finally!

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

提交回复
热议问题