3

我对Android非常新,我目前正在开发一款应用程序,该应用程序应该在KioskMode中运行,以便普通用户无法退出应用程序或执行任何操作在它之外。
我已经做了:Android Kiosk模式 - 防止用户“未经授权”取消固定应用程序

  • 我把我的应用程序的设备所有者
  • 我“屏幕针”在OnCreate()的应用程序 - 方法在MainActivity作为设备所有者
  • 我有MainActivity中的一个按钮,稍后通过输入密码允许管理员退出。调用stopLockTask()

我现在遇到的,任何用户都可以退出屏幕,只需长按“后退”,同时,“多任务处理”按钮,因为该应用程序应该运行在平板电脑具有hardwarebuttons钉扎问题我不能简单地停用。 (至少我不知道如何做到这一点没有根植设备)
那么有没有什么办法来停用这个按钮组合来退出屏幕锁定,或者一些整洁的解决方法? 我想到的一种方法是在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(); 
     } 
    });} 

任何帮助,高度赞赏。谢谢!

+0

如何将您的应用程序设置为设备所有者?如果您的应用程序实际设置为设备所有者,则最近的按钮也将被隐藏。有关更多信息,请参阅示例DPC。 – bmg

+0

@Phil,是啊你是如何设置设备所有者? – portfoliobuilder

回答

0

只需重新启动您的活动,并在锁定任务模式无意退出时重新锁定屏幕。

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

如果活动被设置为每次用户按home键的活动可以重新启用onCreateonResumeonStartDEFAULTHOME

<activity 
     android:name=".AppActivity" 
     android:label="Locked Activity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.HOME"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
</activity> 

。如果应用程序使用概览和后退键强制取消固定,并且最近的活动列表为空,则用户只能按Home键以重新启用锁定。

由于问题是12个月大,我仍然在寻找更有效的解决方案。

0

我有这个问题,并尝试在这个线程的答案。我不会推荐Xavier Lin的答案,因为它最终会创建您的应用程序的多个实例。

幸运的是我想出了一个我自己的解决方案。

在扩展DeviceAdminReceiver的类中,重写onLockTaskModeExiting并在其中运行引脚代码。

public class AdminReceiver extends DeviceAdminReceiver{ 

    @Override 
    public void onLockTaskModeExiting(Context context, Intent intent) { 
     super.onLockTaskModeExiting(context, intent); 

     // Run pinning code here 
    } 
}