Подготовка владельца устройства 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)

и вы можете найти шаблон здесь

Если это возможно, я также хотел бы знать, как получить это строковое значение, как только запустится подготовленное приложение.


person Rafael Kallis    schedule 25.06.2016    source источник


Ответы (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, чтобы получить «Дополнительные сведения для администратора». вместо этого обрабатывается там.

@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"));
    }
}
person Steve Miskovetz    schedule 16.05.2017

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"));
}
person Ganesan    schedule 06.10.2017