Подготовка владельца устройства Android NFC: отправка пользовательских свойств. Является ли это возможным?
В настоящее время я занимаюсь разработкой приложения и имею следующую проблему.
При использовании NFC для инициализации владельца устройства я хотел бы отправить строку, которая будет использоваться новым приложением владельца устройства.
Мне известны стандартные свойства 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)
и вы можете найти шаблон здесь
В случае, если это возможно, я также хотел бы знать, как извлечь это строковое значение, как только запущенное приложение запущено.
2 ответа
Код ниже должен быть тем, что вы ищете. Для краткости я устанавливаю только имя пакета плюс две строки, которые будут отправлены на ваш 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, onProfileProvisioningComplete нужно будет переопределить с помощью EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, вместо этого.
@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"));
}
}
onProfileProvisioningComplete будет перезаписан следующим образом.
@Override
public void onProfileProvisioningComplete(final Context context, final Intent intent)
{
final PersistableBundle extras = intent.getParcelableExtra(DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
Log.d(TAG, "onProfileProvisioningComplete Extras:" + extras.getString("Key1") + " / " + extras.getString("Key2"));
}