Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Как скачать изображение с веб-сайта в свой мидлет?

Поиск:
Доброго времени суток!

И так, многие спрашивают как скачать изображение с определенного веб-сайта в свой мидлет и отобразить её (картинку)?
Нет ничего проще. Для начала создадим мидлет в котором главным видимым элементом будет форма на которой мы и будем отображать скаченное изображение через Интернет, добавив команду для скачивания.

Код

/*
 * 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 и добавляем принятое изображение на форму 
Код
 form.append( img ); 
.

Кто-то спросит почему я читаю байты в цикле? Я отвечу. Писал эту статью быстро, телефон который был под рукой не мог сходу прочитать всё изображение через конструкцию 
Код
 is.read( image ); 


Данная статья написана для программистов начального уровня разработки в j2me.

Рабочий мидлет, а так же исходники доступны ниже.
Enjoy! :)

http://forum.vingrad.ru/index.php?act=modu...&attachid=1 JAD
http://forum.vingrad.ru/index.php?act=modu...&attachid=2 JAR
http://forum.vingrad.ru/index.php?act=modu...&attachid=3 SOURCES
Автор: javastic
Сайт: http://www.vitalich.com






Просмотров: 4262

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную