Мне нужно получить изображения вместе с другими данными (очень похожими на электронную почту с вложениями) на сервер. Мне также нужно сделать это надежным образом, чтобы я мог повторить попытку и т. Д. В случае неудачи.
Сервер - это WCF REST-сервер, и я много других взаимодействую с ним (JSON), но только что получил новое требование для загрузки изображений.
Поскольку я использую JSON для отправки данных на свой сервер, я использую GSON на стороне Android. для сериализации данных.
Вот как я реализовал это до сих пор (все остальное работает таким же образом, но я только начал с изображений)
Теперь о моих проблемах .. Очевидно, что на № 3 - я "взрываю" баран своими байтовыми массивами. Иногда я даже чувствую, что мой Nexus S становится вялым. Но делая это - я избегаю заполнения SD-карты или папки приложения большим количеством файлов. Я фотографирую, а потом беру. Следующее изображение перезапишет предыдущее.
Шаг № 5 медленный. Я не пробовал настраивать сериализатор на GSON, и вместо сериализации массива байтов во что-то вроде [1, -100,123, -12] я могу получить гораздо меньший размер с помощью Base64, но все же. Это будет медленно. И у меня может быть до 20 изображений ...
Шаг № 6 не проблема. Но с определенным размером (я пробовал изображение 300 пикселей) я начал получать ошибку на шаге 7 в OpenCursor
07-06 20:28:47.113: ERROR/CursorWindow(16292): need to grow: mSize = 1048576, size = 925630, freeSpace() = 402958, numRows = 2
07-06 20:28:47.113: ERROR/CursorWindow(16292): not growing since there are already 2 row(s), max size 1048576
07-06 20:28:47.113: ERROR/Cursor(16292): Failed allocating 925630 bytes for text/blob at 1,1
Так что все это мне не нравится. В идеале я хочу, чтобы все данные выгружались на сервер целиком.
Я подумал, может быть, можно хранить изображения с метками времени на SD-карте и хранить только их имена в БД. Тогда я бы обработал их прямо перед отправкой на сервер. И в случае успеха я удалил бы эти изображения. Такая логика сделает схему SQLite намного более сложной, но, может быть, нет лучшего способа?!
Думаю, я ищу передовой метод работы с изображениями. Как сделать следующее с минимальным использованием памяти / ЦП:
РЕДАКТИРОВАТЬ 1:
В настоящее время я изучаю возможность загрузки всего shizang как сообщение MIME, состоящее из нескольких частей. Это потребует добавления JAR в мой пакет Android. Также я не уверен, насколько эффективным будет код Apache для загрузки изображений и их отправки (я думаю, лучше, чем мой код) http://okandroidletsgo.wordpress.com/2011/05/30/android-to-wcf-streaming-multi-part-binary-images/
И что мне придется разбираться со всем этим на Сторона WCF, так как это невозможно сделать с помощью встроенной платформы .NET.
http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html
] ПОЖАЛУЙСТА, СКАЖИТЕ МНЕ, ЕСЛИ ВЫ ПОПРОБОВАЛИ ЭТО!
РЕДАКТИРОВАТЬ 2:
MIME бесполезен. В этом нет смысла, поскольку он сериализует двоичный файл с использованием Base64, что одно и то же ..