МП, выбор картинки возвращает content://media/external, как получить файл?

1. vladnet 363 31.05.22 10:48 Сейчас в теме
На андроиде выбираю картинку, возвращает картинку типа: content://media/external/...
А мне нужно получить двоичные данные чтобы передать в основное приложение.

Как можно это сделать?
Объект ДвоичныеДанные хочет ссылку типа file://..

Был вариант ставить ACODE, но только для этой единственной функции что то совсем не хочется.
Должен же быть стандартный вариант.
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
10. spacecraft 31.05.22 13:00 Сейчас в теме
(1) попробовать собрать под 29 API SDK.
В 11 андроиде оно будет открываться под режимом совместимости с 10 андроидом.
2. maksa2005 534 31.05.22 10:53 Сейчас в теме
Оповещение 		= Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
        
	    ДиалогВыбора 	= Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	    
	    ДиалогВыбора.Заголовок = "Выберите файл";
	    
	    ДиалогВыбора.Показать(Оповещение);

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат = Неопределено Тогда
        ОбщиеФункцииКлиента.ПоказатьСообщение(Элементы,"Файл не был выбран.");
        Возврат;
        
    КонецЕсли;
    
        
    Оповещение = Новый ОписаниеОповещения("ОбработатьПомещениеФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , Результат[0], Ложь, УникальныйИдентификатор);
    
КонецПроцедуры


&НаКлиенте
Процедура ОбработатьПомещениеФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
ДД = ПолучитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Показать
3. vladnet 363 31.05.22 11:32 Сейчас в теме
(2)
Оповещение = Новый ОписаниеОповещения("ОбработатьПомещениеФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , Результат[0], Ложь, УникальныйИдентификатор);

КонецПроцедуры


&НаКлиенте
Процедура ОбработатьПомещениеФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
ДД = ПолучитьИзВременногоХранилища(Адрес);
КонецПроцедуры


Файл не обнаружен 'content:\\media\external\images\media\591'

по причине:
Файл не обнаружен 'content:\\media\external\images\media\591'

Это пишет в ответ на НачатьПомещениеФайла.

Тоже самое что и в других вариантах
4. maksa2005 534 31.05.22 11:33 Сейчас в теме
(3) на всех моих приложениях работает, как на iOS так и на андрюше. Проверьте разрешение для 1с
5. vladnet 363 31.05.22 12:16 Сейчас в теме
(4) Какое именно разрешение? Я запускаю через платформу 1с мобильную. Да кстати еще андроид 11, там вроде что то мудрили с файловой системой.
6. maksa2005 534 31.05.22 12:19 Сейчас в теме
(5)разрешение на открытие файлов и его использование (в конфигураторе есть - . 11 у меня нет андрюши - не могу сказать
Прикрепленные файлы:
7. vladnet 363 31.05.22 12:34 Сейчас в теме
(6) Галочку поставил, но не работает. Попробую сейчас обновить мобильное приложение для платформы андроид.
8. maksa2005 534 31.05.22 12:34 Сейчас в теме
(7)у меня 8.3.16 на отладку и 8.3.21 на публикацию.
9. user5300 1014 31.05.22 13:00 Сейчас в теме
(7) Было подобное.. Вы картинку откуда выбираете ?
Если выбрать картинку из папки "Недавние" - он возвращает именно такую ссылку, но если выбрать эту же картинку с основной папки то вернет двоичные данные.
Например вам скинули фото на ватсап, вы посмотрели и закрыли. При открытии из приложение - эта картика будет в недавних, но основное место положение в папке WhatsappPhoto ...
11. user5300 1014 31.05.22 13:08 Сейчас в теме
(9) А вот и сама процедура выбора картинки (2 способа)

&НаКлиенте
Процедура ОбразецНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = ложь;	
	Путь = ВыбратьФото();
	Если Путь = Неопределено тогда
		возврат;
	КонецЕсли;

	Образец= Путь;
	
КонецПроцедуры

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

КонецФункции

Показать
12. vladnet 363 07.06.22 18:39 Сейчас в теме
На данный момент проблема так и не решена.
Мобильная платформа 8.3.21.26
Андроид 12

Нужно добиться чтобы работало без публикации приложения из установленной мобильной платформы через АПК.
Как только не пытался возвращает все время файл не найден.

(9) Платформа вообще не дает выбирать из файловой системы, только из картинок или папки приложения, а там только какие то мутные бэкапы.

Так что нужен способ именно content:\\media\external\images\media\.. обрабатывать
13. PlatonStepan 38 08.06.22 06:14 Сейчас в теме
(12)
content:\\media\external\images\media\ - это Uri, из них надо получить путь.

здесь подобные проблемы решают вроде
https://infostart.ru/public/301851/
https://forum.infostart.ru/forum92/topic170966/
14. user5300 1014 13.06.22 08:23 Сейчас в теме
(12)
именно content:\\media\external\images\media\.. обрабатывать


Именно это ты не обработаешь, это ссылка провайдера.
Скинул 2 рабочих примера выше, Еще вариант попробовать заменить приложение для просмотра фотографий (скачать галлерею с Маркета)
15. vladnet 363 30.06.22 13:41 Сейчас в теме +2 $m
Оказалось что стандартный выбор не работает. А через:

НовВз = Новый ЗапускПриложенияМобильногоУстройства;
			НовВз.Действие = "android.intent.action.GET_CONTENT";
			НовВз.Тип = "image/*";
			НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY", Истина);
			РезультатРаботы = НовВз.Запустить(Истина);
			Если НЕ РезультатРаботы Тогда Возврат Истина; КонецЕсли;


работает, хотя тоже контент возвращает а не файл.
16. Tatitutu 3855 06.06.23 12:24 Сейчас в теме
Все намного проще (главное не знать , как правильно и все получиться)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот