我对 android 很陌生,我目前正在开发一个应该在 KioskMode 下运行的 Android 应用程序,这样普通用户就不能退出应用程序或在它之外做任何事情。
我已经做了什么:
- 我将我的应用设置为设备所有者
- 我在 MainActivity 的 onCreate() 方法中“屏幕固定”应用程序作为设备所有者
- 我在 MainActivity 中有一个按钮,稍后允许管理员通过输入密码退出。调用 stopLockTask()
我现在遇到的问题是,任何用户都可以通过同时长按“返回”和“多任务”按钮来退出屏幕固定,因为应该运行应用程序的平板电脑有硬件按钮,我不能简单地停用这些按钮。(至少我不知道如何在不生根设备的情况下做到这一点)
那么有没有办法停用这个按钮组合以退出屏幕固定,或者一些巧妙的解决方法?我想到的一种方法是在 onLockTaskModeExiting() 的 AdminReceiver 类中重新固定应用程序,但我仍然坚持如何做到这一点。
以下是我的 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();
}
}
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();
}
});}
非常感谢任何帮助。谢谢!