(keitai-l) Re: 504is compared ?

From: Colin Mack <colin_at_b-factory.co.jp>
Date: 12/02/02
Message-Id: <D4DDF724-05B3-11D7-AECD-0003934BD90C@b-factory.co.jp>
On 2002.12.2, at 02:38  AM, dc wrote:

>
> How do the 504is models compare? Are there any significant feature
> differences?
>
> I heard conflicting reports that only the P actually had a java api to 
> the
> camera, but this amount of non-standardisation seems unlikely from 
> docomo.
>


I can't speak from personal experience on this yet, but there is a 
thread on the JavaHz (japanese) mailing list that indicates that such 
an API exists, and at least some people have had success in using it. 
I've copied in a couple of mails below for "evidence", although now 
looking at them it does not appear to  be strictly a P feature, as it 
looks a lot like the API (see 2nd mail w/ source code) is coming from 
nttdocomo.opt.ui, which would indicate it is not a P-only feature, but 
an optional thing that some other makers may be supporting as well.


++++++++++++++++++++++++++++++++++++

Date: 2002.11.28  18:07:12 Asia/Tokyo
To: java@gigahz.net
Subject: Re: [JavaHz:2265] iアプリのカメラ制御について
Reply-To: java@gigahz.net


On Thu, 28 Nov 2002 17:33:09 +0900
<kurosaki.k@md.neweb.ne.jp> wrote:

> Camera.takePicture()でカメラを起動し、画像をカメラオブジェクト内に保持。
> と、ここまではいいのですが、保存した画像を表示させることが出来ずにいます。
> Camera.getImage()メソッドあるいは、Camera.getInputStream()メソッドの使い方を
> 教えていただきたいと思います。

まだ試してないので間違っていたらすみません。

APIドキュメントによると、Camera.getImage()はMediaImageオブジェクトを返す
との事なので、

	int index = 0;
	MediaImage mi = Camera.getImage(index);
	mi.use();
	Image img = mi.getImage();

みたいな感じだと思います。

Camera.getInputStream()の方は、

	int index = 0;
	int length = Camera.getImageLength(index)
	byte[] imgbuf = new byte[length];
	InputStream in = Camera.getInputStream(index);
	int offset = 0;
	for(;;) {
	    int num = in.read(imgbuf, offset, length);
	    if (num < 0) {
	        imgbuf = null;
	        break;
	    }
	    offset += num;
	    length -= num;
	    if (length == 0) {
	        break;
	    }
	}
	in.close();

で、imgbuf内にバイト列が入ると思います。

> また、カメラオブジェクト内の画像はスクラッチパッドに保存しなければならないの
> でしょうか。

単に表示するだけならその必要はないと思います。保存したい場合はバイト列を

++++++++++++++++++++++++++++++++++++++++++++++++++++++
From: <kurosaki.k@md.neweb.ne.jp>
Date: 2002.11.29  12:34:28 Asia/Tokyo
To: <java@gigahz.net>
Subject: Re: [JavaHz:2265] iアプリのカメラ制御について
Reply-To: java@gigahz.net

蒔田です。
緒方さん、返信していただいて大変感激しております。
早速試してみました。
以下の様なコードにしましたが、画像は表示されませんでした。
大変恐縮ですが、ご指摘の程よろしくお願いいたします。

import com.nttdocomo.opt.ui.*;
import com.nttdocomo.ui.*;
import java.io.*;
import javax.microedition.io.*;

public class Legend extends IApplication{

   public static MainCanvas canvas;

   public void start(){
     canvas = new MainCanvas();
     Display.setCurrent(canvas);
     canvas.exe();
   }
}

class MainCanvas extends Canvas{
   private static MediaImage mi;
   private static Image img;
   private static Camera cm;

   public MainCanvas(){
     setSoftLabel(Frame.SOFT_KEY_1,"終了");
   }

   public void exe(){
     Graphics g = getGraphics();

     try{
         cm.getCamera(1).takePicture();
         while(true){

             write();
             read();
             g.lock();
             g.setColor(Graphics.getColorOfName(Graphics.BLACK));
             g.fillRect(0,0,getWidth(),getHeight());
             g.drawImage(img,0,0);
             g.unlock(true);

             Thread.sleep(50);
         }
     }catch (Exception e){}
   }
   public void paint(Graphics g){}

   public void write(){
     int index = 0;
     try{
         int length = (int)cm.getCamera(1).getImageLength(index);
         byte[] imgbuf = new byte[length];
         InputStream in = cm.getCamera(1).getInputStream(index);
         int offset = 0;
         for(;;) {
           int num = in.read(imgbuf, offset, length);
           if (num < 0) {
             imgbuf = null;
             break;
           }
           offset += num;
           length -= num;
           if (length == 0) {
             break;
           }
         }
        in.close();
        OutputStream out = Connector.openOutputStream("scratchpad:///0");
        out.write(imgbuf);
        out.close();
     }catch (Exception e){}
   }

   public void read(){
       mi = MediaManager.getImage("scratchpad:///0");
       try{
           mi.use();
       }catch(Exception e){}
       img = mi.getImage();
   }

   public void processEvent(int type, int param){
     if(type==Display.KEY_PRESSED_EVENT){
       if(param==Display.KEY_SOFT1){
         IApplication.getCurrentApp().terminate();
       }
     }
   }
}
Received on Mon Dec 2 07:20:21 2002