我知道类似的问题以前被问过好几次,但我已经问过了,它们对我没有帮助。我正在尝试将三星Tab a(Android 8.1)设置为一次性设备。我已经编写了一个运行良好的应用程序,但由于该设备将被公众使用,我需要将其锁定为售货亭模式。我正试图遵循下面链接中的开发人员指南,但立即遇到了问题
https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode
因此,我尝试做的第一件事是根据给定的示例将应用程序列入白名单:
// Whitelist two apps.
private static final String KIOSK_PACKAGE = "com.example.kiosk";
private static final String PLAYER_PACKAGE = "com.example.player";
private static final String[] APP_PACKAGES = {KIOSK_PACKAGE, PLAYER_PACKAGE};
// ...
Context context = getContext();
DevicePolicyManager dpm =
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);
dpm.setLockTaskPackages(adminName, APP_PACKAGES);
文档中不清楚这个代码应该放在哪里,但我已经将它放在了onResume()
的覆盖中。
我在Android Studio中使用auto-import,但它告诉我找不到getContext()
。我尝试过更改为getApplicationContext()
,并按照其他地方的建议使用this
,但后来它抱怨getComponentName()
不应该有任何参数。我尝试过简单地删除上下文参数,使用context.getComponentName()
,也不使用上下文变量。这些编译,但应用程序在设备上崩溃(在setLockTaskPackages()
)。
我怀疑关键是找出getContext()
找不到的原因,然后希望其他一切都能到位。知道可能缺少什么吗?
如果使用activity,请使用关键字this
,而不是getContext
。
getContext()
用于片段中获取上下文。这是活动吗?您可以使用Yourclass.this
或this
。你也可以通过这个了解你可以在上下文中使用什么
我遇到了同样的问题,所以我将解释解决方案是什么。在Android官方文档中,行中:
ComponentName adminName = getComponentName(context);
getComponentName()
只是一个与Activity.java方法相似的名称。该文档的目的是在扩展AdminReceiver
的类中使用getComponentName(Context context)
:(您必须实现它)
class AdminReceiver : DeviceAdminReceiver() {
companion object {
fun getComponentName(context: Context): ComponentName {
return ComponentName(
context,
AdminReceiver::class.java
)
}
}
}