Android Kiosk模式 - 防止用户"未经授权"取消固定应用程序

Phi*_*hil 6 android kiosk android-5.0-lollipop android-screen-pinning device-owner

我对Android很新,我目前正在开发一个应该在KioskMode中运行的Android应用程序,这样普通用户就无法退出应用程序或做任何事情.
我已经做了什么:

  • 我将我的应用设置为设备所有者
  • 我在MainActivity中的onCreate() - 方法中"屏蔽"应用程序作为设备所有者
  • 我在MainActivity中有一个按钮,稍后允许管理员通过输入密码退出.调用stopLockTask()

我现在遇到的问题是,任何用户都可以通过同时长按"后退"和"多任务"按钮退出屏幕固定,因为运行应用程序的平板电脑有硬件按钮,我不能简单地停用它.(至少我不知道如何在没有设备生根的情况下执行此操作)
那么有没有办法停用此按钮组合以退出屏幕固定或一些整洁的解决方法?我想到的一种方法是在onLockTaskModeExiting()中的AdminReceiver类中重用Application,但我仍然坚持如何做到这一点.

以下是我的MainActivity和AdminReceiver类的一些代码片段:
AdminReceiver.java

public class AdminReceiver extends DeviceAdminReceiver{

@Override
public void onEnabled(Context context, Intent intent) {
    Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show();
}

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

@Override
public void onDisabled(Context context, Intent intent) {
    Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show();
}

@Override
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
    Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show();
}

@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
    Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)

}

MainActivity.java

public class MainActivity extends Activity {

private DevicePolicyManager mDpm;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

    if (!mDpm.isAdminActive(deviceAdmin)) {
        Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show();
    }


    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        Toast.makeText(this, getString(R.string.device_owner), Toast.LENGTH_SHORT).show();

        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
        startLockTask();
    } else {
        Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show();
    }

    Button exit = (Button) findViewById(R.id.exit);
    exit.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            stopLockTask();
        }
    });}
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢.谢谢!

小智 0

如果锁定任务模式无意中退出,只需重新启动您的 Activity 并重新固定屏幕即可。

@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        if (sharedPreferences.getBoolean(PIN_SHOULD_ENABLED, false)) {
            context.startActivity(new Intent(context, YOUR_PIN_SCREEN_ACTIVITY.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
    }
}
Run Code Online (Sandbox Code Playgroud)