Android загружает изображения на сервер наиболее эффективным способом

Мне нужно получить изображения вместе с другими данными (очень похожими на электронную почту с вложениями) на сервер. Мне также нужно сделать это надежным образом, чтобы я мог повторить попытку и т. Д. В случае неудачи.

Сервер - это WCF REST-сервер, и я много других взаимодействую с ним (JSON), но только что получил новое требование для загрузки изображений.

Поскольку я использую JSON для отправки данных на свой сервер, я использую GSON на стороне Android. для сериализации данных.

Вот как я реализовал это до сих пор (все остальное работает таким же образом, но я только начал с изображений)

  1. Пользователь заполняет поля активности (текстовые данные)
  2. Пользователь делает какое-то изображение (я) с помощью камеры. В настоящее время я использую только 1 файл для изображений
  3. Я беру изображение с SDCard, загружаю / изменяю его размер - отображаю в ImageView и сохраняю в байтах []
  4. Пользователь отправляет - я беру все данные вместе с изображениями из байта [] и помещаю это в объект Java
  5. Вызвать конвертер GSON и сериализовать объект
  6. Сохранить объект в SQLite
  7. AsyncTask ищет в SQLite записи, открывает курсор и получает текст
  8. AsyncTask создает HttpConnection и отправляет текстовые данные на мой сервер.
  9. КОНЕЦ

Теперь о моих проблемах .. Очевидно, что на № 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. Сделать снимок
  2. Показать эскиз
  3. Изменить размер
  4. Отправить на сервер

РЕДАКТИРОВАТЬ 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, что одно и то же ..

8
задан katit 8 July 2011 в 03:42
поделиться