我目前正在开发一个应用程序,并遇到以下问题。

使用NFC进行设备所有者配置时,我想发送一个字符串,新设备所有者应用将使用该字符串。

我知道here发现了用于设备所有者配置的标准MIME属性

这是一个片段,可以使您更好地了解我的问题。注意“myCustomValue”属性。

Properties properties = new Properties();
properties.put("myCustomValue", value);
properties.put(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.example.some.app");
try {
    properties.store(stream, "NFC Provisioning");
    ndefMessage = new NdefMessage(new NdefRecord[{NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, stream.toByteArray())});
} catch (IOException e) {

}

该片段位于内部
public NdefMessage createNdefMessage(NfcEvent event)

您可以找到一个模板here

如果可能的话,我还想知道在预配置应用程序启动后如何检索该字符串值。

最佳答案

下面的代码应该是您想要的。为简便起见,我只设置了程序包名称和两个字符串,该字符串将被发送到您的DeviceAdminReceiver。

@Override
public NdefMessage createNdefMessage(NfcEvent event) {
    try {
        Properties p = new Properties();

        p.setProperty(
                DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
                "com.example.some.app");

        Properties extras = new Properties();
        extras.setProperty("Key1", "TestString1");
        extras.setProperty("Key2", "TestString2");
        StringWriter sw = new StringWriter();
        try{
            extras.store(sw, "admin extras bundle");
            p.put(DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE,
                    sw.toString());
            Log.d(TAG, "Admin extras bundle=" + p.get(
                    DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE));
        } catch (IOException e) {
            Log.e(TAG, "Unable to build admin extras bundle");
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        OutputStream out = new ObjectOutputStream(bos);
        p.store(out, "");
        final byte[] bytes = bos.toByteArray();

        NdefMessage msg = new NdefMessage(NdefRecord.createMime(
                DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, bytes));
        return msg;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

下一个代码段将进入您的DeviceAdminReceiver中,以接收“管理员附加信息” ...如果您不重写onReceive,则将需要使用在那里处理的EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE覆盖onProfileProvisioningComplete。
@Override
public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "onReceive " + intent.getAction());
    if (ACTION_PROFILE_PROVISIONING_COMPLETE.equals(intent.getAction())) {
        PersistableBundle extras = intent.getParcelableExtra(
                EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
        Log.d(TAG, "onReceive Extras:" + extras.getString("Key1") + " / "  + extras.getString("Key2"));
    }
}

10-08 06:18