Взаимодействие с NFC через мобильную платформу 1С

Программирование - Мобильные приложения

Цель была научиться взаимодействовать с внешними приложениями из приложения на мобильной платформе 1С. Для данной цели выбрал тему чтение/запись NFC меток. Было разработано: 1) приложение в android studio, которое взаимодействует с NFC 2) приложение на мобильное платформе 1с, которое взаимодействует с разработанным приложением в android studio.

Материалы, которые использовал для создания приложений:

  1. Уроки по созданию приложения для взаимодействия с NFC в android studio   Вам нужно только повторять за автором и на выходе вы получите функционал по чтению и записи меток.
  2. Статьи на инфостарте "Мобильное приложение 1С и приложение Java. Совместная работа через Intent. " в них очень подробно расписано, как "подружить" приложения:

Всегда актуально: Курс Дмитрия Шерстобитова на курсах-1с.рф

Функционал, который получилось реализовать:

  • Получение состояния (включено/выключено)
  • Переход в настройки
  • Запись (в тестовой записи текст вшит в приложение на android studio, в обычной записи текст передается из приложения на мобильной платформе 1С)
  • Чтение с передачей ID метки и содержимого в приложение на МП 1С. Т.к поддерживается только Ndef то формат передается просто текстом.
  • Установка внешнего приложения из приложения на МП 1С.

Приведу пример кода некоторых функций на стороне МП 1С и android studio:

Получение состояния (включено/выключено)

Код в 1С:

&НаКлиенте
Процедура ПолучитьСостояниеNFC()
	#Если МобильноеПриложениеКлиент Тогда 
		НовВз = Новый ЗапускПриложенияМобильногоУстройства();
		НовВз.Действие="ru.mp.intent.action.NFCstate";
		НовВз.Запустить(Истина);
		
		Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл
			Если Стр.Ключ = "state" Тогда 
				СостояниеNFC = Стр.Значение; 
			КонецЕсли;
		КонецЦикла;
	#КонецЕсли
КонецПроцедуры

Код в android studio:

    NfcAdapter nfcAdapter;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nfc_state);
 
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
 
        //++ определим состояние NFC Урок 1
       String textState = new String();
       Boolean StateNfc = false;
        if (nfcAdapter != null && nfcAdapter.isEnabled()) {
            textState = "NFC Включено";
            android.widget.Toast.makeText(this, textState, Toast.LENGTH_SHORT).show();
            StateNfc = true;
        }else{
            textState = "NFC Выключено";
            android.widget.Toast.makeText(this, textState, Toast.LENGTH_SHORT).show();
            StateNfc = false;
        }
        //-- определим состояние NFC Урок 1
 
        Intent intent = new Intent();
        intent.putExtra("state", StateNfc);
        setResult(RESULT_OK, intent);
        finish();
 
    }

Переход в настройки

Код в 1С:

&НаКлиенте
Процедура ВключитьОтключитьNFC(Команда)
	#Если МобильноеПриложениеКлиент Тогда 
		НовВз = Новый ЗапускПриложенияМобильногоУстройства();
		НовВз.Действие="ru.mp.intent.action.OnOffNFC";
		НовВз.Запустить(Истина);
	#КонецЕсли
КонецПроцедуры

Код в android studio:

    public  void ActionNFCSettings(){
        if (android.os.Build.VERSION.SDK_INT >= 16) {
            startActivity(new Intent(android.provider.Settings.ACTION_NFC_SETTINGS));
        } else {
            startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
        }
 
        this.finish();
    }

Тестовая запись

  @Override
    protected void onNewIntent(Intent intent) {
 
        //урок 3
        if(intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
            //android.widget.Toast.makeText(this, "NFC ТЕГ", Toast.LENGTH_SHORT).show();
 
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            NdefMessage ndefMessage = createNdefMessage("Android studio");
 
            writeNdefMessage(tag,ndefMessage);
            setResult(RESULT_OK);
            finish();
 
        }
    }

Записать

Код в 1С:

&НаКлиенте
Процедура ЗаписатьNFC(Команда)	
	#Если МобильноеПриложениеКлиент Тогда 
		НовВз = Новый ЗапускПриложенияМобильногоУстройства();
		НовВз.Действие="ru.mp.intent.action.WriteNFC";
		НовВз.ДополнительныеДанные.Добавить("textNFC", "Мобильная платформа 1С");
		НовВз.Запустить(Истина);
	#КонецЕсли	
КонецПроцедуры

Код в android studio:

    NfcAdapter nfcAdapter;
    public static String textNFC;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nfc_write);
 
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
 
        if (nfcAdapter != null && nfcAdapter.isEnabled()) {
 
        }else{
            android.widget.Toast.makeText(this, "NFC Выключено", Toast.LENGTH_SHORT).show();
            this.finish();
        }
 
        Intent intent = getIntent();
        textNFC = intent.getStringExtra("textNFC");
 
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
 
        if(intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
            //android.widget.Toast.makeText(this, "NFC ТЕГ", Toast.LENGTH_SHORT).show();
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
                NdefMessage ndefMessage = createNdefMessage(textNFC);
 
                writeNdefMessage(tag,ndefMessage);
                setResult(RESULT_OK);
                finish();
        }
    }

Тестировал только на Nexus 5 и на карте, которая поддерживает Ndef (ее хар-ки в изображениях).

Использовалась мобильная платформа 8.3.11, технологическая платформа 8.3.10

Содержимое архива:

1)  Два apk:

  • приложение на мобильной платформе 1С
  • приложение на android stuido

2) Конфигурация приложения 1С и архив проекта на android studio

Скачать файлы

Наименование Файл Версия Размер
Взаимодействие с NFC через мобильную платформу 1С:
.zip 48,60Mb
15.04.18
2
.zip 0.0.6 48,60Mb 2 Скачать

См. также

Комментарии
1. Алексей Шачнев (saa@kuzov.org) 15.04.18 12:00 Сейчас в теме
Здравствуйте!
Идея, безусловно, полезная, но взаимодействие мобильной платформы с нативными приложениями через Intent здесь давно описана с примерами и опробована.
Если Вы владеете и 1С и Java, очень прошу Вас написать внешнюю компоненту для мобильного приложения, делающую то же самое.
Технология описана на сайте ИТС.

Я не смог найти ни одного примера с исходниками, а так хочется иметь "печку", чтобы начать танцевать.
2. Владимир Очаковский (leobrn) 92 15.04.18 12:12 Сейчас в теме
(1) в идеале я и хотел видеть этот функционал через внешнюю компоненту , но пока не удалось полностью разобраться с этим
3. Константин Гейнрих (CyberCerber) 183 15.04.18 12:19 Сейчас в теме
4. Александр Плоткин (PloAl) 114 15.04.18 14:18 Сейчас в теме
В android, NFC тесно связан с текущей activity и получение данных в фоне неактивным activity невозможно.
Вышеописанное скорее всего сделано для безопасности приложений бесконтактной оплаты.
Из ВК, невозможно создать полноценную activity, с которым будет работать NFC.
IgorKissil; +1 Ответить
Оставьте свое сообщение