【问题标题】:DevicePolicyManager.enableSystemApp() method does not work as expectedDevicePolicyManager.enableSystemApp() 方法无法按预期工作
【发布时间】:2017-12-22 14:13:19
【问题描述】:

在使用设置为设备所有者模式的应用配置设备后,我正在尝试使用enableSystemApp 方法激活默认系统应用。

有两种方法可以做到这一点:

1) void enableSystemApp (ComponentName admin, String packageName) - 在这种情况下,您需要将包名称显式传递为字符串。它工作正常,应用程序已启用。

例如调用这个

devicePolicyManager.enableSystemApp(deviceAdminComponent, "com.google.android.gm");

启用默认的 Gmail 客户端,该客户端在配置后被禁用。

2) int enableSystemApp (ComponentName admin, Intent intent) - 在这种情况下,您需要传递一个隐式 Intent 并且 Android 应该启用与该 Intent 匹配的所有系统应用。此外,此方法返回与意图匹配的应用程序的 int 数量。这就是问题所在 - 我无法让这个方法工作,它总是返回 0 并且不启用任何东西。

这是我尝试使用的 sn-p:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
int i = devicePolicyManager.enableSystemApp(deviceAdminComponent, intent);

在这种情况下它不起作用并且 i == 0。我做错了什么?

感谢任何帮助!

【问题讨论】:

    标签: android android-intent provisioning


    【解决方案1】:

    在底层,接受意图查询的方法获取响应该意图的活动列表,然后循环遍历传递包名称字符串的列表以启用包。类似于这样做:

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

    由于您能够使用包名称字符串启用应用程序,因此问题很可能在于解决意图的方式 - 它始终返回 0 的事实支持这一点。

    这是违反直觉的,但我怀疑该应用程序无法解析 ACTION_MAIN 意图,因为该应用程序已被禁用。您是否尝试过不那么通用的意图?我会尝试以下方法

    Intent i;
    
    // #1
    // This goes full circle, but I expect it should work
    i = getPackageManager().getLaunchIntentForPackage("com.google.an‌​droid.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_AWAREMATCH_DIRECT_BOOT_UNAWARE 标志,因为MATCH_DISABLED_COMPONENTSMATCH_SYSTEM_ONLY 标志在这种情况下似乎更相关。

    【讨论】:

    • 感谢您的建议,恩里科。不幸的是,直到下周我才有可能对此进行检查,但对我来说,#3 似乎是它的预期工作方式。如果它没有帮助,那么我想有一个错误。我在代码中检查后会给你另一个反馈。
    • 因此它适用于具有#3 解决方案的电子邮件应用程序。但是仍然无法安装计算器应用程序(例如),因为它没有隐含的意图。所以我最终对不同设备和操作系统版本的系统应用程序包名称的长列表进行了硬编码。这不是很好,但目前唯一可行的解​​决方案。
    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多