1

我刚刚完成了制作 Knox Enabled App (KEA) 的动作,但设备上似乎没有发生任何事情 - 它就像另一个应用程序一样运行。如何判断 Knox 是否已启用?我了解我的应用程序应该在它们自己的 Knox 容器中?- 有没有办法找出或测试它?

4

2 回答 2

2

根据 Knox API(标准或高级),无法简单地查询 Knox 是否已激活。具体来说,没有简单的布尔返回“knoxlib.isKnoxActivated();”

首先,让我回顾一下 Knox 激活过程的工作原理:

  1. 您的 Knox Enabled 应用程序需要为 ELM 和 KLM(企业许可证管理和 Knox 许可证管理类)调用“activateLicense”。

  2. 该设备需要有一个通往 Knox 许可证服务器的网络路径,无论是三星的在线中心服务器,还是您组织的本地 Knox 许可证服务器。

  3. 您的 Knox Enabled 应用程序必须具有广播接收器才能接收来自 Knox 许可证服务器的回复。

也不要忘记在 Manifest 中注册广播接收器,如下所示:

<receiver>
    android:name=".KnoxLicenseReceiver"
    android:enabled="true"
    android:exported="true"
    <intent-filter>
        <action android:name="edm.intent.action.license.status" />
        <action android:name="edm.intent.action.knox_license.status" />
    </intent-filter>
</receiver>

您的广播接收器类应如下所示。

public class KnoxLicenseReceiver extends BroadcastReceiver {

    private final String LOGTAG = KnoxLicenseReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences.Editor sharedPrefEditor = context.getSharedPreferences(Constants.SHARED_PREF_NAME, Context.MODE_PRIVATE).edit();
        String action;
        int errorCode;
        if (intent != null) {
            action = intent.getAction();
            if (action != null) {
                // If received an ELM response
                if (EnterpriseLicenseManager.ACTION_LICENSE_STATUS.equals(action)) {
                    errorCode = intent.getIntExtra(EnterpriseLicenseManager.EXTRA_LICENSE_ERROR_CODE, Constants.DEFAULT_ERROR);
                    // If successfully activated
                    if (errorCode == EnterpriseLicenseManager.ERROR_NONE) {
                        Log.i(LOGTAG, "ELM activated successfully.");
                        sharedPrefEditor.putBoolean(Constants.ELM_ACTIVATED, true);
                    } else {
                        Log.i(LOGTAG, "ELM failed to activate with error code: " + errorCode);
                        sharedPrefEditor.putBoolean(Constants.ELM_ACTIVATED, false);
                    }
                }

                // If received a KLM response
                if (KnoxEnterpriseLicenseManager.ACTION_LICENSE_STATUS.equals(action)) {
                    errorCode = intent.getIntExtra(KnoxEnterpriseLicenseManager.EXTRA_LICENSE_ERROR_CODE, Constants.DEFAULT_ERROR);
                    // If successfully activated
                    if (errorCode == KnoxEnterpriseLicenseManager.ERROR_NONE) {
                        Log.i(LOGTAG, "KLM activated successfully.");
                        sharedPrefEditor.putBoolean(Constants.KLM_ACTIVATED, true);
                    } else {
                        Log.i(LOGTAG, "KLM failed to activate with error code: " + errorCode);
                        sharedPrefEditor.putBoolean(Constants.KLM_ACTIVATED, false);
                    }
                }
            }
        }
        // Store shared pref changes
        sharedPrefEditor.apply();
    }
}
于 2017-10-13T14:28:54.327 回答
0

请注意 - 以前的答案需要互联网连接。
如果您部署的解决方案使用 KNOX OnPremise 许可证服务器(而不是基于云的/Internet 选项),您将需要与 On-Premise 服务器的网络连接。

于 2018-10-01T16:25:39.337 回答