Запуск приложения мобильного устройства — что это?




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. flyer

    ждем что то аналогичное для ios

    Reply ↓
  2. infosoft-v

    Добрый день. А такие приёмы требуют прав суперпользователя в устройстве на андроид?

    Reply ↓
  3. DitriX

    (1) очень сильно сомневаюсь 🙂

    Reply ↓
  4. DitriX

    (3)Нет, это стандартный механизм.

    Reply ↓
  5. AlX0id

    А я говорил, что интенты добавят 🙂

    Reply ↓
  6. dj_serega

    А можно где-то посмотреть общий список команд которые можно выполнить?

    Reply ↓
  7. DitriX

    (5) можно — для этого надо уже понимать основы программирования под андроид. И, увы, почему то далеко не все работает.

    Ну вот на офф сайте http://developer.android.com/guide/components/intents-common.html

    (6) теперь ждем момента, когда 1с сможет быть сервером броэдкаста, а то посылать она оповещения то может, а вот прослушивать — нет. А как было бы круто 🙂

    Присылаешь линк, как в уф, на товар или накладную — открывается 1с с этим товаром/накладной 🙂

    Reply ↓
  8. allegrosoft

    С какого релиза все это стало возможно?

    Reply ↓
  9. flyer

    (8) allegrosoft, 8.3.5

    Reply ↓
  10. allegrosoft

    А можно исходники приложения?))

    Reply ↓
  11. DitriX

    (10) можно все 🙂 Позже обновлю статью и добавлю исходники

    Reply ↓
  12. allegrosoft

    (11)Спасибо!

    Reply ↓
  13. DitriX

    (12) добавил

    Reply ↓
  14. sergei_tekh

    В эмуляторе (VMware) метод тоже должен работать? У меня ничего не происходит и никаких ошибок не выдаётся.

    Reply ↓
  15. DitriX

    (14) смотря что вы тестируете.

    Reply ↓
  16. sergei_tekh

    (15) попробовал все примеры, что здесь были. Допустим, отправку почты:

    &НаКлиенте
    Процедура Сообщения(Команда)
    
    НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие = «android.intent.action.SEND»;
    Сообщить(НовВз.Запустить(ложь));
    
    КонецПроцедуры

    Метод «Запустить» выдает всегда Ложь (или 0, в зависимости от параметра метода)

    Reply ↓
  17. allegrosoft

    Проект в Eclipce разработан? Что-то не пойму, как -то криво в eclipce открывается.

    Reply ↓
  18. DitriX

    (16) странно, но боюсь что тут не пдскажу в чем дело, может нет ни одного приложения, которое должно откликнуться.ъ

    (17) писали в IDEA

    Reply ↓
  19. CyberCerber

    Спасибо за полезную статью по интересной теме!

    Попробовал примеры из статьи. Поставил прогу для штрих-кодов, запустил команду, да, сработало.

    Но не работает команда «android.intent.action.SEND». При этом установлен тот же GMail, смотрел в его манифесте, там эта команда в интентах есть. Не знаете, в чем может быть дело?

    Reply ↓
  20. DitriX

    (19) CyberCerber, вы делаете вот так:

    Процедура ПроверитьВзаимодействие(Команда)
    
    НовВз=Новый ЗапускПриложенияМобильногоУстройства();
    
    НовВз.Действие=»android.intent.action.SEND»;
    
    Сообщить(НовВз.Запустить(Истина));
    
    КонецПроцедуры

    Показать

    ?

    Что вам в ответ приходит?

    Reply ↓
  21. CyberCerber

    (20) да, именно так и делаю. В ответ приходит 0. И больше ничего не происходит.

    Reply ↓
  22. DitriX

    (21) CyberCerber, Даже не знаю что ответить. Это стандартная функция андроида.

    Давайте тогда уточним все:

    1. Версия андроид

    2. Версия 1С

    3. Название устройство

    4. На скольки устройствах тестировали

    5. Вы точно именно так писали? С учетом регистров и без своих каких-либо добавлений? На всякий случай скопируйте этот код и проверьте еще раз. Дабы был чистый эксперимент.

    Reply ↓
  23. CyberCerber

    (22) по пунктам:

    1. Андроид 4.0.4

    2. 1С 8.3.5.1146

    3. Huawei MediaPad 10 FHD

    4. Пока на одном

    5. Писал именно так, сто раз перепроверял, копировал из Манифеста.

    Конечно, ус-во — китайщина, но разве может железо повлиять на работу этих механизмом. Тем не менее, постараюсь сегодня проверить на других девайсах.

    Reply ↓
  24. CyberCerber

    (22) протестил на Samsung Galaxy S3 Android 4.3 — тоже самое

    Но у меня получилось по-другому! Добавил строчку из примера НовВз.Тип=»message/rfc822″;

    Открылся выбор Gmail и Bluetooth. Почему так, не можете подсказать? И откуда брать эту инфу о типе?

    Reply ↓
  25. DitriX

    (24) интересует версия мобильной 1С, а не стационарной.

    Так как там они немного переделали механизмы. Вообщем попробуйте из новых примеров в конце статьи.

    Reply ↓
  26. CyberCerber

    (25) мобильная 8.3.5.74. Это уже старая версия?

    О, спасибо за примеры. В общем, понял, что нужно изучать Манифесты приложений.

    А никто не пробовал открыть из 1С картинку на редактирование, сделать там какие-то пометки и закрыть, сохранив? Не могу найти удобные редакторы/рисовалки, которые с Интентами работают.

    Reply ↓
  27. mzelensky

    Доброго времени суток!

    Делаю фотку средствами 1С, сохраняю в базу и привязываю к нужному объекту. По сути встроенным и средствами все работает, но фотографии получаются довольно большие (мне бы хватило разрешения 800*600).

    Можно ли это реализовать вашим методом?.

    Reply ↓
  28. Широкий

    А можно ли сторонними программа вызывать/скрывать клавиатуру?

    Я как то копал — пришел к выводу, что нельзя.

    Но на всякий случай спрошу — вдруг ошибаюсь.

    Reply ↓
  29. DitriX

    (27) а почему нет? Вы вызываете приложения для работы с фото (не 1С), задаете там размеры и фоткаете, в 1С приходит фото.

    Если надо обрезать уже сделанное фото — тоже можно.

    Пробуйте, а там увидите.

    (28) теоретически можно, но такую программу надо самому писать. Врядли вы найдете готовое решение.

    Reply ↓
  30. DanilaDru

    Коллеги подскажите пожалуйста. В основном по nfc пишут про необходимость перехвата, но 1с этого не умеет. Может встречали приложение, с помощью которого можно было бы перехватить nfc метку? На подобии как автор вызывает стороннее приложение для сканирования штрих-кодов.

    Reply ↓
  31. dj_serega

    А как можно запаковать в архив каталог?

    Интерактивно делается так: Мои файлы — выбираем файл или каталог — меню — Заархивировать.

    Reply ↓
  32. DitriX

    (31) это вы сейчас о чем?

    Reply ↓
  33. dj_serega

    (32)

    Собственно проблемы следующие:

    1. Хочу с мобильного приложения создать десяток xml-ек. Запаковать в zip. Отправить по почте.

    2. Хочу подключиться к ftp, передать туда десяток файлов или если получится запаковать в архив то передать архив.

    Ни первое ни второе не работает.

    upd: в тонком клиенте файлы на фтп передаются (в т.ч. каталоги создаются). А вот с мобильного лажа ;(

    upd2: Код следующий:

    СоздатьКаталог(«ftp://login:pass@ip/ИмяКаталога/»);

    Ошибка следующая:

    Каталог не знайдено ‘ftp://login:pass/ip/ИмяКаталога’: Помилка роботи з інтернет: ftp://ipRequest must not be null.

    Я уже и / и пробовал. Толку ноль. Ошибка одна и та же.

    Reply ↓
  34. DitriX

    (33) dj_serega,

    FTPСоединение (FTPConnection)

    Описание:

    Предназначен для работы с файлами и каталогами на ftp-серверах.

    Доступность:

    Тонкий клиент, сервер, толстый клиент, внешнее соединение.

    Reply ↓
  35. dj_serega

    (34) Так вот именно. Что Новый FTPСоединие не работает на мобильном.

    Я подключался по пути «СоздатьКаталог(«ftp://login:pass@ip/ИмяКаталога/»);»

    Думал нет объекта но подключиться можно.

    А как на счет вызова программы которая запакует несколько файлов?

    Reply ↓
  36. DitriX

    (35) хм, ну продолжайте копать 🙂 Авось чего интересного найдете 🙂

    Reply ↓
  37. CyberCerber

    Не подскажите, а может ли 1С отправлять broadcast команды?

    В Манифесте приложения есть секция activity с intent-filter. Вот действия оттуда срабатывают.

    А вот отправляю команду, которая находится в секции receiver с intent-filter — ничего не происходит.

    Если через adb shell отправляю команду «am broadcast -a <описание.команды>», то все работает.

    Получается, 1С этого еще не умеет?

    Reply ↓
  38. DitriX

    (37) не может, только стартануть активити может, и принимать бродкасты — тоже пока не умеет.

    Reply ↓
  39. CyberCerber

    (38) ясно, значит, будем надеяться на новую версию платформы…

    О, вижу, вы выложили разработку Acode tools! Как я понимаю, через нее можно реализовать и это.

    Reply ↓
  40. arisha_rein

    Подскажите, пожалуйста, почему ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«file:///sdcard/Download/FotoTestFrom1C.bmp»)); вызывает ошибку недопустимое значение параметра 1?

    Reply ↓
  41. DitriX

    (40) потому что:

    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 и будет с ним работать.

    Надеюсь я понятно объяснил?

    Reply ↓
  42. arisha_rein

    (41) все понятно. Большое спасибо!

    Reply ↓
  43. ignorant

    Автору — огромное спасибо, выдает «нагора» массу полезной информации!

    Кандидат в «Фабрику знаний» — вкл / выкл приемник GPS

    // GPS On
    Запуск = Новый ЗапускПриложенияМобильногоУстройства();
    Запуск.Действие = «android.location.GPS_ENABLED_CHANGEPICK»;
    Запуск.Данные  = «enabled:true»;
    Запуск.Запустить(Истина);
    
    // GPS Off
    Запуск = Новый ЗапускПриложенияМобильногоУстройства();
    Запуск.Действие = «android.location.GPS_ENABLED_CHANGEPICK»;
    Запуск.Данные  = «enabled:false»;
    Запуск.Запустить(Истина);

    Показать

    Reply ↓
  44. gigapevt

    А как скрыть экранную клавиатуру после окончания ввода текста (например в своей форме поиска).

    Код есть, но как его прикрутить к 1С ?

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    Reply ↓
  45. DitriX

    (44) без исходников 1с — никак. Во всяком случае — мы не смогли этого добиться.

    Еще один из вариантов — своя клавиатура. Вот у нас в ТСД своя клавиатура, и мы ее можем скрывать, открывать и вообще че хотим то и делаем 🙂

    Reply ↓
  46. ssa

    Большое спасибо за пример с «android.media.action.IMAGE_CAPTURE». Пригодилось.

    Но есть проблема с размером картинки. У меня приложение «Камера», которое автоматически вызывается, позволяет установить минимальное разрешение 1 Мпикс. И файл изображения получается большой. Как его можно уменьшить?

    Reply ↓
  47. DitriX

    (46) автоматически вызывается из 1с? Ну так вызовите свое приложение камеры. Я вот это люблю https://play.google.com/store/apps/details?id=fr.xplod.focal&hl=ru

    Reply ↓
  48. ssa

    Спасибо. Но если я установлю еще одно приложение камеры, как указать, чтобы использовалось именно оно? Ведь может быть несколько подобных приложений на моб. устройстве.

    Reply ↓
  49. DitriX

    (48) смотрите вот этот кусок в этой публикации «Как сделать фото (видео) в любом качестве?»

    И при запуске — у вас будет вопрос — что выбрать. Выберите камеру и скажете что бы выбиралось всегда по умолчанию.

    Либо можно доп параметрами указать конкретное приложение, как это сделать — указано в статье

    Reply ↓
  50. ssa

    Понял, спасибо за разъяснение.

    Reply ↓
  51. kingartos

    Всем привет! Никто не пробовал работать с «распознователем речи»? Нашел статейку на эту тему(http://stackoverflow.com/questions/6316937/how-can-i-use-speech-recognition-without-the-annoying-dialog-in-android-phones) только у меня ничего не выходит (видимо потому что в этом неразбираюсь) может кто то уже пробовал если да до выложите плиз кусочек кода))

    Reply ↓
  52. solarisman

    Подскажите, как сделать таким образом, чтобы при открытии формы курсор сразу вставал на поле, чтобы сканирование выполнялось в поле ввода? Приходится «тапать» на поле, после чего выполнять сканирование.

    Нельзя ли, например, поставить стороннюю клавиатуру и вызвать событие «Enter» или «Tab»?

    Reply ↓
  53. DitriX

    (52) баг платформы, увы, эта опция доступно только в 8.3.4.17, во всех остальных — не работает. А вам с какой целью?

    Reply ↓
  54. solarisman

    Каким образом можно мобильное приложение развернуть на весь экран? Толком так и не разобрался, но тут написано, что для API 16 и выше работает только метод

    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С?

    Reply ↓
  55. DitriX

    (54) не туда копаете, правьте манифест и там указывайте что хотите, только это нарушает лицензию 1с 🙂

    Reply ↓
  56. solarisman

    (55) Было бы все так просто. Правка манифеста — не панацея. Опробовали на разных устройствах, и в зависимости от параметров экрана снизу остается полоса высотой до 100 пикселей. На смартфонах от 3,5 до 4″ работает норм. На смарте 5″ остается совсем небольшая полоса снизу, почти незаметная, а вот на ТСД — бидапичаль. Причем после закрытия окон в этой полосе отображается шапка окна (глюк?)

    В приложении это видно. При правке манифеста единственное, что меняется — скрывается статусбар

    Reply ↓
  57. DitriX

    (56) ну это таки глюк, на партнерке о нем вроде как говорили, а вообще отправьте в 1с инфу, зарегят и исправят.

    Reply ↓
  58. DeniNikitin

    Здравствуйте!

    Ну а где сама утилита для реализации кода?

    Процедура ПроверитьВзаимодействие(Команда)
    НовВз=Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие=»com.ditrix.ownaction.SHOW_TOAST»
    НовВз.ДополнительныеДанные.Добавить(«com.ditrix.ownaction.EXTRAS_MESSAGE»,»Данные»);
    
    Сообщить(НовВз.Запустить(Истина));
    
    Для Каждого Стр ИзНовВз.ДополнительныеДанные Цикл
    Сообщить(Стр.Ключ+» — «+Стр.Значение);
    КонецЦикла;
    КонецПроцедуры

    Показать

    Это для простого сообщения, а вот это действие для пуша:

    «com.ditrix.ownaction.SHOW_NOTIFICATION»

    При этом вам вернется ответ в виде 3 данных разных типов.

    Reply ↓
  59. DitriX

    (58) во вложении к статье 🙂

    Reply ↓
  60. DeniNikitin

    Я не много не понял скачал apk, установил, прописал Ваш код по отправке push и toast, в итоге не получил ни push ни toast сообщений, расскажите как использовать?

    Reply ↓
  61. DeniNikitin

    (60) DeniNikitin,

    Извиняюсь просмотрел всё работает корректно!

    Reply ↓
  62. DeniNikitin

    А никак нельзя иконку и текст «Notification» заменить?

    Reply ↓
  63. DitriX

    (62) увы, это ограничения Андроида, можно выставлять только те иконки, которые находятся в ассетах приложения, т.е. при компиляции.

    Reply ↓
  64. DeniNikitin

    (63)

    Если я правильно понял скачиваю ваши исходники меняю там иконку компилирую и будет другая иконка?

    Reply ↓
  65. DitriX

    (64) ну если именно заменить, то да, а если добавить еще одну, то надо код дописывать.

    Reply ↓
  66. DeniNikitin

    (63)

    Подскажи в какой среде разработки написан проект? Какой IDE использовал?

    Reply ↓
  67. DitriX

    (66) не помню, или идея или эклипс

    Reply ↓
  68. DeniNikitin

    Здравствуйте!

    А есть пример, что сделать с этой штукой:

    НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие = «android.intent.action.GET_CONTENT»;
    

    ?

    Reply ↓
  69. DeniNikitin

    (68) DeniNikitin,

    Что возвращает, как вытащить расширение и.т.д.?

    Reply ↓
  70. DeniNikitin

    Приношу извинения пример есть:

    НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие = «android.intent.action.GET_CONTENT»;
    //Указываем тип искомых файлов, нас интересует только фото
    НовВз.Тип = «image/*»; //»file/*»; //»*/*»
    //Говорим что интересуют только локальные данные, а не облачные
    НовВз.ДополнительныеДанные.Добавить(«android.intent.extra.LOCAL_ONLY»,Истина);
    РезультатРаботы = НовВз.Запустить(Истина);
    Если НЕ РезультатРаботы Тогда
    Сообщить(«Файл не выбран!»);
    Возврат
    КонецЕсли;
    ПутьКФайлу = НовВз.Данные;
    

    Показать

    Но я понимаю он возвращает uri, а как из него получить двоичные данные? Если можно пример?

    Reply ↓
  71. DitriX

    (70) URI — это путь к файлу, а как из файла вытащить двиочные данные — точно так же как и в стационарной, и читайте камменты, тут был пример с картинкой

    Reply ↓
  72. DeniNikitin

    (71)

    Если URI — Путь к файлу, тогда должно работать

    ДвоичныеДанные = Новый ДвоичныеДанные(НовВз.Данные);
    

    Но не работает пишет «Недопустимое значение параметра №1»

    Попробовал:

    Картинка = Новый Картинка(НовВз.Данные);
    СтрокаПуть = Картинка.ПолучитьДвоичныеДанные();
    

    Выдаёт Файл не обнаружен «file://content://external/images/media/10466»

    В примерах посмотрел с картинкой примера нет, если только не прописывать строкой ФайлКартинки = «file:///sdcard/Download/FotoTestFrom1C.bmp»;

    Подскажите куда копать?

    Reply ↓
  73. DeniNikitin

    (71) И ещё заметил такую вещь, что после выбора картинки мне возвращается строка «content://external/images/media/10466», а по факту в total commander смотрю там файл img_…..jpg? Точно путь возвращается в Данные?

    Reply ↓
  74. DitriX

    (73) верн. Так вы выюираете через последние данные. Хотите так выбирать, тогда надо выпрямить ссылку. Читайте в другой статье про утилиты

    Reply ↓
  75. DeniNikitin

    (74)

    А ссылку на статью можно?

    Reply ↓
  76. DeniNikitin

    Нашёл пример на яве

    if(resultCode==RESULT_OK){

    String FilePath = data.getData().getPath();

    textFile.setText(FilePath);

    }

    А ни как нельзя этот getPath() в каких-нибудь свойствах ЗапускПриложенияМобильногоУстройства тоже прикрутить?

    Reply ↓
  77. DitriX

    (75)http://infostart.ru/public/310565/

    (76) нет. Во всяком случае — я не знаю как это сделать из 1с

    Reply ↓
  78. DeniNikitin

    Спасибо! Использовал функцию ПолучитьUriИзContent(Путь) и всё как надо!

    Reply ↓
  79. DeniNikitin

    Вопросит по фото из 1С

    ФайлКартинки = «file:///sdcard/DCIM/FotoTestFrom1C.jpg»;
    НовВз = Новый ЗапускПриложенияМобильногоУстройства(«android.media.action.IMAGE_CAPTURE»);
    НовВз.ДополнительныеДанные.Добавить(«output»,ФайлКартинки,»Uri»);
    НовВз.Запустить(Истина);
    
    

    Чтобы он в галерее отображался? А то у меня физически есть а в галереи нету?

    Reply ↓
  80. DitriX

    (79) не понял вопрос, можете уточнить?

    Reply ↓
  81. DeniNikitin

    (80)

    Смысл в следующем, код работает и файл сохраняет, но при этом захожу в галерею андроида, его там нет! Через total commander — есть! Вы в андроиде больше понимаете, скорей всего есть какой-то параметр, который надо подключить, чтобы в галерее отображался!

    Reply ↓
  82. DitriX

    (81) ну для начала путь укажите верный: file:///sdcard/DCIM/Camera/FotoTestFrom1C.jpg

    Reply ↓
  83. DeniNikitin

    (82) Дело не в пути, я галерею открываю и у меня там по папкам фото отображается и в том числе есть папка DCIM, и которые файлы там лежат они отображаются кроме того, что сфотал интентом!

    Reply ↓
  84. DitriX

    (83) очень интересно. Может расширение файла не совпадает с его реальным типом?

    Тут я затрудняюсь ответить. У меня галерея подхватывает все. Так что тут скорее всего вопросы именно в вашей галерее.

    Reply ↓
  85. Andrey_R91

    Подскажите, как можно открыть html-файл через браузер? Какой MIME-тип нужно указывать чтобы запустился браузер? Или само название приложения (к примеру «com.google.android.gm»)

    Reply ↓
  86. DitriX

    (85) так вы же сами ответили.

    берите за пример открытие контакта в вибере

    Reply ↓
  87. zwitter

    79. А диктофон встроенный никто не пробовал запускать?

    а то метод СделатьАудиозапись меня не совсем устраивает.

    Reply ↓
  88. zwitter

    НП = Новый ЗапускПриложенияМобильногоУстройства(«android.provider.MediaStore.RECORD_SOUND»);

    Reply ↓
  89. enot_tut

    (86) помоги пожалуйста

    Reply ↓
  90. djvu

    (7)

    Как я понял, запускать можно только активити с параметрами? Сервисы таким образом запускать нельзя?

    Reply ↓
  91. DitriX

    (93) вы вызываете намерение, у сервисов их нет, т.е. вы и активити то не все вызвать можете, а только те, у которых есть фильтр намерений.

    Reply ↓
  92. djvu

    (94)

    Т.е. для организации двухстороннего обмена с сервисом с использованием интентов нужна активити-прослойка в любом случае :/

    Получается и асинхронный режим выпадает?

    Reply ↓
  93. DitriX

    (95) djvu, во всяком случае — на текущий момент, да.

    Но как научимся слушать бродкасты…

    Reply ↓
  94. enot_tut

    (96) можно конфигурацию скинуть этой статьи

    Reply ↓
  95. DitriX

    (98) enot_tut, держите

    Reply ↓
  96. ISP

    у меня заработал такой вызов камеры android/ Сделано на базе примера, за что спасибо

    //Тут указываем путь, при чем путь должен быть доступен всем программам,
    // так что временные файлы 1С не подйут
    
    ФайлКартинки = КаталогДокументов()+»MobileFoto.jpg»;
    // без замены слешей не сохраняет нормально
    ФайлКартинки = СтрЗаменить(ФайлКартинки,»»,»/»);
    // делаем как бы ссылку на файл для андроида
    ФайлКартинки = «file://» + ФайлКартинки;
    
    НовВз = Новый ЗапускПриложенияМобильногоУстройства(«android.media.action.IMAGE_CAPTURE»);
    
    //Обязательно указываем этот параметр, если его не указать,
    // тогда вам вернется привью файла в низком качестве
    // и находится он будет в параметрах с ключем data.
    НовВз.ДополнительныеДанные.Добавить(«output»,ФайлКартинки,»Uri»);
    
    //Если фото не сделано, то ответ будет «0»
    Рез = НовВз.Запустить(Истина);
    
    // а тут нормально обращение к файлу. Без этого вылетает ошибка, что файл не обнаружен
    ФайлКартинки = СтрЗаменить(ФайлКартинки,»file://»,»»);
    
    // сохраняем в справочник на смартфоне, для последующей выгрузки
    Фото_СохранитьСнимок(Неопределено,
    Новый ДвоичныеДанные(ФайлКартинки),
    Неопределено,
    Неопределено
    );
    
    &НаСервере
    Процедура Фото_СохранитьСнимок(ФотоСсылка,ДвоичныеДанные,РасширениеФайла,ТипСодержимого)
    Если ФотоСсылка = Неопределено Тогда
    Фото = Справочники.ФотоДляСлужебок.СоздатьЭлемент();
    Фото.Наименование = Формат(ТекущаяДата(),»ДФ=’yyyy.MM.dd HHmmss'») + «[Нов. фото]»;
    Фото.ИмяФото = Формат(ТекущаяДата(),»ДФ=’yyyy.MM.dd HHmmss'») + «.jpg»;
    иначе
    Фото = ФотоСсылка.ПолучитьОбъект();
    КонецЕсли;
    
    Фото.ДатаФото = ТекущаяДата();
    Фото.РасширениеФото = РасширениеФайла;
    Фото.ТипСодержимогоТекст = ТипСодержимого;
    // для отлаки
    Если ДвоичныеДанные = Неопределено Тогда
    Фото.ХранилищеФото = Новый ХранилищеЗначения(Неопределено);
    иначе
    Фото.ХранилищеФото = Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
    КонецЕсли;
    Фото.ЕстьФото = Истина;
    Фото.Родитель = Фото_ТекущаяСлужебка;
    Фото.Записать();
    КонецПроцедуры
    

    Показать

    Reply ↓
  97. mxs89

    (45) приветствую. есть какие нибудь изменения касательно скрытия клавиатуры? Если своя клавиатура, имеется в виду скачать какую нибудь клавиатуру с playmarket? например эту

    Reply ↓
  98. maxx

    (2) прошло почти 4 года, не в курсе для ios описания такого нет?

    Reply ↓
  99. WKBAPKA

    (7) эх, еще бы LiveDat-у подключить 🙂

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *