Запуск приложения мобильного устройства - что это?
Разработка - Мобильная разработка
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Добрый день.
Наконец у меня дошли руки до разбора нового функционала по мобильной платформе.
В частности, как вы поняли из заголовка статьи – речь пойдет о таком новом объекте, как ЗапускПриложенияМобильногоУстройства.
К сожалению, я не смогу в статье поделиться абсолютно всеми вещами, и добиться понимания читателем всей информации, так как тут будет слишком много специфики по Андроиду.
Но в любом случае попробую донести основную идею.
Итак, что это за такой интересный объект, вокруг которого крутится столько вопросов в инете, и нет ответов, а только догадки.
В двух словах – этот объект позволяет вызвать другое приложение из андроида, и получить ответ от него.
Например, вы можете открыть почту и передать в нее все нужные данные.
Давайте начнем с чего-то малого, но не менее интересного. К примеру – попробуем просканировать штрих-код при помощи камеры телефона, но не средствами 1С, а вызовем специальную программу.
Для этого необходимо установить на телефон программу вот эту.
Далее – создаем кнопку в 1С с вот такой функцией:
Процедура ПроверитьВзаимодействие(Команда)
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="com.google.zxing.client.android.SCAN";
Сообщить(НовВз.Запустить(Истина));
ДляКаждогоСтрИзНовВз.ДополнительныеДанныеЦикл
Сообщить(Стр.Ключ+" - "+Стр.Значение);
КонецЦикла;
КонецПроцедуры
Обновляем конфигурацию и нажимаем кнопку. У меня отображается вот такое окно:

Выбираем Сканер штрих-кодов и сканируем что-то, и видим ответ:

В ответ мы получили результат работы, тот что «-1», и получили результаты сканирования, а именно – штрих-код и тип штрих-кода.
Ну как? Интересно? Если да, то давайте будем копать глубже.
Тут нам однозначно поможет справка 1С, или не поможет?
ЗапускПриложенияМобильногоУстройства (MobileDeviceApplicationRun)
Свойства:
Данные (Data)
Действие (Action)
ДополнительныеДанные (AdditionalData)
ИмяКласса (ClassName)
Категория (Category)
Приложение (Package)
Тип (Type)
Методы:
Запустить (Run)
Описание:
Предназначен для запуска внешних приложений.
В отличие от метода ЗапуститьПриложение позволяет передать в приложение параметры.
Доступен только на устройствах под управлением операционной системы Android.
Из справки, нам стало понятно, что работает это все только на Андроид, ну в принципе ничего странного.
Идем дальше. У нас есть определенные свойства и есть один метод.
Давайте разберем некоторые свойства:
Данные – это URIссылка, помните, мы ранее уже говорили про это в вот этой статье. Т.е. если мы хотим запустить браузер, тот тут мы передаем адрес страницы.
Действие – тут мы с вами описывали то, что мы хотим от мобильной платформы. В справке 1С очень скромно про это написали. Но мы вернемся чуть позже.
Категория – это уточняющая информация для описания действия. Например, если это приложение может делать много чего, то вы указываете конкретно что вы хотите. Либо можно запустить приложение по умолчанию, если оно назначено.
На основании этих трех данных система будет искать – что бы запустить для нас. Можно и не заполнять некоторые из них, тогда просто будет выдаваться больше программ для работы с нашим действием.
Приложение - тут мы можем указать какое именно приложение (его идентификатор) мы хотим использовать для наших действий, например - "com.google.android.gm", в этом случае откроется Gmail.
ИмяКласса - указывается в паре с приложением, выудить его можно при декомпиляции программы в манифесте, ну или в мануале, если есть, в случае Gmail - "com.google.android.gm.ComposeActivityGmail".
Если казать только приложение или только имя класса - ничего не произойдет. Их есть смысл указывать только в том случае, если вы понимаете о чем идет речь :) При этом можно не указывать Категорию.
В версии 8.3.5.79 исправлен баг (№30010918):
Описание:
В мобильной платформе у обьекта ЗапускПриложенияМобильногоУстройства при вызове метода Запустить игнорируется свойство Приложение, если не установлено свойство ИмяКласса.
ДополнительныеДанные – это (типо) структура, в которой мы описываем все параметры для передачи нашему приложению. И в ЭТУ ЖЕ структуру возвращается ответ. Тут не стоит забывать про третий параметр, это тип данных, например, в случае работы с фото, или прикрепляя к письму вложения - мы должны указать Uri представление, так как 1С не значет что это такое, то мы указываем путь и третьим параметром указываем тип, например - "Uri".
Метод Запустить – на самом деле тут два метода. Если передаете в параметр Истина, то приложение может вернуть некий код своей работы. Вот как в браузере, если страница не найдена – возвращает код ошибки 404. Если же его переключить в режим Ложь, то он будет работать как индикатор успешного выполнения приложения, т.е. вернет Истину, если же была ошибка, то вернет Ложь.
Что же это все за данные и откуда их брать?
Если в двух словах, то программы на Андроиде могут создавать Намерения (Intent) и обрабатывать их.
Т.е., когда программа написана специальным образом, то при установке она создает ассоциации с некоторыми событиями и их обработкой. В 1С есть хороший аналог – Оповестить() и ОбработкаОповещения(), но только в случае 1С – это локально, а в случае Андроид – глобально.
И ясное дело, что должны быть соответствующие инструкции по работе с ними.
Идем на сайт разработчиков и читаем - https://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/Intents.java
Вот это определение доступных режимов. Например, можете попробовать вызвать вот такой экшн (действие) :
"com.google.zxing.client.android.SHARE"
Посмотрите, что будет.
Теперь давайте отправим почту, за основу я взял первую попавшуюся статью:
Первое на что я смотрю:
IntentemailIntent = newIntent(Intent.ACTION_SEND);
Теперь тут надо быть внимательней. Так как вот это Intent.ACTION_SEND сокращение от android.Intent.action.SEND, а 1С не понимает сокращений, так что не попадайтесь на такие детские ошибки.
Поэтому пишет вот так и тестируем.
Процедура ПроверитьВзаимодействие(Команда)
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="android.Intent.action.SEND";
Сообщить(НовВз.Запустить(Истина));
КонецПроцедуры
В ответ мы получим «0», и ничего не произойдет. Почему? Ну так все же очевидно, видь должно быть написано не:
android.Intent.action.SEND
а:
android.intent.action.SEND
Разве не понятно? J
Меняем регистр букв, и, о чудо – у нас открылась куча приложений, которые могут отработать это событие. Давайте уточним поиск, для этого укажем тип, но не тот, который в статье той, так как количество приложений не уменьшится, а вот такой:
НовВз.Тип="message/rfc822";
Теперь нажав кнопку – у нас откроется значительно меньше приложений.
Ну и можем выбрать Gmail.
Теперь давайте заполним что-то, ну, например, тему и тело письма. В том примере это делается вот так:
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
emailIntent.putExtra(Intent.EXTRA_TEXT , "body of email");
А вставить эти данные нам надо в ДополнительныеДанные. А это по сути массив структуры, где есть ключ и значение. И обратите внимание опять на сокращения.
Мы же должны написать вот так:
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.SUBJECT","Тема письма");
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.TEXT","Текст письма");
В итоге – открыв Gmail, там заполнятся эти поля. Кроме этого, если у вас установлен скайп, то можете попробовать это же выполнить с ним.
Итог
1С дала очень мощный механизм работы с ее продуктом. Это по сути реализация намерений из андроида, и пока, увы, 1С может выступать только как инициатор, но начало положено! Делать можно много чего при помощи этих функций, я указал лишь самые простые вещи, что бы показать суть, показав это вашему андроид программисту, вы сможете сэкономить часы, если не дни нахождения общего языка.
Дополнение
Как же без какого-то бонуса. А в качестве бонуса, я предлагаю вам поэкспериментировать с вот такой вот программкой, которую мой товарищ накатал за два часа. Делает она следующее – выводит сообщение, или делает пуш сообщение.
При чем в отличии от вот этой утилиты, которую мы написали ранее, когда еще не было этих функций в 1С, вам не надо запускать никакие сервисы, и вообще этой утилиты видно не будет, только в приложениях, так как она не имеет интерфейса.
Работать с ней вот так:
Процедура ПроверитьВзаимодействие(Команда)
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="com.ditrix.ownaction.SHOW_TOAST"
НовВз.ДополнительныеДанные.Добавить("com.ditrix.ownaction.EXTRAS_MESSAGE","Данные");
Сообщить(НовВз.Запустить(Истина));
Для Каждого Стр ИзНовВз.ДополнительныеДанные Цикл
Сообщить(Стр.Ключ+" - "+Стр.Значение);
КонецЦикла;
КонецПроцедуры
Это для простого сообщения, а вот это действие для пуша:
"com.ditrix.ownaction.SHOW_NOTIFICATION"
При этом вам вернется ответ в виде 3 данных разных типов.
Удачи!
Фабрика знаний
Тут будут писаться примеры реализации тех или иных механизмов.
Как сделать фото (видео) в любом качестве?
Учтите - работает не везде, зависит от приложения, при помощи которого делается фото. У меня на Cyan прошивке - все отрабатывало нормально.
//Тут указываем путь, при чем путь должен быть доступен всем программам, так что временные файлы 1С не подйут
ФайлКартинки = "file:///sdcard/Download/FotoTestFrom1C.bmp";
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.media.action.IMAGE_CAPTURE");
//Обязательно указываем этот параметр, если его не указать, тогда вам вернется привью файла в низком качестве и находится он будет в параметрах с ключем data.
НовВз.ДополнительныеДанные.Добавить("output",ФайлКартинки,"Uri");
//Если фото не сделано, то ответ будет "0"
Если НовВз.Запустить(Истина) 0 Тогда
//ну а тут уже готовое фото, так что все что хотим, то и делаем.
ЗапуститьПриложение(ФайлКартинки);
Иначе
Сообщить("Фото не сделано!");
КонецЕсли;
Как отправить файл в разные программы? Спасибо Снежане
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.SENDTO";
НовВз.Данные = "mailto:test@test.ru";
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.STREAM","file:///storage/emulated/0/Снежана/CDAInfo.txt","Uri");
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.SUBJECT","Тема письма");
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.TEXT","Теекст-текст-текст");
НовВз.Запустить(Истина);
Как отправить файл только по почте? Спасибо Снежане
Должен быть установлен клиент Gmail
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.SEND";
НовВз.Данные = "test@test.ru";
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.STREAM","file:///storage/sdcard0/DCIM/Camera/20140829_115820.jpg","Uri");
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.SUBJECT","Тема письма");
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.TEXT","Теекст-текст-текст");
НовВз.Тип = "text/plain";
//чтобы сразу Gmail открывался
НовВз.Приложение = "com.google.android.gm";
НовВз.ИмяКласса = "com.google.android.gm.ComposeActivityGmail";
//
НовВз.Запустить(Истина);
Пример работы с Viber'ом. Спасибо Снежане
//Открывает вайбер
НовВз.Действие = "com.viber.voip.action.CONVERSATION";
//или
НовВз.Действие = "com.viber.voip.action.MESSAGES";
//Открывает список контактов в вайбере
НовВз.Действие = "android.intent.action.CALL_BUTTON";
//открывает диалог с конкретным человеком в вайбере
НовВз.Действие = "android.intent.action.SENDTO";
НовВз.Данные = "smsto:+380965336452";
НовВз.Приложение = "com.viber.voip";
НовВз.ИмяКласса = "com.viber.voip.SystemDialogActivityPublic";
//Отправить текст по вайберу, предлагает выбрать, кому отправлять, потом сразу отправляет
НовВз.Действие = "android.intent.action.SEND";
НовВз.Приложение = "com.viber.voip";
НовВз.ИмяКласса = "com.viber.voip.WelcomeShareActivity";
НовВз.Тип = "text/plain";
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.TEXT","ТЕКСТ: Теекст-текст-текст");
//Отправить фото по вайберу, предлагает выбрать, кому отправлять
НовВз.Действие = "android.intent.action.SEND";
НовВз.Приложение = "com.viber.voip";
НовВз.ИмяКласса = "com.viber.voip.WelcomeShareActivity";
НовВз.Тип = "image/jpeg";
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.STREAM","file:///storage/emulated/0/DCIM/100ANDRO/DSC_0001.jpg","Uri");
//Открыть контакт в вайбере
НовВз.Действие = "android.intent.action.VIEW";
НовВз.Данные = "tel:+380965336452";
НовВз.Приложение = "com.viber.voip";
НовВз.ИмяКласса = "com.viber.voip.WelcomeShareActivity";
Еще можно открыть контакты устройства и выбрать конкретный контакт, но вот проблема в том, что получаем в итоге Uri-ссылку на контакт, а 1С с ней ничего сделать не может... а хотелось бы данные вытянуть.
Написали в пожелания создание Локального ключа контакта на основании Uri-ссылки.
Спасибо Снежане
// Выбор контакта
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "android.intent.action.PICK";
Запуск.Тип = "vnd.android.cursor.dir/contact";
Запуск.Запустить(Истина);
Строка = Запуск.Данные;
//Открытие по ссылке
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "android.intent.action.VIEW";
Запуск.Данные = Строка;
Запуск.Запустить(Истина);
Как правильно указывать путь к файлам? Спасибо Вадиму
Когда мы сохраняем файл средствами моб платформы через
КаталогВременныхФайлов() + "sticker.pdf"
То этот файл недоступен другим приложениям. Можно писать так:
"file:///sdcard/sticker.pdf"
но теоретически карты памяти может и не быть. Поэтому есть более методически правильный метод:
КаталогДокументов() + "sticker.pdf";
Как выбрать файл нужного типа, при помощи менеджера файлов?
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.GET_CONTENT";
//Указываем тип искомых файлов, нас интересует только фото
НовВз.Тип = "image/*"; //"file/*"; //"*/*"
//Говорим что интересуют только локальные данные, а не облачные
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY",Истина);
РезультатРаботы = НовВз.Запустить(Истина);
Если НЕ РезультатРаботы Тогда
Сообщить("Файл не выбран!");
Возврат
КонецЕсли;
ПутьКФайлу = НовВз.Данные;
Как обрезать выбранное фото?
НовВз = Новый ЗапускПриложенияМобильногоУстройства("com.android.camera.action.CROP", ПутьКФайлу);
НовВз.Тип = "image/*";
НовВз.ДополнительныеДанные.Добавить("return-data", true);
РезультатРаботы = НовВз.Запустить(Истина);
Если НЕ РезультатРаботы Тогда
Сообщить("Фото не обработано!");
Возврат
КонецЕсли;
ФайлВр = ПолучитьИмяВременногоФайла("jpg");
НовВз.ДополнительныеДанные.Получить("data").Значение.Записать(ФайлВр); // тут и будет сама картинка, которую можно запихнуть в 1С
ЗапуститьПриложение(ФайлВр);
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Мобильная разработка Сканер штрих-кода Терминал сбора данных 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)
Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.
3050 руб.
03.12.2018 72952 250 108
Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)
Простой мобильный ТСД (терминал сбора данных) сканер для 1С для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически. Решение предназначено для считывания штрихкодов, а не для их создания и печати.
3050 руб.
22.04.2019 124969 739 207
Сканер штрих-кода Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Терминал сбора данных Мобильная разработка Разработчик Пользователь 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Управленческий учет Платные (руб)
Android смартфон как беспроводной сканер штрих-кодов, QR-кодов (2D), терминал сбора данных (ТСД), подписка на штрих-код Комбайн
2196 руб.
18.01.2017 152703 235 237
Мобильная разработка Бесплатно (free)
Android-клиент: конструктор и выполнение запросов 1С по HTTP к опубликованной базе. Часть экосистемы КонфигРедактор.
06.10.2026 1922 54 aleksandrboldyusov 0
Мобильная разработка Разработчик 1С 8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)
Эта подключаемая обработка для любой конфигурации 1С, позволяет отправить любой объект (и рекуррентно связанные с ним объекты) на устройства c NodaLogic, где они будут полнофункциональны и доступны офлайн, по ним можно вести переписку как со стороны чата в NodaLogic, так и со стороны 1С, заполнять данные и загрузить в 1С по мере надобности. Т.е. обработка содержит генератор UI/UX интерфейса NodaLogic и создает объекты для обмена. При этом не надо ни разбираться в NodaLogic вообще, ни иметь базу/сервер/решение на стороне NL – только учетка и мобильное устройство, а со стороны 1С достаточно галочками отметить, какие поля должны быть на формах. Все данные хранятся в ХранилищеОбщихНастроек, поэтому никакого расширения не нужно, сервера со стороны 1С для связи с устройствами тоже не нужно. Тестировалось на 1С:Предприятие 8.3 (8.3.27.1326), 1С:Комплексная автоматизация 2 (2.4.8.63)
1 стартмани
12.05.2026 1578 6 informa1555 1
Мобильная разработка Разработчик Бесплатно (free)
Мне нужен был высокопроизводительный язык для фронт-сайда, я его сделал, а потом подумал, а что, если сделать 1С-синтаксис? Вот что из этого вышло. Продолжение статьи https://infostart.ru/1c/articles/2614496/
12.03.2026 2865 informa1555 11
Мобильная разработка Разработчик 1С 8.3 1С:Комплексная автоматизация 2.х 1С:КА Управленческий учет Абонемент ($m)
В этой статье простейший документ - ориентированный пример складского учета на клиент-серверной платформе NodaLogic с автономными мобильными рабочими местами. Это чисто скелетный пример как можно вынести часть учета во внешний контур. И расширение - модуль связи с 1С. Тестировалось на платформе 1С:Предприятие 8.3 (8.3.27.1326), 1С:Комплексная автоматизация 2 (2.4.8.63).
1 стартмани
13.02.2026 4158 informa1555 5
WEB-интеграция Мобильная разработка Разработчик 1С:Предприятие 8 1С:Библиотека стандартных подсистем Россия Бесплатно (free)
Бесплатное приложение для интеграции веб-клиента 1С с Android-устройством. Просто установите, укажите веб-адрес вашей базы 1С - и пользуйтесь привычным интерфейсом с расширенным доступом к функциям устройства: лазерный и имидж-сканер ТСД, сканер штрихкода камерой, GPS, Bluetooth, фотокамера, NFC и многое другое.
05.08.2025 4722 221 OneScan 25
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите файл";
ДиалогВыбора.Показать(Оповещение);
Ну вот на офф сайте
(6) теперь ждем момента, когда 1с сможет быть сервером броэдкаста, а то посылать она оповещения то может, а вот прослушивать - нет. А как было бы круто :)
Присылаешь линк, как в уф, на товар или накладную - открывается 1с с этим товаром/накладной :)
//Тут указываем путь, при чем путь должен быть доступен всем программам,
// так что временные файлы 1С не подйут
ФайлКартинки = КаталогДокументов()+"MobileFoto.jpg";
// без замены слешей не сохраняет нормально
ФайлКартинки = СтрЗаменить(ФайлКартинки,"\","/");
// делаем как бы ссылку на файл для андроида
ФайлКартинки = "file://" + ФайлКартинки;
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.media.action.IMAGE_CAPTURE");
//Обязательно указываем этот параметр, если его не указать,
// тогда вам вернется привью файла в низком качестве
// и находится он будет в параметрах с ключем data.
НовВз.ДополнительныеДанные.Добавить("output",ФайлКартинки,"Uri");
//Если фото не сделано, то ответ будет "0"
Рез = НовВз.Запустить(Истина);
// а тут нормально обращение к файлу. Без этого вылетает ошибка, что файл не обнаружен
ФайлКартинки = СтрЗаменить(ФайлКартинки,"file://","");
// сохраняем в справочник на смартфоне, для последующей выгрузки
Фото_СохранитьСнимок(Неопределено,
Новый ДвоичныеДанные(ФайлКартинки),
Неопределено,
Неопределено
);
&НаСервере
Процедура Фото_СохранитьСнимок(ФотоСсылка,ДвоичныеДанные,РасширениеФайла,ТипСодержимого)
Если ФотоСсылка = Неопределено Тогда
Фото = Справочники.ФотоДляСлужебок.СоздатьЭлемент();
Фото.Наименование = Формат(ТекущаяДата(),"ДФ='yyyy.MM.dd HHmmss'") + "[Нов. фото]";
Фото.ИмяФото = Формат(ТекущаяДата(),"ДФ='yyyy.MM.dd HHmmss'") + ".jpg";
иначе
Фото = ФотоСсылка.ПолучитьОбъект();
КонецЕсли;
Фото.ДатаФото = ТекущаяДата();
Фото.РасширениеФото = РасширениеФайла;
Фото.ТипСодержимогоТекст = ТипСодержимого;
// для отлаки
Если ДвоичныеДанные = Неопределено Тогда
Фото.ХранилищеФото = Новый ХранилищеЗначения(Неопределено);
иначе
Фото.ХранилищеФото = Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
КонецЕсли;
Фото.ЕстьФото = Истина;
Фото.Родитель = Фото_ТекущаяСлужебка;
Фото.Записать();
КонецПроцедуры
Показать&НаКлиенте
Процедура Сообщения(Команда)
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.SEND";
Сообщить(НовВз.Запустить(ложь));
КонецПроцедурыМетод "Запустить" выдает всегда Ложь (или 0, в зависимости от параметра метода)
Попробовал примеры из статьи. Поставил прогу для штрих-кодов, запустил команду, да, сработало.
Но не работает команда "android.intent.action.SEND". При этом установлен тот же GMail, смотрел в его манифесте, там эта команда в интентах есть. Не знаете, в чем может быть дело?
Процедура ПроверитьВзаимодействие(Команда)
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="android.intent.action.SEND";
Сообщить(НовВз.Запустить(Истина));
КонецПроцедуры Показать?
Что вам в ответ приходит?
Давайте тогда уточним все:
1. Версия андроид
2. Версия 1С
3. Название устройство
4. На скольки устройствах тестировали
5. Вы точно именно так писали? С учетом регистров и без своих каких-либо добавлений? На всякий случай скопируйте этот код и проверьте еще раз. Дабы был чистый эксперимент.
1. Андроид 4.0.4
2. 1С 8.3.5.1146
3. Huawei MediaPad 10 FHD
4. Пока на одном
5. Писал именно так, сто раз перепроверял, копировал из Манифеста.
Конечно, ус-во - китайщина, но разве может железо повлиять на работу этих механизмом. Тем не менее, постараюсь сегодня проверить на других девайсах.
Но у меня получилось по-другому! Добавил строчку из примера НовВз.Тип="message/rfc822";
Открылся выбор Gmail и Bluetooth. Почему так, не можете подсказать? И откуда брать эту инфу о типе?
О, спасибо за примеры. В общем, понял, что нужно изучать Манифесты приложений.
А никто не пробовал открыть из 1С картинку на редактирование, сделать там какие-то пометки и закрыть, сохранив? Не могу найти удобные редакторы/рисовалки, которые с Интентами работают.
Делаю фотку средствами 1С, сохраняю в базу и привязываю к нужному объекту. По сути встроенным и средствами все работает, но фотографии получаются довольно большие (мне бы хватило разрешения 800*600).
Можно ли это реализовать вашим методом?.
Собственно проблемы следующие:
1. Хочу с мобильного приложения создать десяток xml-ек. Запаковать в zip. Отправить по почте.
2. Хочу подключиться к ftp, передать туда десяток файлов или если получится запаковать в архив то передать архив.
Ни первое ни второе не работает.
upd: в тонком клиенте файлы на фтп передаются (в т.ч. каталоги создаются). А вот с мобильного лажа ;(
upd2: Код следующий:
СоздатьКаталог("ftp://login:pass@ip/ИмяКаталога/");Ошибка следующая:
Каталог не знайдено 'ftp://login:pass/ip/ИмяКаталога': Помилка роботи з інтернет: must not be null.
Я уже и / и \ пробовал. Толку ноль. Ошибка одна и та же.
Я подключался по пути "СоздатьКаталог("ftp://login:pass@ip/ИмяКаталога/");"
Думал нет объекта но подключиться можно.
А как на счет вызова программы которая запакует несколько файлов?
В Манифесте приложения есть секция activity с intent-filter. Вот действия оттуда срабатывают.
А вот отправляю команду, которая находится в секции receiver с intent-filter - ничего не происходит.
Если через adb shell отправляю команду "am broadcast -a <описание.команды>", то все работает.
Получается, 1С этого еще не умеет?
О, вижу, вы выложили разработку Acode tools! Как я понимаю, через нее можно реализовать и это.
file:///sdcard/Download/FotoTestFrom1C.bmp - это URI
/sdcard/Download/FotoTestFrom1C.bmp - а это просто путь или path.
uri - Universal resource Identifier.
Эта штука включает в себя:
- схему доступа
- путь к элементу
- идентификатор элемента
т.е. например к записи в БД ты можешь создать uri.
Типичный URI:
jdbc:mysql://localhost/niflheim?useUnicode=true&characterEncoding=utf-8
А path это путь к объекту файловой системы.
Андроид обычно работает с uri, так как он должен понимать - вы указали путь к файлу, или это путь к записи в бд.
Если привести анологию в 1С, то в 1С есть такая фишка, как ссылка на объект.
К примеру:
e1cib/data/Справочник.Пользователи?ref=8259005056c0000811e4723249a21e41 - это путь к элементу справочника, в котором указывается, что это конкретно справочник, и не просто справочник, а вполне определенный справочник, или в андроиде - это URI
С другой стороны:
8259005056c0000811e4723249a21e41 - это просто ID, или в андроиде - path.
Вы если хотите обратиться к элементу, вы не можете просто взять указать ID и получить объект, вам надо указать - что это за объект.
Вот тут тоже самое. Т.е. когда вы делаете запись фото - вы должны указать для андроида uri, тогда он поймет, что это файл и где он лежит.
С другой стороны, когда вы получаете файл из 1С, то 1С уже и сама знает, что работать вы будете только с файлом и все.
Поэтому ей достаточно указать просто путь, а вот уже сама 1С, внутри своей системы - по этому пути получит uri и будет с ним работать.
Надеюсь я понятно объяснил?
Кандидат в "Фабрику знаний" - вкл / выкл приемник GPS
// GPS On
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "android.location.GPS_ENABLED_CHANGEPICK";
Запуск.Данные = "enabled:true";
Запуск.Запустить(Истина);
// GPS Off
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "android.location.GPS_ENABLED_CHANGEPICK";
Запуск.Данные = "enabled:false";
Запуск.Запустить(Истина); ПоказатьКод есть, но как его прикрутить к 1С ?
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Но есть проблема с размером картинки. У меня приложение "Камера", которое автоматически вызывается, позволяет установить минимальное разрешение 1 Мпикс. И файл изображения получается большой. Как его можно уменьшить?
И при запуске - у вас будет вопрос - что выбрать. Выберите камеру и скажете что бы выбиралось всегда по умолчанию.
Либо можно доп параметрами указать конкретное приложение, как это сделать - указано в статье
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.speech.action.RECOGNIZE_SPEECH");
Результат = НовВз.Запустить(Истина);
Если Результат = 0 Тогда
Возврат;
КонецЕсли;
ГолосоваяКоманда= НовВз.ДополнительныеДанные.Получить("query").Значение;
Нельзя ли, например, поставить стороннюю клавиатуру и вызвать событие "Enter" или "Tab"?
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide(); ПоказатьМожно ли этот код выполнить из 1С?
В приложении это видно. При правке манифеста единственное, что меняется - скрывается статусбар
Ну а где сама утилита для реализации кода?
Процедура ПроверитьВзаимодействие(Команда)
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="com.ditrix.ownaction.SHOW_TOAST"
НовВз.ДополнительныеДанные.Добавить("com.ditrix.ownaction.EXTRAS_MESSAGE","Данные");
Сообщить(НовВз.Запустить(Истина));
Для Каждого Стр ИзНовВз.ДополнительныеДанные Цикл
Сообщить(Стр.Ключ+" - "+Стр.Значение);
КонецЦикла;
КонецПроцедуры ПоказатьЭто для простого сообщения, а вот это действие для пуша:
"com.ditrix.ownaction.SHOW_NOTIFICATION"
При этом вам вернется ответ в виде 3 данных разных типов.
Извиняюсь просмотрел всё работает корректно!
Если я правильно понял скачиваю ваши исходники меняю там иконку компилирую и будет другая иконка?
А есть пример, что сделать с этой штукой:
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.GET_CONTENT";
Что возвращает, как вытащить расширение и.т.д.?
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.GET_CONTENT";
//Указываем тип искомых файлов, нас интересует только фото
НовВз.Тип = "image/*"; //"file/*"; //"*/*"
//Говорим что интересуют только локальные данные, а не облачные
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY",Истина);
РезультатРаботы = НовВз.Запустить(Истина);
Если НЕ РезультатРаботы Тогда
Сообщить("Файл не выбран!");
Возврат
КонецЕсли;
ПутьКФайлу = НовВз.Данные;
ПоказатьНо я понимаю он возвращает uri, а как из него получить двоичные данные? Если можно пример?
Если URI - Путь к файлу, тогда должно работать
ДвоичныеДанные = Новый ДвоичныеДанные(НовВз.Данные);
Но не работает пишет "Недопустимое значение параметра №1"
Попробовал:
Картинка = Новый Картинка(НовВз.Данные);
СтрокаПуть = Картинка.ПолучитьДвоичныеДанные();
Выдаёт Файл не обнаружен "file://content://external/images/media/10466"
В примерах посмотрел с картинкой примера нет, если только не прописывать строкой ФайлКартинки = "file:///sdcard/Download/FotoTestFrom1C.bmp";
Подскажите куда копать?
if(resultCode==RESULT_OK){
String FilePath = data.getData().getPath();
textFile.setText(FilePath);
}
А ни как нельзя этот getPath() в каких-нибудь свойствах ЗапускПриложенияМобильногоУстройства тоже прикрутить?
ФайлКартинки = "file:///sdcard/DCIM/FotoTestFrom1C.jpg";
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.media.action.IMAGE_CAPTURE");
НовВз.ДополнительныеДанные.Добавить("output",ФайлКартинки,"Uri");
НовВз.Запустить(Истина);
Чтобы он в галерее отображался? А то у меня физически есть а в галереи нету?
Смысл в следующем, код работает и файл сохраняет, но при этом захожу в галерею андроида, его там нет! Через total commander - есть! Вы в андроиде больше понимаете, скорей всего есть какой-то параметр, который надо подключить, чтобы в галерее отображался!
&НаКлиенте
Процедура ДобавитьКартинку(Команда)
ИмяФайла = "";
ПутьФайла = "";
//Вызываем Диалоговое окно и помещаем файл Картинки из локальной файловой системы во временное хранилище
Если ПоместитьФайл(ПутьФайла, , ИмяФайла, Истина) = Истина Тогда
//в строковый реквизит ФОТО нашей формы сохраняем ссылку на Картинку во временном хранилище
Фото = ПутьФайла;
//для создания нового элемента в Справочнике Файлы и записи Картинки в его реквизит Файл
//переходим на сервер с помощью вызова серверной процедуры
УстановитьКартинку();
КонецЕсли;
//условие ЕСЛИ нужно для того, чтобы если пользователь отказался от выбора файла
//мы не вызывали серверную процедуру УстановитьКартинку()
#Если МобильноеПриложениеКлиент Тогда
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.GET_CONTENT";
//Указываем тип искомых файлов, нас интересует только фото
НовВз.Тип = "image/*"; //"file/*"; //"*/*"
//Говорим что интересуют только локальные данные, а не облачные
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY",Истина);
РезультатРаботы = НовВз.Запустить(Истина);
Если НЕ РезультатРаботы Тогда
Сообщить("Файл не выбран!");
Возврат
КонецЕсли;
ПутьКФайлу = НовВз.Данные;
Если ПоместитьФайл("что вписать сюда?", , Истина) = Истина Тогда
Фото = "что вписать сюда?";
УстановитьКартинку();
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура УстановитьКартинку()
//создаем новый элемент в Справочнике Файлы
НовыйФайлКартинки = Справочники.Файлы.СоздатьЭлемент();
//в реквизит СправочникаФайлы Файл помещаем выбранную ранее Картинку
НовыйФайлКартинки.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Фото));
Фото = ПоместитьВоВременноеХранилище(НовыйФайлКартинки.Файл.Получить());
//записываем новый элемент справочника Файлы
НовыйФайлКартинки.Записать();
//устанавливаем значение реквизита Картинка Справочника Сотрудники
Объект.Картинка = НовыйФайлКартинки.Ссылка;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//отображение картинки при открытии формы справочника
Фото = ПолучитьНавигационнуюСсылку(Объект.Картинка, "Файл");
//устанавливаем автомасштаб для картинки
Элементы.Фото.РазмерКартинки = РазмерКартинки.АвтоРазмер;
КонецПроцедуры
ПоказатьНапишите внятно :) Вам проблема понятна, а мне нет.
По пунктам.
1. Не отображается где? В самой форме?
2. Какие значения в переменных? Например, какой путь у фото получается. Прочитайте в этой же статье 70 комментарий и ниже.
3. Что значит при добавлении компа? Вы фото синхронизируете? Или что?
Идеальный вариант - дайте просто обработку, в которой четко понятно, что вы хотите сделать, и что не получается.
Есть обходное решение: вызвать после выбора файла crop, но это лишнее действие + например на sony compact z3 не пашет, на asus пашет.
Прошу прощения, а как, на подобии описанного в статье примера, сделать массовое (непрерывное) сканирование?
Заранее благодарен.
ориентировался по ссылкам:
Вот так получилость открыть чат с контактом:
НовВз.Действие = "android.intent.action.VIEW";
НовВз.Данные = "skype:"+ИМЯКОНТАКТА+"?chat";
НовВз.Приложение = "com.skype.raider";
НовВз.ИмяКласса = "com.skype.raider.Main";Потом, делал так:
НовВз.Действие = "android.intent.action.SEND";
НовВз.Данные = "skype:"+ИМЯКОНТАКТА+"?chat";
НовВз.Приложение = "com.skype.raider";
НовВз.ИмяКласса = "com.skype.raider.Main";
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.TEXT", Сообщение);но попадаю на выбор контактов, хотя после выбора сообщение сразу отправляется.
Хотя, неисключенно, что через одно место сделать можно.
Окно для фотографирования появляется, делаешь снимок. Преходит на следующие окно с крестиком и галкой (в стандартной камере этого экрана нет). Нажимаешь на галку и ничего не происходит.
Будто не получает событие завершения снимка. Но фотографии в галерии видны.
Если нажать на крестик, то выдает ошибку "Файл не обнаружен". Интересно, что пишет "file" 2 раза. Первый раз через "//", а второй "///"
Что означают "///"?.
Есть пример на JAVA - под коду оператора
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();
Не подскажете, есть ли вариант выполнить этот код в мобильном приложении на 1С?
ФайлКартинки= "file:///sdcard/DCIM/Camera/"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy_HH_mm")+".jpg";
//ФайлКартинки="";
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="android.media.action.IMAGE_CAPTURE";
НовВз.ДополнительныеДанные.Добавить("OUTPUT",ФайлКартинки,"Uri");
Если НовВз.Запустить(Истина) <> 0 тогда
Сообщить("Сделано фото, помещено в:"+СокрЛП(ФайлКартинки));
Иначе
Сообщить("Фото не сделано!");
КонецЕсли;
Android 6.0 платформа 1c 8.3.6.215. В чем может быть проблема - непонятно мне
Действие = "android.settings.SETTINGS"; // общие настройки
Действие = "android.settings.DATE_SETTINGS"; // настройки даты и времени
Действие = "android.settings.WIFI_SETTINGS"; // настройки Wi-Fi
Действие = "android.settings.DATA_ROAMING_SETTINGS"; //SIM-карты и мобильные сети
Действие = "android.net.vpn.SETTINGS"; // открыть настройки VPN
//открывает диалог с конкретным человеком в вайбере
НовВз.Действие = "android.intent.action.SENDTO";
НовВз.Данные = "smsto:+380965336452";
НовВз.Приложение = "com.viber.voip";
НовВз.ИмяКласса = "com.viber.voip.SystemDialogActivityPublic";
Нет ли у кого имени класса для такого же действия в Watsap? Или может подскажете где посмотреть? :)
С Whatsapp получилось:
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.SENDTO";
НовВз.Данные = "smsto:" + Параметры.НомерТелефона;
НовВз.Приложение = "com.whatsapp";
НовВз.Запустить(ложь);А вот Viber ни в какую не хочет...
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.SENDTO";
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.TEXT", "Привет из 1С");
НовВз.Тип = "text/plain";
НовВз.Приложение = "com.whatsapp";
НовВз.Данные = "smsto: + "НомерТелефона";
НовВз.Запустить(Истина);В связи с новыми политиками android конструкция
ДополнительныеДанные.Добавить( "output", файлКартинки, "Uri" )По всей видимости вызвано это с необходимостью использовать FileProvider для корректного доступа к общим фалам и папкам.
Подскажите, возможно уже кто то разобрался с этой проблемой?
Добился только открытия карт таким кодом:
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="android.intent.action.VIEW";
Сообщить(НовВз.Запустить(Истина));
Антиспам ; Reader ; Google Ассистент ; TotalCmd(Quee) ; Карты ; PrimeScanner ; WPS Office ; Телефон ; Просмотр мероприятия ; Общие ; Форум MIUI . Другое дело, что все они дальше выдают ошибки, так как дальнейшее взаимодействие не определено , и только "Карты" действительно открываются
Пожалуйста, объясните мне в чём моя ошибка, ибо написал такой код:
НовВз.Действие="com.manateeworks.barcodescanners.BARCODESCANNERS";
а он не работает и просто висит...
&НаКлиенте
Процедура BarcodeScanner423(Команда)
// НЕ РАБОТАЕТ и где ошибка?
#Если МобильноеПриложениеКлиент Тогда
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="com.manateeworks.barcodescanners.BARCODESCANNERS";
НовВз.Запустить(Истина);
Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл
Сообщить(Стр.Ключ+" -<|>- "+Стр.Значение);
КонецЦикла;
#КонецЕсли
КонецПроцедуры
Процедура СканерШтрихКодов477(Команда)
// РАБОТАЕТ
#Если МобильноеПриложениеКлиент Тогда
НовВз=Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="com.google.zxing.client.android.SCAN";
НовВз.Запустить(Истина);
Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл
Сообщить(Стр.Ключ+" -<|>- "+Стр.Значение);
КонецЦикла;
#КонецЕсли
КонецПроцедуры Показать. Запустить App Detective, выбрать
нужную программу и прочитать её файл AndroidManifest.xml
Большое спасибо автору и комментаторам за статью.
Меня очень интересует как можно открыть камеру, чтобы получить фото без его предварительного просмотра и подтверждения. А чтобы сразу, нажал на кнопку фото и фото ушло в приложение.
Посмотрел, что на Android это реализуют следующим образом:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("android.intent.extra.quickCapture",true);Но добавление строки:
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.quickCapture", Истина);ожидаемого результата не дает.
Причем, если делать фото стандартными средствами, то окно фотографирования закрывается само, без подтверждения. Но мне такой вариант не подходит, т.к. использую стороннее приложение.
СредстваМультимедиа.СделатьФотоснимок(ТипКамерыУстройства.Задняя);Может кто-то решил подобную задачу?
З.Ы.: Стандратная функция 1С "СредстваМультимедиа.СделатьФотоснимок()" на Асусе падает с ошибкой, а на Xiaomi лагает
Возможно, нужно какие-то входные параметры передавать перед вызовом приложения..
Само по себе это приложение сканирует шустрее чем 1Сное, но "поштучное" сканирование сводит все на нет (
Требуется Ваша помощь.
Произвожу запись звука встроенными средствами 1С вот таким кодом:
Мультимедиа = СредстваМультимедиа;
Если Мультимедиа.ПоддерживаетсяАудиозапись()
Тогда Результат = Мультимедиа.СделатьАудиозапись();
Иначе Сообщить("Не поддерживается аудио запись!");
КонецЕсли;
Все вроде нормально, звук пишется, записывается в файл, но до тех пор, пока пользователь не свернет приложение. Если свернуть 1С на момент записи, а после развернуть, на экране счетчик времени будет в значении -5 сек и запись прервется.
В сборщике приложений явно указано, что фоновая запись не поддерживается.
Решил перейти на intent'ы, чтобы 1С вызывала намерение записи, передавала параметры, запускала запись, после этого останавливала запись с сохранением файла. Так как будет работать другое ПО, сворачивание 1С по идее не должно вызывать остановку записи.
Проблема в том, что не могу найти способ или описание, как это сделать намерением :(
Вот ссылка на неплохое описание:
Но привязать это описание к 1С у меня не получается.
Может быть кто-то уже сталкивался с данным вопросом?
Был бы очень благодарен за помощь! :)
Из указанной ссылки в 1С это вот так:
intent = Новый ЗапускПриложенияМобильногоУстройства();
intent.Действие = "MediaStore.Audio.Media.RECORD_SOUND_ACTION";
EXTRA = Новый ДополнительныеДанныеЗапускаПриложенияМобильногоУстройства;
EXTRA.Добавить("RQS_RECORDING", 1);
intent.Запустить(Истина);НП = Новый ЗапускПриложенияМобильногоУстройства("android.provider.MediaStore.RECORD_SOUND");Запуск нормальный, если свернуть приложение, запись останавливается, не важно, встроенный ли диктофон, или установленный (я, например, использовал )
То есть при сворачивании окна 1С отрубает "все связи с внешним миром".
Может быть кто нибудь сумел это победить?
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
У меня цель открыть PDF из приложения на определенной странице или метке.
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
Запуск.Действие = "android.intent.action.VIEW";
Запуск.тип = "application/pdf";
Запуск.Данные = ПутьКФайлу + "#page=4";
Запуск.ДополнительныеДанные.Добавить("android.intent.extra.page",4);
Запуск.Запустить(Истина);
Показатьпопробовал вот так, через выбор нескольких приложений, но без успешно PDF открывается в любом приложении на 1 странице.
Как выбрать изображение/фотографию на Android из мобильной 1С:
ВыборФото = Новый ЗапускПриложенияМобильногоУстройства();
ВыборФото.Действие = "android.intent.action.PICK";
//Указываем тип искомых файлов, нас интересует только фото
ВыборФото.Тип = "image/*"; //"file/*"; //"*/*"
РезультатРаботы = ВыборФото.Запустить(Истина);Если НЕ РезультатРаботы Тогда
ПоказатьПредупреждение(, "Фотография не выбрана");
Возврат
КонецЕсли;
Попытка
Картинка = Новый Картинка(Новый ДвоичныеДанные(ВыборФото.Данные));
Исключение
Инфо = ИнформацияОбОшибке();
ВызватьИсключение "Выбранный файл не является картинкой";
КонецПопытки; ПоказатьЕсть одна проблема. Фотография приходит в полном разрешении, а у современных телефонов оно может быть громадным. Я попытался его уменьшить, но встроенные в платформу средства, судя по справке не доступны, пытаюсь решить средствами Андроид.
Написал вот тваой код:
CropApp = New MobileDeviceApplicationRun("com.android.camera.action.CROP");
CropApp.Data = FileName;
CropApp.Type = "image/*";
CropApp.AdditionalData.Add("scale", "true");
CropApp.AdditionalData.Add("aspectX", 1);
CropApp.AdditionalData.Add("aspectY", 1);
CropApp.AdditionalData.Add("outputX", 128);
CropApp.AdditionalData.Add("outputY", 128);
CropApp.AdditionalData.Add("return-data", true);
Res = CropApp.Run(True);
ПоказатьПриложение открывается, загружается фото, но при нажатии сохранить оно какбы подвисает и не возвращает значение. Может есть идея как победить?
У меня есть подозрение, что может быть недоступен путь для записи, я использую рекомендуемую форму пути:
FileName = КаталогДокументов()+"MobileFoto.jpg";
// без замены слешей не сохраняет нормально
FileName = СтрЗаменить(FileName,"\","/");
// делаем как бы ссылку на файл для андроида
FileName = "file://" + FileName;
/mnt/sdcard/Android/data/com.e1c.mobile/files/
/storage/emulated/0/Android/data/com.e1c.mobile/files/
Т.е. в качестве каталога документов, 1С возвращает путь к своей папке в каталоге общего доступа (на SD карте или на виртуальной SD карте), а значит (особенно если Android свежий), есть вероятность что в ту папку не может получить доступ другое приложение, от того оно и виснет.
Варианта вижу три:
1) Указывать путь к какой-то созданной папке, вне папки data (Получить путь, отбросить каталог files, каталог приложения и каталог data, создать папку и обрезать в неё)
2) Делать снимки самой 1С, где вы в явном виде можете указать качество изображения
3) Делать кроп на принимающей стороне (там, куда мобильное приложение сливает данные)
PS: Так же стоит обратить внимание, что в относительно свежих версиях Android, очень сильно ограничили доступ к НЕ своим данным из приложения, так что возможно и это как-то сказывается. Но всё это лишь мысли к размышлению, чем конечное решение.
Я чудом вообще нашел эту ветку обсуждения.
У меня была проблема с обменами. Очень был нужен архиватор. Acode Tools не взлетело.
По описанию в этой статье пытался использовать приложение
Тоже не взлетело, у меня 5 -ый андроид.
Пришлось засучить рукава, потратить целый день, ведь я впервые увидел андроид студио.
В итоге приложение за день было таки написано.
А теперь по теме статьи. Мое приложение никак не удавалось вызвать из 1С.
Интентов своих я не делал, не хватило знаний.
Что бы запустить приложение по имени нужно указать класс. Как например в приложении зебры
<parm name="Class" value="com.smartphoneremote.androidscriptfree.AndroidScriptFree" />
В моем приложении в файле манифеста класс небыл указан да и не хватило мозга сделать.
Всё, здесь был тупик. Помогли друзья, подсказали в 1С в качестве класса указать содержимое тега
<activity android:name="
В моем случае было так
НовВз.ИмяКласса = "com.rbacom.r_zip.MainActivity";
#Если МобильноеПриложениеКлиент Тогда
НовыйЗапуск = Новый ЗапускПриложенияМобильногоУстройства();
НовыйЗапуск.Действие = "android.media.action.IMAGE_CAPTURE";
НовыйЗапуск.Приложение = "com.microsoft.office.officelens";
НовыйЗапуск.ИмяКласса = "com.microsoft.office.officelens.MainActivity";
НовыйЗапуск.Запустить(Истина);
#КонецЕсли
Задача следующая: есть документ с прикреплёнными к нему картинками, нужно иметь возможность на мобильнике открыть картинку, что-то на ней нарисовать (например просто пальцем обвести область) и затем отредактированную версию так же прикрепить к этому документу.
Может кто сталкивался с подобным?
ЗапуститьПриложение
ЗапуститьПриложениеАсинх
НачатьЗапускПриложения
Перепробовал и так и сяк - либо ноль реакции, либо платформа вылетает с ошибкой.
Также пробовал через ЗапускПриложенияМобильногоУстройства:
Действие = "android.intent.action.VIEW"
Данные = "file:///storage/emulated/0/Android/data/MyApp/files/MyFile.apk"
Тип = "application/vnd.android.package-archive"
Тоже никак не реагирует. Может какие параметры перепутал...
У кого-нибудь получилось запустить файл apk из-под мобильной платформы 1С?
А что нужно сделать чтобы на андроиде при нажатии кнопок Поделиться в списке было мобильное приложение на 1С?
Или это пока невозможно и продолжаем ждать когда в 1С запилят broadcast receiver для SENDTO?
Надеюсь терминологию правильно использовал...
В примерах есть "Как отправить файл в разные программы". Так вот интересует обратный вариант.
Все методы запуска (Запустить, ЗапуститьАсинх, ЗапуститьБезОжидания), принадлежащие этому классу, запускают приложение в контексте процесса ЗАПУСКАЮЩЕГО приложения (без флага FLAG_ACTIVITY_NEW_TASK). Со всеми вытекающими...
Визуально это выглядит как запуск другого приложения прямо в окне запускающего приложения. Т.е. новое "окно" в карусели окон не создается. Одно из неприятных последствий такого поведения - то, что если в запускаемом приложении есть баг и андроид его крашит, то крашится "Ваш" процесс (т.е. тот, который запустил сбойный пакет). Пример другого последствия: отсутствие этого флага в запускающем Намерении (Intent'е - в терминологии Андроида) не позволяет запускать активити (окна) системных настроек - например, запрашивать внесение приложения в белый список по питанию или открывать список wi-fi соединений и т.д. (правда, в случае с 1с это итак не получится, поскольку желание запуска таких окон надо еще в манифесте приложения прописать, а 1с не дает прямой доступ к манифесту МП).
Наблюдал еще и другие артефакты в поведении 1с МП - при запуске в контексте запускающего процесса.
Это обычно меняется установкой флага "FLAG_ACTIVITY_NEW_TASK" через метод "setFlags", применяемый к объекту намерения, но как устанавливать произвольные флаги намерения в 1с - я не нашел.
Но да... есть способ как заставить 1с создавать новый процесс при запуске приложения - через использование Deep Linking (.
Заметка написана, на мой взгляд, слегка сумбурно, но если выкинуть там часть, которая говорит, что Вам следует поднять свой сайт(!!!), то все работает. То-есть: если создавать класс ЗапускПриложенияМобильногоУстройства с указанием глубокой ссылки: Новый ЗапускПриложенияМобильногоУстройства("android.intent.action.VIEW", "myapp://testPath?key1=1"), а не Новый ЗапускПриложенияМобильногоУстройства("android.intent.action.VIEW"), то операционка создает новый процесс. Единственное, что - запускаемое приложение в манифесте должно объявлять свою способность обрабатывать конкретные схемы deeplink (это то, что до двоеточия и двойного слеша ("myapp")).
Вот так:
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.action.GET_CONTENT";
//Указываем тип искомых файлов, нас интересует только фото
НовВз.Тип = "image/*";//"file/*"; //"*/*"
//Говорим что интересуют только локальные данные, а не облачные
// Указываем нужные форматы
МассивТипов = новый Массив;
МассивТипов.Добавить("image/jpeg");
МассивТипов.Добавить("image/png");
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY",Истина);
НовВз.ДополнительныеДанные.Добавить("android.intent.extra.MIME_TYPES",МассивТипов);
РезультатРаботы = НовВз.Запустить(Истина);
Если НЕ РезультатРаботы Тогда
Возврат Неопределено;
КонецЕсли;
ПутьКФайлу = НовВз.Данные;
возврат ПутьКФайлу; ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 301851
Создание 15.09.14 15:46
Обновление 08.10.14 13:17
Просмотры 116755
Загрузки 126
Рейтинг
246
Комментарии 187
Код открыт Не указано
Рубрики Мобильная разработка
Кому Разработчик
Тип файла Компонента, плагин (dll, vbs,..)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Android
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)