Проблема при работе с данными Exif в Xamarin Forms и понимании системы путей Android

У меня проблема с обработкой данных exif в Xamarin Forms, я объясняю:

  1. Мое приложение делает снимок с помощью MediaPlugin, а путь к изображению - file.Path= "/storage/emulated/0/Android/data/com.companyname.appname/files/Pictures/Sample/someName.jpg"
  2. Используйте ExifInterface, чтобы поместить на изображение мои данные exif (по тому же пути)

    ExifInterface newExif = new ExifInterface(file.Path);
    newExif.SetAttribute(ExifInterface.TagUserComment, "Hello photo!");
    newExif.SaveAttributes();```
    

Теперь проблема начинается: если я использую GetAttribute на этом пути, я могу видеть свои данные exif, но если я скопирую изображение физически из "\ Phone \ Pictures \ Sample" на моем ПК и подробности, никакие из моих данных exif не отображаются (только данные камеры, такие как баланс белого и т. Д.).

Теперь я прочитал, что / storage / emulated / 0 / Android / data / ..... - это «главный» путь ресурса, а другой - «виртуальная ссылка», но я не теперь, как добраться до другого пути изображения.

Как я могу с этим справиться? Как я могу увидеть данные exif в изображениях на копии моего ПК?

Надеюсь, мое объяснение понятно


person Alessandro Albi    schedule 27.11.2019    source источник
comment
УВЕРЕНЫ ли вы, что копируете изображение с того же пути, по которому вы добавили данные EXIF? Я подозреваю, что MediaPlugin возвращает вам копию изображения, к которому вы добавляете данные EXIF, но затем вы копируете исходную копию фотографии из галереи изображений.   -  person Jason    schedule 27.11.2019
comment
Спасибо за ответ, вероятно, MediaPlugin возвращает мне копию, но на данный момент я не могу понять, как поместить свой exif на исходное изображение, потому что я не знаю путь. Я пробовал использовать string destFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); ExifInterface newExif = new ExifInterface(destFolder + "/Sample/test_12.jpg");, но не могу найти путь и вылетает   -  person Alessandro Albi    schedule 27.11.2019
comment
Пробовал использовать adb root. Я открываю путь, я только что нашел /storage/emulated/0/Android/data/com.companyname.appname/files/, /Pictures/Sample/someName.jpg - виртуальная ссылка, поэтому я советую вам скопировать свое изображение (MediaPlugin возвращается к вам) в общую папку. Но существующие данные недоступны.   -  person Leon Lu - MSFT    schedule 28.11.2019
comment
Спасибо за предложение, я пытаюсь скопировать изображение, но даже здесь у меня есть проблемы с путём ... вот мой код: string destFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), picName); File.Copy(file.Path, destFolder, true); вызывает ошибку: Не удалось найти часть пути   -  person Alessandro Albi    schedule 28.11.2019


Ответы (1)


Наконец, я использовал этот обходной путь:

Я создал новую папку в абсолютном пути ExternalStorage (это папка, которую вы можете увидеть в проводнике Windows)

var directoryname = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "MY_APP");
Directory.CreateDirectory(directoryname);
string jpgFilename = Path.Combine(directoryname, picName);
File.Copy(file.Path, jpgFilename, true);

ExifInterface newExif = new ExifInterface(jpgFilename);
newExif.SetAttribute(ExifInterface.TagUserComment, "Ketama126");
newExif.SaveAttributes();

Это создаст новую папку под названием «MY_APP» и скопируйте внутри изображение, возвращенное из CrossMedia, здесь вы можете сохранить данные exif.

person Alessandro Albi    schedule 29.11.2019