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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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 не будет опубликован. Обязательные поля помечены *