<font size='4'>???? 现在越来越多的手机都支持拍照功能,但是各种型号的手机所能存储的照片容量都是有限的,而且如果想把照片导出放到电脑上观看,要么需要有数据线或者红外线,要么就通过发彩信的方式获得,这两种方式第一种需要有电脑在身边,第二种发一条彩信至少需要5角钱吧,又太浪费钱而且也不太方便,而目前支持kjava的手机也越来越多,为何不想办法利用
j2me的网络功能和手机的拍照功能把拍到的照片直接上传到网络上呢?这样,在任何地方,只要可以利用gprs上网,都可以随时上传自己拍的照片。而且照片是通过网络传输到服务器上去的,因此并不占用手机的存储空间,这样,想拍多少照片都没问题!</font><font size='4'>????? 首先需要一部支持拍照功能和java的手机,并且需要了解一下你的手机的java支持不支持mmapi(</font><a href='http://java.sun.com/products/mmapi/index.jsp' class='l' target='_blank'><font size='4' color='#0000cc'>mobile media api </font></a><font size='4'>),如果程序在你的手机上无法执行,那说明你的手机不支持,那就没办法了,换个支持的手机吧:)</font>
<font size='4'>????? 既然是把照片传到网上去,还需要你有一个服务器,其实不一定是服务器,只要是有一个独立的ip,可以在公网访问的到,就可以了,你完全可以使用自己拨号上网的机器,再装一个动态
域名的工具实现。</font>
<font size='4'>????? 有了以上两个条件,我们就可以建立一个我们自己的网络相册了!</font>
<font size='4'>????? 首先,需要启动摄像头,代码如下:</font>
<font size='4'>package com.infini
touch.xiaowei.mobile;</font>
<font size='4'>import javax.microedition.lcdui.*;<br/>import javax.microedition.media.player;<br/>import javax.microedition.media.control.videocontrol;<br/>import javax.microedition.media.manager;<br/>import javax.microedition.media.*;</font>
<font size='4'>public class catchscreen extends
canvas {<br/>??? player p;<br/>??? videocontrol vc;<br/>??? public static int bytes = 0;<br/>??? public catchscreen() {<br/>??????? this.setfullscreenmode(true);<br/>??????? try {<br/>??????????? p = manager.createplayer("capture://video");<br/>??????????? p.realize();<br/>??????????? vc = (videocontrol) p.getcontrol("videocontrol");<br/>??????????? if (vc != null) {<br/>??????????????? vc.initdisplaymode(videocontrol.use_direct_video, this);???????????????? vc.setdisplaysize(128,160);<br/>??????????? }<br/>??????????? vc.setvisible(true); //设置可见<br/>??????????? p.start();<br/>??????? } catch (exception e) {}<br/>??? }</font>
<font size='4'>??? //按任意键拍照</font>
<font size='4'>??? public void keypressed(int key)<br/>??? {<br/>??????? http
thread thread = new httpthread();<br/>??????? thread.setdata(vc);<br/>??????? thread.start();<br/>??? }</font>
<font size='4'>??? protected void paint(graphics g) {<br/>??????? /** @todo add paint codes */<br/>??? }</font>
<font size='4'>}<br/></font>
<font size='4'>????? 以上就是启动摄像头的代码,这里我们的screen是继承了cavans类,如果是继承其他,比如form,需要稍作修改,网上也有介绍这方面的文章,这里就不多说了。</font>
<font size='4'>????? 拍照和上传功能我们单独放在一个
线程里面实现,因为拍照和网络传输都会阻塞,如果
他们和当前屏幕处于一个线程中,在拍照和传输的时候界面就会没有反应,这是我们不希望的,因此单独开一个线程是最好的办法。</font>
<font size='4'>package com.infinitouch.xiaowei.mobile;</font>
<font size='4'>import javax.microedition.io.*;<br/>import java.io.*;<br/>import javax.microedition.media.control.videocontrol;<br/>import javax.microedition.media.*;</font>
<font size='4'>public class httpthread extends thread {</font>
<font size='4'>??? byte[] data;<br/>??? videocontrol vc;<br/>??? public void setdata(videocontrol vc)<br/>??? {<br/>??????? this.vc = vc;<br/>??? }</font>
<font size='4'>??? public void run()<br/>??? {<br/>??????? try {<br/>??????????? data = vc.getsnapshot(null);//拍照,生成png格式的数据<br/>??????? } catch (mediaexception ex) {<br/>??????????? ex.printstacktrace();<br/>??????? }</font>
<font size='4'>??????? try {<br/>??????????? httpconnection conn = (httpconnection) connector.open("</font><a href='http://192.168.0.12/mmsmonth/post.jsp'><font size='4'>http://192.168.0.12/mmsmonth/post.jsp</font></a><font size='4'>");<br/>??????????? conn.setrequestmethod("post");<br/>??????????? dataoutputstream out = conn.opendataoutputstream();<br/>??????????? out.write(data, 0, data.length);//发送数据至服务器<br/>??????????? out.close();<br/>??????? } catch (ioexception ex) {<br/>??????????? ex.printstacktrace();<br/>??????? }<br/>??? }</font>
<font size='4'>}</font>
<font size='4'>????? 原理也很简单,拍照,获取数据,发送数据。如果想发送数据完毕的时候通知界面,让界面显示信息,也是很容易做到的。</font>
<font size='4'>????? 这里,手机部分的程序就差不多了,主要的就是上面的两个类。现在开始服务器端的程序。服务器端需要接收发送过来的数据并且保存成文件,这些步骤在一个jsp中就可以实现,也很简单:</font>
<font size='4'><%<br/>?byte[] b;<br/>?java.io.inputstream in = request.getinputstream();<br/>?b = new byte[100000];<br/>?byte[] tmp = new byte[100000];<br/>?int index = 0;<br/>?int size = 0;<br/>?java.io.file f = new java.io.file("/home/www/mmsmonth/pics/" +
system.currenttimemillis() + ".png");<br/>?java.io.dataoutputstream o = new java.io.dataoutputstream(new java.io.fileoutputstream(f));<br/>?<br/>?while(in.available()>0){<br/>??int len = in.read(tmp);<br/>??o.write(tmp,0,len);<br/>??size+=len;<br/>?}<br/>?o.close();<br/>%></font>
<font size='4'>还需要一个文件来显示照片列表:</font>
<font size='4'><%@ page contenttype="text/html; charset=gb2312" language="java" import="java.io.*"%><br/><%<br/>?file file = new file("/home/www/mmsmonth/pics/");<br/>??? file[]
files = file.listfiles();<br/>??? for(int i=0;i<files.length;i++)<br/>??? {<br/>??????? out.print("<a href=\"pics/" + files[i].getname() + "\"><img width=160 height=120 border=0 src=\"pics/" + files[i].getname() + "\"></a>");<br/>??????? if((i+1) % 5 == 0)<br/>??????????? out.print("<p>");<br/>??? }<br/>%></font>
<font size='4'>很简单吧,这里只是把最基本的东西写了出来,如果需要加什么更完善的功能,基本的东西还是这些。</font>
<font size='4'>以上程序在我的阿而卡特ot756通过测试,效果还挺不错的:)</font>
<font size='4'><a href='http://ilxw.bokee.com/inc/src.rar'>下载源程序</a></font>