Доброго времени суток!
И так, многие спрашивают как скачать изображение с определенного веб-сайта в свой мидлет и отобразить её (картинку)? Нет ничего проще. Для начала создадим мидлет в котором главным видимым элементом будет форма на которой мы и будем отображать скаченное изображение через Интернет, добавив команду для скачивания.
| Код | /* * Midlet.java * * Created on 19.Oct.2006 г., 11:32 * Copyright (c)2006 by javastic * * Special for programmers forum http://forum.vingrad.ru/index.php * J2ME area * Welcome! */
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
/** * This is a demo midlet. It shows as you can make http connection for * getting image from web site. * * @author javastic * @version 1.0 */ public class Midlet extends MIDlet implements CommandListener { private Display display; private Form form; private Command cmdGet; public void startApp() throws MIDletStateChangeException { display = Display.getDisplay( this );
cmdGet = new Command( "Get", Command.OK, 1 ); form = new Form( "Get image via http" ); form.addCommand( cmdGet ); form.setCommandListener( this ); display.setCurrent( form ); } public void commandAction( Command c, Displayable d ) { if ( c == cmdGet ) { //some doing... } } public void pauseApp() { } public void destroyApp(boolean unconditional) throws MIDletStateChangeException { } }
|
Мы создали обычный мидлет который просто выводит на экран форму с заголовком и комманду Get. Теперь в обработчик команды Get в методе commandAction добавим вызов класса который собственно и будет соединяться с сервером, получать изображение и выводить его на форму.
| Код | form.deleteAll(); form.append( "Try to get image...\n" ); new GetHttp( this, form ).start();
|
Для наглядности действий нашего мидлета мы будем выводить некоторую тектовую информацию на нашу форму. В конструктор класса GetHttp мы передаём ссылку на сам мидлет и на его форму чтобы в дальнейшем можно было из класса GetHttp обращаться к их методам.
Дополнительно создадим в нашем мидлете два метода которые будут скрывать и отображать комманду Get в процессе скачивания изображения с сайта, это конечно не обязательно, но желательно, т.к. пользователь не сможет выбрать ещё раз команду Get пока предедущая не отработала. Вставьте эти два метода в любое место мидлета.
| Код | void hideCommand() { form.removeCommand( cmdGet ); } void showCommand() { form.addCommand( cmdGet ); }
|
Теперь приступим к созданию класса GetHttp. Этот класс должен использовать интерфейс Runnable для того чтобы работа нашего мидлета и потоки данных работающих с Интернет соединениями не мешали друг другу.
| Код | /* * GetHttp.java * * Created on 19.Oct.2006 г., 11:32 * Copyright (c)2006 by javastic * * Special for programmers forum http://forum.vingrad.ru/index.php * J2ME area * Welcome! */
import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*;
/** * @author yuriuss */ public class GetHttp implements Runnable { private Thread t; private Form form; private Midlet parent; private Image img; /** Creates a new instance of GetHttp */ public GetHttp( Midlet parent, Form form ) { t = new Thread( this ); this.parent = parent; this.form = form; } public void start() { t.start(); } public void run() { } }
|
В конструторе мы установим предварительные настройки и создадим новый поток, из мидлета мы запустим этот поток вызвав метод start() (конечно это можно было сделать и в самом конструкторе, но лучше пускай конструтор выполняет свою предназначенную работу - инициализация). Теперь в метод run() мы добавим код который будет скачивать информер с сайта www.gizmeteo.ru на котором будет отображаться погода города Санкт-Петербурга ;).
| Код | parent.hideCommand(); form.append( "Connecting to server ...\n" ); HttpConnection hc = null; InputStream is = null; String url = "http://informer.gismeteo.ru/26063-35.GIF"; byte[] image; try { hc = ( HttpConnection )Connector.open( url ); hc.setRequestMethod( HttpConnection.GET );
if ( hc.getResponseCode() != hc.HTTP_OK ) { form.append( "HTTP response msg: " + hc.getResponseMessage() + "\n" ); throw new IOException( "HTTP response code: " + hc.getResponseCode() + "\n" ); } is = hc.openInputStream(); int len = ( int )hc.getLength(); form.append( "Length: " + len + " byte.\n" ); image = new byte[ len ]; form.append( "Downloading image ...\n" );
for ( int i = 0; i < len; i++ ) { image[ i ] = ( byte )is.read(); }
img = Image.createImage( image, 0, len ); form.append( "Done.\n" ); form.append( img );
} catch ( ClassCastException e ) { form.append( e.getMessage() ); } catch ( IOException ioe ) { form.append( ioe.getMessage() ); } catch ( Exception e ) { form.append( e.getMessage() ); } finally { try { if ( is != null ) is.close(); if ( hc != null ) hc.close(); } catch ( IOException ioe ) { } parent.showCommand(); }
|
Небольшой сценарий этого кода таков: После выбора команды Get мы не отображаем на время работы кода эту команду чтобы пользователь повторно не нажал, затем через | Код | hc = ( HttpConnection )Connector.open( url ); |
мы создаём соединение с веб-сайтом по указанному url, после этого проверяем ответ сервера на то что он нас понял чего мы хотим, затем открываем входной поток чтения данных | Код | is = hc.openInputStream(); |
и сохраняем это всё в массив | Код | for ( int i = 0; i < len; i++ ) { image[ i ] = ( byte )is.read(); } |
, после чего создаём изображение img и добавляем принятое изображение на форму .
Кто-то спросит почему я читаю байты в цикле? Я отвечу. Писал эту статью быстро, телефон который был под рукой не мог сходу прочитать всё изображение через конструкцию
Данная статья написана для программистов начального уровня разработки в j2me.
Рабочий мидлет, а так же исходники доступны ниже. Enjoy! 
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=3071&attachid=1 JAD http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=3071&attachid=2 JAR http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=3071&attachid=3 SOURCES
Автор: javastic |