Как получить информацию / данные из platformRequest () в J2ME?

Я хочу реализовать поведение, подобное Whatsapp, когда пользователь может загружать изображение. Я попытался открыть изображения в своем приложении, но если изображение будет слишком большим, у меня будет ошибка нехватки памяти.

Чтобы решить эту проблему, я открываю пересылку изображений, которые будут открываться во встроенной программе просмотра изображений телефона, используя метод platformRequest().

Однако я хочу знать, как это Whatsapp изменяет встроенную программу просмотра изображений телефона, добавляя кнопку «Выбрать», с помощью которой пользователь выбирает изображение, которое он хочет загрузить. Как эта информация отправляется обратно в приложение J2ME и как изменяется размер изображения?


Изменить: я пробовал это двумя разными способами, оба из которых дали мне OOME.

Сначала я попробовал более прямой метод:

FileConnection fc = (FileConnection) Connector.open("file://localhost/" + currDirName + fileName);
if (!fc.exists()) {
    throw new IOException("File does not exists");
}
InputStream fis = fc.openInputStream();
Image im = Image.createImage(fis);
fis.close();

Когда это не сработало, я попробовал более «ручной» подход, но это тоже дало мне ошибку.

FileConnection fc = (FileConnection) Connector.open("file://localhost/" + currDirName + fileName);
if (!fc.exists()) {
    throw new IOException("File does not exists");
}
InputStream fis = fc.openInputStream();

ByteArrayOutputStream file = new ByteArrayOutputStream();
int c;

byte[] data = new byte[1024];

while ((c = fis.read(data)) != -1) {
    file.write(data, 0, c);

}

byte[] fileData = null;
fileData = file.toByteArray();

fis.close();
fc.close();
file.close();
Image im = Image.createImage(fileData, 0, fileData.length);

Когда я вызываю метод createImage, в обоих случаях возникает ошибка нехватки памяти. Это зависит от устройства. E72 выдает ошибку с изображениями размером 3 МБ, в то время как более новое устройство выдает ошибку с изображениями размером более 10 МБ.


person Midori Ryuu    schedule 28.09.2012    source источник
comment
Вы проверили, как WhatsApp обрабатывает большие изображения? Кроме того, рассматривали ли вы возможность изменять размер изображений на сервере перед отправкой на телефон?   -  person gnat    schedule 28.09.2012
comment
Я уже занимаюсь изменением размера на стороне сервера, но проблема в том, что если отправляющий пользователь пытается открыть большое изображение, чтобы он мог отправить его на сервер, приложение вылетает из-за нехватки памяти. Я тестировал то же изображение в WhatsApp, а также более крупные, и ни у одного из них не было этой проблемы.   -  person Midori Ryuu    schedule 28.09.2012
comment
интересный. Измените ответ, чтобы отобразить код, который вы используете, когда пользователь открывает изображение - код, из которого вы получаете OOME. из того, что я прочитал в Википедии, похоже, что они могут использовать API для Symbian, а не общий Java ME MIDP   -  person gnat    schedule 28.09.2012
comment
Хорошо, я добавил код! К сожалению, я не могу реализовать специальный API для Symbian, так как приложение также должно поддерживать BB. Я пытаюсь заставить его работать для банкомата Nokia, а позже исправлю код для поддержки RIM.   -  person Midori Ryuu    schedule 28.09.2012


Ответы (1)


MIDP 2 (JSR 118) не имеет заголовка API для этого вам нужно найти другой способ обработки больших изображений.

Что касается WhatsApp, похоже, они не полагаются на MIDP в поддержке этой функции. Если вы посетите страницу Википедии, то заметите, что они не заявляют, что Java ME поддерживается в целом. платформа, но вместо этого укажите более узкие платформы, такие как Symbian, S40, Blackberry и т. д.

Скорее всего, это означает, что они реализуют «проблемные функции», подобные той, которую вы спрашиваете об использовании API-интерфейса для конкретной платформы конкретных целевых устройств, имея по существу отдельные проекты / выпуски для каждой перечисленной платформы.

Если эта функция действительно необходима в вашем приложении, вам, вероятно, придется сделать что-то вроде этого.

В этом случае рассмотрите также возможность инкапсуляции проблемных функций, чтобы упростить переключение только части исходного кода при его сборке для разных платформ. Например, Class.forName (String) можно использовать для загрузки конкретной реализации платформы в зависимости от целевой платформы.

//...
Image getImage(String resourceName) {
   // ImageUtil is an interface with method getImage
   ImageUtil imageUtil = (ImageUtil) Class.forName(
           // get platform-specific implementation, eg
           //   "mypackage.platformspecific.s40.S40ImageUtil"
           //   "mypackage.platformspecific.bb.BBImageUtil"
           //   "mypackage.platformspecific.symbian.SymbialImageUtil"
           "mypackage.platformspecific.s40.S40ImageUtil");
   return imageUtil.getImage(resourceName);
}
//...
person gnat    schedule 29.09.2012