DevicePolicyManager.enableSystemApp() 方法未按预期工作
DevicePolicyManager.enableSystemApp() method does not work as expected
在使用设置为设备所有者模式的应用程序配置设备后,我正在尝试使用 enableSystemApp 方法激活默认系统应用程序。
有两种方法可以做到这一点:
1) void enableSystemApp (ComponentName admin, String packageName) - 在这种情况下,您需要将包名称显式传递为字符串。它工作正常,应用程序被启用。
例如调用这个
devicePolicyManager.enableSystemApp(deviceAdminComponent, "com.google.android.gm");
启用默认 Gmail 客户端,该客户端在配置后被禁用。
2) int enableSystemApp (ComponentName admin, Intent intent) - 在这种情况下,您需要传递一个隐式意图并且 Android 应该启用所有系统应用程序符合这个意图。此外,此方法 returns int 匹配意图的应用程序数量。这就是问题所在 - 我无法使用此方法,它总是 returns 0 并且不启用任何东西。
这是我尝试使用的片段:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
int i = devicePolicyManager.enableSystemApp(deviceAdminComponent, intent);
它不起作用,在这种情况下 i == 0。我做错了什么?
感谢任何帮助!
在幕后,该方法接受意图查询以获取响应该意图的活动列表,然后循环遍历传递包名称字符串的列表以启用包。这类似于这样做:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
List<ResolveInfo> infoes = getPackageManager()
.queryIntentActivities(intent, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE);
for (ResolveInfo info in infoes) {
devicePolicyManager.enableSystemApp(deviceAdminComponent, info.activityInfo.packageName);
}
由于您能够使用程序包名称字符串启用应用程序,因此故障很可能在于解决意图的方式 - 它始终 returns 0.
这有悖常理,但我怀疑该应用程序无法解析 ACTION_MAIN
意图,因为该应用程序已被禁用。您是否尝试过不太通用的意图?我会尝试以下
Intent i;
// #1
// This goes full circle, but I expect it should work
i = getPackageManager().getLaunchIntentForPackage("com.google.android.gm")
// #2
i = new Intent(Intent.ACTION_SEND).setPackageName("com.google.android.gm");
// #3
// Generic, but should resolve _all_ email apps - not just the default one.
// The mailto schema filters out non-email apps
i = new Intent(Intent.ACTION_VIEW , Uri.parse("mailto:"));
选项 #1 和 #2 更具学术性。两者都需要包名,此时您也可以使用 enableSystemApp
的字符串重载。选项 #3 是我对可能仍然有效的通用内容的最佳猜测,但它可能仍然无法正常工作,因为该应用已被禁用。
注意:我发现有趣的是,enableSystemApp 在查询可以解析意图的活动时仅传递 MATCH_DIRECT_BOOT_AWARE
和 MATCH_DIRECT_BOOT_UNAWARE
标志,因为 MATCH_DISABLED_COMPONENTS
和 MATCH_SYSTEM_ONLY
在这种情况下,标志似乎更重要。
在使用设置为设备所有者模式的应用程序配置设备后,我正在尝试使用 enableSystemApp 方法激活默认系统应用程序。
有两种方法可以做到这一点:
1) void enableSystemApp (ComponentName admin, String packageName) - 在这种情况下,您需要将包名称显式传递为字符串。它工作正常,应用程序被启用。
例如调用这个
devicePolicyManager.enableSystemApp(deviceAdminComponent, "com.google.android.gm");
启用默认 Gmail 客户端,该客户端在配置后被禁用。
2) int enableSystemApp (ComponentName admin, Intent intent) - 在这种情况下,您需要传递一个隐式意图并且 Android 应该启用所有系统应用程序符合这个意图。此外,此方法 returns int 匹配意图的应用程序数量。这就是问题所在 - 我无法使用此方法,它总是 returns 0 并且不启用任何东西。
这是我尝试使用的片段:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
int i = devicePolicyManager.enableSystemApp(deviceAdminComponent, intent);
它不起作用,在这种情况下 i == 0。我做错了什么?
感谢任何帮助!
在幕后,该方法接受意图查询以获取响应该意图的活动列表,然后循环遍历传递包名称字符串的列表以启用包。这类似于这样做:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
List<ResolveInfo> infoes = getPackageManager()
.queryIntentActivities(intent, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE);
for (ResolveInfo info in infoes) {
devicePolicyManager.enableSystemApp(deviceAdminComponent, info.activityInfo.packageName);
}
由于您能够使用程序包名称字符串启用应用程序,因此故障很可能在于解决意图的方式 - 它始终 returns 0.
这有悖常理,但我怀疑该应用程序无法解析 ACTION_MAIN
意图,因为该应用程序已被禁用。您是否尝试过不太通用的意图?我会尝试以下
Intent i;
// #1
// This goes full circle, but I expect it should work
i = getPackageManager().getLaunchIntentForPackage("com.google.android.gm")
// #2
i = new Intent(Intent.ACTION_SEND).setPackageName("com.google.android.gm");
// #3
// Generic, but should resolve _all_ email apps - not just the default one.
// The mailto schema filters out non-email apps
i = new Intent(Intent.ACTION_VIEW , Uri.parse("mailto:"));
选项 #1 和 #2 更具学术性。两者都需要包名,此时您也可以使用 enableSystemApp
的字符串重载。选项 #3 是我对可能仍然有效的通用内容的最佳猜测,但它可能仍然无法正常工作,因为该应用已被禁用。
注意:我发现有趣的是,enableSystemApp 在查询可以解析意图的活动时仅传递 MATCH_DIRECT_BOOT_AWARE
和 MATCH_DIRECT_BOOT_UNAWARE
标志,因为 MATCH_DISABLED_COMPONENTS
和 MATCH_SYSTEM_ONLY
在这种情况下,标志似乎更重要。