5

我正在尝试以编程方式设置安全设置“未知来源 - 允许安装来自未知来源的应用程序”。

为此,DevicePolicyManager(级别 21)提供了一个功能(“SetSecureSetting”)来设置此设置(仅适用于配置文件或设备所有者)。

在我的设备所有者应用程序(由 NFC 配置部署)中,我尝试了以下代码:

public void allowNonMarketApps() {
    DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
    try {
      devicePolicyManager.setSecureSetting(deviceAdmin, Settings.Secure.INSTALL_NON_MARKET_APPS, "1");
    } catch (SecurityException e) {
      Log.d(TAG, "securityException caught");
    }
}

尽管我的应用程序是设备所有者,但我总是收到 SecurityException!

有人可以帮我解决这个问题吗?

提前致谢!!

编辑 SecurityException 的输出告诉我设备所有者无法更改此设置:

java.lang.SecurityException: Permission denial: Device owners cannot update install_non_market_apps
W/System.err(27634):    at android.os.Parcel.readException(Parcel.java:1547)
W/System.err(27634):    at android.os.Parcel.readException(Parcel.java:1499)
W/System.err(27634):    at android.app.admin.IDevicePolicyManager$Stub$Proxy.setSecureSetting(IDevicePolicyManager.java:7158)
W/System.err(27634):    at android.app.admin.DevicePolicyManager.setSecureSetting(DevicePolicyManager.java:3753)

我很困惑,因为文档说的是不同的东西:

public void setSecureSetting (ComponentName admin, String setting, String value) 

(在 API 级别 21 中添加)

由配置文件或设备所有者调用以更新 Settings.Secure 设置。调用者应验证设置的值是否为设置类型的正确格式。

配置文件或设备所有者可以使用此方法更新的设置包括:

DEFAULT_INPUT_METHOD

INSTALL_NON_MARKET_APPS

SKIP_FIRST_USE_HINTS

4

2 回答 2

2

INSTALL_NON_MARKET_APPS显然, API 22 中添加了更改功能。

您可以在此处找到 2014 年 10 月 21 日(API 21 发布后)完成的代码库更改:

这允许工作配置文件 MDM 启用未知来源,即使用户没有它的 UI。从未知来源安装应用程序仍会通过软件包安装程序对话框提示用户,因此 MDM 现在不能悄悄地从非市场来源安装应用程序

API 21 中明确缺少此功能。

于 2015-07-31T23:18:14.630 回答
0

阻止用户安装非市场应用也可以实现如下

DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
try {
  devicePolicyManager.addUserRestriction(deviceAdmin,
               UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
} catch (SecurityException ex) {
  Log.e(TAG, ex.getMessage());
}

您可以按如下方式删除限制

DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
try {
  devicePolicyManager.clearUserRestriction(deviceAdmin,
               UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
} catch (SecurityException ex) {
  Log.e(TAG, ex.getMessage());
}

上面的代码适用于设备所有者应用程序的 API 级别 21 (Android 5.0)。

于 2016-02-21T19:51:24.490 回答