Модераторы: javastic, AntonSaburov
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как скачать изображение с веб-сайта в свой мидлет? 
:(
    Опции темы
javastic
Дата 19.10.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



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

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

Код

/*
 * 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! smile

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


Это сообщение отредактировал(а) javastic - 15.8.2007, 10:21


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
  
Закрытая темаСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.