Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > использование камеры телефона в J2ME приложении


Автор: mdsoul 22.8.2007, 11:47
Доброго времени суток!

Столкнулся со следующей проблемой: необходимо получить скриншоты максимального размера, какой только обеспечивает камера. Как узнать, какой размер максимаьный в конкретном устройстве я так и не понял (если кто подскажет, буду крайне признателен), поэтому остановаился на разрешении 480х640. Не знаю, как это делается по науке, но я поступил следующим образом - в качестве видеоискателя использую player с разрешением, устанавалиаемым по умолчанию 
Код

player = Manager.createPlayer("capture://video");

В момент снимка создаю новый плеер с нужным мне разрешением
Код

player = Manager.createPlayer("capture://video?width=480&height=640");


Полный код приведен ниже.
На эмуляторе все прошло вроде как нормально. Как только загрузил приложение на телефон (SE K750), вылезла проблема: 
javax.microedition.media.MediaException: Cannot create a DataSource for: null

Насколько я понял, аппарат не воспринимает какие-либо параметры (?width=480&height=640).

Код работающий, стоит только убрать злополучные "?width=480&height=640".

Поделитесь соображениями как с этим бороться. Заранее благодарен отозвавшимся.

Код

import javax.microedition.media.control.VideoControl;
import javax.microedition.media.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;


class FormX extends Form implements Runnable
{
    private Player player;
    private VideoControl vc;
    private Image result = null;
    public  byte[] pictureInBytes = null;
    private MIDlet m = null;
    private String saveParams = null;

    
    public FormX()
    {
        super("Фотографирование");

        init();
    }

    private void init()
    {
        try
        {
            player = Manager.createPlayer("capture://video");
            player.realize();
            vc = (VideoControl)player.getControl("VideoControl");
            
            if(vc != null)
            {
                Item item;
                (item = (Item)vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null)).setLayout(3);
                super.append(item);
                player.start();
            }
            vc.setVisible(true);
        }
        catch (Exception e)
        {
            super.append(e.toString());
            System.out.println("init(): " + e);
            e.printStackTrace();
        }
    }

    public void capture(MIDlet m, String saveParams)
    {
        System.out.println("capturing");
        this.m = m;
        this.saveParams = saveParams;
        
        Thread t = new Thread(this);
        t.start();
    }
    
    public void run()
    {
        System.out.println("thread started");
        try
        {
            player.close();
            while (player.getState() != Player.CLOSED)
            {
            }
            System.out.println("previous player closed");

            player = Manager.createPlayer("capture://video?width=480&height=640");
            System.out.println("new player created");
            player.realize();
            System.out.println("new player realized");
            vc = (VideoControl)player.getControl("VideoControl");
            System.out.println("new video control created");
            
            if(vc != null)
            {
                Item item;
                vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null);
                player.start();
            }
            System.out.println("new played started");
            pictureInBytes = vc.getSnapshot(null);
            System.out.println("snap length is: " + pictureInBytes.length);
            
            Alert al = new Alert("Выполнено", FSManager.savePicture(pictureInBytes, saveParams), null, AlertType.INFO);
            al.setTimeout(2000);
            Display.getDisplay(m).setCurrent(al);
        }
        catch (Exception e)
        {
            System.out.println("capture(): " + e);
            e.printStackTrace();
        }
    }

    public void stop()
    {
        try
        {
            player.stop();
        }
        catch (Exception e)
        {
            System.out.println("stop(): " + e);
        }
    }
}

Автор: W0LF 22.8.2007, 12:30
я снапшот брал с максимальным разрешением а потом масштабировал.. быть может и неправильно, но тогда пришлось сделать так

Автор: mdsoul 22.8.2007, 14:16
Хорошо, тогда как узнать какое разрешение максимальное для конкретной модели и почему аппарат ругается на параметры "?width=480&height=640"?

Автор: Antropoid 22.8.2007, 16:58
Код

System.getProperty("video.snapshot.encodings");


Код

getSnapshot("encoding=bmp&width=640&height=480");

Автор: W0LF 22.8.2007, 17:01
Цитата(Antropoid @  22.8.2007,  16:58 Найти цитируемый пост)
getSnapshot("encoding=bmp&width=640&height=480");

так вроде не получалось :(

Автор: Antropoid 22.8.2007, 17:47
Мож потому, что девайс не поддерживает формат, или разрешение. Я ж говорю
Код

System.getProperty("video.snapshot.encodings");

сначала надо юзать.

Автор: W0LF 22.8.2007, 17:56
формат точно поддерживал. .а вот разрешение вполне может ты и прав..
просто давно было - непомню smile

Автор: mdsoul 23.8.2007, 11:50
Цитата(Antropoid @ 22.8.2007,  16:58)
Код

System.getProperty("video.snapshot.encodings");


Код

getSnapshot("encoding=bmp&width=640&height=480");

Таким образом у меня ничего не вышло - снова Unsupported parameters.

У кого-нибудь есть мысли как сделать скриншот нестандартного размера? Стандартные 120х160 меня не устраивают.

Автор: Antropoid 23.8.2007, 12:13
Я тебе дал намек, а не четкий алгоритм...
Что выдает твой девайс на
Код

System.getProperty("video.snapshot.encodings");

?

Автор: mdsoul 23.8.2007, 12:29
Я дурак! Что тут ещё сказать.

На аппарате мидлет выдал следующую строчку
encoding=jpeg&width=120&height=160 encoding=jpeg&width=480&height=640 encoding=jpeg&width=960&height=1280 encoding=jpeg&width=1224&height=1632

Таким образом плеер создается стандартным "конструктором без параметров", а именно
Код

player = Manager.createPlayer("capture://video");

после чего можно делать фотографии с одним из наборов параметров, полученных с помощью
Код

System.getProperty("video.snapshot.encodings");


Пытаться получить снимок без первого параметра, как я в общем-то и пытался, не стоит.

Всем спасибо за внимание и особенно за помощь. Игорь.

Автор: Antropoid 23.8.2007, 13:05
O! Молоток, шо сам разобрался  smile 
Я это фсе и имел ввиду, когда так лаконично писал  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)