??xml version="1.0" encoding="utf-8" standalone="yes"?>
在wkt模拟器上, 通过以下代码可以正确的读出数?
conn = (SocketConnection) Connector.open(url, Connector.READ_WRITE, true);
is = conn.openDataInputStream();
os = conn.openDataOutputStream();
// 创徏登陆报文
loginPacketBytes = generateLoginPacket();
// 发送登陆报?br> // System.out.println("****发送登陆报?***");
os.write(loginPacketBytes, 0, loginPacketBytes.length);
os.flush();
// 先读取ConstantValue.HEADER_LENGTH个字?循环遍历L正确的魔?br> recByteNum = is.read(recBytes, 0, ConstantValue.READ_LENGTH);
若从服务器真是返回的字节数是100个字? ?font color=#0000ff>ConstantValue.READ_LENGTH定义的长度大?00.
那么在模拟器上没有问? 能够d100个字?
但是C真机上面试, 若定义的要读取的字节数大于实际传送的字节? 那就会出现异常情?
属性名U?/div>
|
属性作?/div>
|
microedition.profiles
|
代表手机支持的MIDP版本Q返回格式gؓ“MIDP-1.0”?#8220;MIDP-2.0”
|
microedition.configuration
|
代表手机支持的CLDC版本Q返回格式gؓ“CLDC-1.0”?#8220;CLDC-2.0”
|
microedition.locale
|
代表手机所在的国家或地区,q回值格式ؓ“en-US”
|
microedition.platform
|
代表手机的品牌和型号QNokia手机的返回值格式ؓ“Nokia6310i/4.42”
|
microedition.encoding
|
代表手机默认的字W集名称Q返回值格式ؓ“ISO-8859-1”
|
microedition.commports
|
代表手机可以使用的串口列表,q回g各个串口之间使用逗号分隔
|
microedition.hostname
|
MIDP2.0定义Q代表本C机名Uͼ需要手机支持?/div>
|
microedition.jtwi.version
|
代表手机支持的JTWI版本Q值必L“1.0”
|
属性名U?/div>
|
属性作?/div>
|
microedition.media.version
|
代表手机支持的MMAPI版本Q如果不支持则返回null
|
microedition.pim.version
|
代表手机支持的PIM API版本Q如果不支持则返回null
|
microedition.m3g.version
|
代表手机支持的M3G API版本Q如果不支持则返回null
|
microedition.location.version
|
代表手机支持的Location API版本Q如果不支持则返回null
|
Bluetooth.api.version
|
代表手机支持的BT API版本Q如果不支持则返回null
|
microedition.io.file.
FileConnection.version
|
代表手机支持的FC API版本Q如果不支持则返回null
|
microedition.global.version
|
代表手机支持的Mobile Internationalization API(JSR-238)版本Q如果不支持则返回null
|
microedition.chapi.version
|
代表手机支持的CH(Content Handler) API(JSR211)版本Q如果不支持则返回null
|
microedition.sip.version
|
代表手机支持的SIP API版本Q如果不支持则返回null
|
属性名U?/div>
|
属性作?/div>
|
supports.mixing
|
代表手机是否支持混音(同时播放多个Player)Q返回gؓ“true”?#8220;false”
|
supports.audio.capture
|
代表手机是否支持声音捕获(录音)Q返回gؓ“true”?#8220;false”
|
supports.video.capture
|
代表手机是否支持视频捕获(录像)Q返回gؓ“true”?#8220;false”
|
supports.recording
|
代表手机是否支持记录(record)Q返回gؓ“true”?#8220;false”
|
audio.encodings
|
代表手机支持的声x式,q回值格式ؓ“encoding=audio/wav”Q多个格式之间用至一个空D行间?/div>
|
video.encodings
|
代表手机支持的视频格式,q回值格式ؓ“encoding=video/3gpp”Q多个格式之间用至一个空D行间?/div>
|
video.snapshot.encodings
|
代表手机使用getSnapshotҎ获得的视频快照格式,q回值格式ؓ“encoding=png”Q多个格式之间用至一个空D行间?/div>
|
streamable.contents
|
代表手机支持的流媒体格式Q返回null代表不支?/div>
|
属性名U?/div>
|
属性作?/div>
|
fileconn.dir.photos
|
代表手机中存储照片和其它囄的目录,例如“file:///c:/My files/ Images /”
|
fileconn.dir.videos
|
代表手机中存储视频的目录Q例?#8220;file:///c:/My files/Video clips/”
|
fileconn.dir.tones
|
代表手机中存储声音的目录Q例?#8220;file:///c:/My files/Tones/”
|
fileconn.dir.memorycard
|
代表手机中存储卡的根目录。例?#8220;file:///d:/”
|
fileconn.dir.private
(Nokia S40不支? |
代表手机中MIDlet的私有工作目录,例如“file:///c:/System/MIDlets/[1015f294]/scratch”
|
fileconn.dir.photos.name
|
代表手机中图片目录的名称Q例?#8220;Images”
|
fileconn.dir.videos.name
|
代表手机中视频目录的名称Q例?#8220;Video clips”
|
fileconn.dir.tones.name
|
代表手机中声音目录的名称Q例?#8220;Sound clips”
|
file.separator
|
代表手机中的文g分隔W,例如“/”
|
fileconn.dir.memorycard.name
|
代表手机中存储卡的名Uͼ例如“Memory card”
|
BUILD FAILED
F:\MobileToDVR\menu\build.xml:89: Unable to compile source code for device [Generic/Midp2Cldc11]: Compile failed; see the compiler error output for details.
Total time: 8 seconds
调试了半天也没有扑ֈ原因, 后来到官方网站上面下载了一个新版本的J2ME-POLISH(j2mepolish-2.0.1.jar), 然后正运行了, 我原来安装的是J2ME Polish 2.0-RC4版本.
现象:
安装JAVA应用E序?手机重启?安装的程序就打不开.
CLDC标准 安装目录 |
CLDC1.0 | CLDC1.1 |
手机存储 | 重启后可?/td> | 重启后可?/td> |
存储卡存?/td> | 重启后不可用 | 重启后可?/td> |
MIDP应用E序的标准持久化Ҏ是使用RMS。RMScM于一个小型数据库QRecordStore相当于数据库的表Q每?#8220;?#8221;pq记录(RecordQ构成,一条记录就是一个用int表示的记录号RecordID和用byte[]表示的内宏V记录号可以看作?#8220;主键”Qbyte[]数组存储内容?/p>
RMS提供的记录操作可以实现根据ID直接获得记录Q或者枚丑և一个表中的所有记录?/p>
枚D记录是非怽效的Q因为只能比较byte[]数据来确定该记录是否是所需的记录。通过ID获得记录是高效而方便的Q类gSQL语句“SELECT byteArrayData FROM recordStoreName WHERE RecordID=?”。然而,通常应用E序很难知道某条记录的IDP而RMS记录?#8220;主键”又仅限于intcdQ无法用其他类型如String作ؓ“主键”来查找。因此,对于需要存取不同类型对象的应用E序而言Q就需要一个灵zȝRMS操作框架?/p>
我们的基本设xQ如果能使用String作ؓ“主键”来查找记录,p非常方便地获得所需的内宏V例如,应用E序讄可以通过"sys.settings"获得byte[]数组Qƈ依次d|,用户d信息可以通过"user.info"获得byte[]数组Q再分解出用户名和口令?/p>
因此Q我们实C个StorageHandlerc,提供唯一的RMS讉K接口Q得其他类完全不必考虑底层的RMS操作Q只需提供能标识自w的一个String卛_?/p>
如果我们能实CU类g数据库烦引的查找表,pҎString关键字查找某条记录。因此,我们使用一个名?index"的RecordStore来存储所有的索引Q每一条烦引都指向某一条具体记录的IDQ设计一个IndexEntry表示一条烦引:
class IndexEntry {
private int selfId; // IndexEntry的ID
private int recordId; // 对应记录的ID
private String key; // 讉K记录的Key
}
Ҏ索引查找Q分3步进行:
1Q在名ؓ"index"的RecordStore中根据String查找对应的IndexEntry?br>2Q取出IndexEntryQ获得记录ID受?br>3Q根据ID可得另一个RecordStore的记录,然后可以读取、更新和删除该记录?/p>
如下图所C:
׃IndexEntry保存的数据很,Z加快查找速度Q可以在应用E序启动Ӟ把所有的IndexEntryd一个VectorQ在后面的操作中更新q个Vectorq与RecordStore保持同步?/p>
Z处理不同cd的数据,所有可通过StorageHandler存取的类都必dC个Storable接口Q?/p>
public interface Storable {
String getKey();
void getData(DataOutputStream output) throws IOException;
void setData(DataInputStream input) throws IOException;
}
前面已经提到Q在MIDP应用E序中,序列化一个类的最x法是使用DataInputStream和DataOutputStream。因此,需要持久化的类可以通过getData()和setData()Ҏ非常方便地存取。假定应用程序的cUserInfo保存了用Ld名、口令和是否自动d的信息:
public class UserInfo {
String username;
String password;
boolean autoLogin;
}
Z能将UserInfo存入RMSQ需要实现Storable接口Q?/p>
class UserInfo implements Storable {
String username;
String password;
boolean autoLogin;
public String getKey() { return "user.info"; } // 提供一个唯一标识W即?br> public void getData(DataOutputStream output) throws IOException {
output.writeUTF(username);
output.writeUTF(password);
output.writeBoolean(autoLogin);
}
public void setData(DataInputStream input) throws IOException {
username = input.readUTF();
password = input.readUTF();
autoLogin = input.readBoolean();
}
// getters here...
}
要保存UserInfoQ只需调用StorageHandler的保存方法:
StorageHandler.storeOrUpdate(userinfo);
要读取UserInfoQ调用StorageHandler的读取方法:
UserInfo userinfo = new UserInfo();
StorageHandler.load(userinfo);
q样Q需要读取或保存数据的类完全不必涉及底层的RMS操作Q大大简化了应用E序的设计,增强了源代码的可复用性与可维护性?/p>
人类眼睛的色觉,hҎ的特性,早在上世U初Q?/span>YoungQ?/span>1809Q和HelmholtzQ?/span>1824Q就提出了视觉的三原色学_卻I视网膜存在三U视锥细胞,分别含有对红、绿、蓝三种光线敏感的视色素Q当一定L长的光线作用于视|膜Ӟ以一定的比例使三U视锥细胞分别生不同程度的兴奋Q这L信息传至中枢Q就产生某一U颜色的感觉?/span>
70q代以来Q由于实验技术的q步Q关于视|膜中有三种对不同L长光U特别敏感的视锥l胞的假_已经被许多出色的实验所证实?/span> 例如Q①有h用不过单个视锥直径的细单色光束,逐个查ƈl制在体Q最初实验是在金鱼和蝾螈{动物进行,以后是hQ?strong>视锥l胞的光谱吸收曲U?/strong>Q发现所有绘制出来的曲线不外三种cdQ分别代表了三类光谱吸收Ҏ不同的视锥l胞Q一cȝ吸收峰值在420nm处,一cd534nm处,一cd564nm处,差不多正好相当于蓝、绿、红三色光的波长。与上述视觉三原色学说的假设相符。②用微甉|记录单个视锥l胞感受器电位的ҎQ也得到了类似的l果Q即不同单色光所引v的不同视锥细胞的极化型感受器电位的大小也不同,峰值出现的情况W合于三原色学说?/span>
计算机显C彩色图像的时候也不例外,最l显C的时候,要控制一个像素中Red,Green,Blue的|来确定这个像素的颜色。计机中无法模拟连l的存储从最暗到最亮的量|而只能以数字的方式表C。于是,l合人眼睛的敏感E度Q?/span>3个字节(3*8位)来分别表CZ个像素里面的Red,Green?/span>Blue的发光强度数|q就是常见的RGB格式。我们可以打开d板,在自定义颜色工具框中Q输?/span>r,g,b|得到不同的颜艌Ӏ?br>
但是对于视频捕获和编解码{应用来Ԍq样的表C方式数据量太大了。需要想办法在不太媄响感觉的情况下,对原始数据的表示Ҏq行更改Q减数据量?/span>
无论中间处理q程怎样Q最l都是ؓ了展C给看,q样的更改,也是从h眼睛的特性出发,和发?/span>RGB三原色表C方法的出发Ҏ一L?/span>
于是我们使用Y,Cb,Cr模型来表C颜艌Ӏ?/span>Iain的书中写道:The human visual system (HVS) is less sensitive to colour than to luminance (brightness).人类视觉pȝQ其实就是h的眼睛)对亮度的感觉比对颜色更加敏感?/span>
?/span>RGB色彩I间中,三个颜色的重要程度相同,所以需要用相同的分L率进行存储,最多?/span>RGB565q样的Ş式减量化的_ֺQ但?/span>3个颜色需要按照相同的分L率进行存储,数据量还是很大的。所以,利用人眼睛对亮度比对颜色更加敏感Q将囑փ的亮度信息和颜色信息分离Qƈ使用不同的分辨率q行存储Q这样可以在对主观感觉媄响很的前提下,更加有效的存储图像数据?/span>
YCbCr色彩I间和它的变形(有时被称?/span>YUVQ是最常用的有效的表示彩色囑փ的方法?/span>Y是图像的亮度Q?/span>luminance/lumaQ分量,使用以下公式计算QؓR,G,B分量的加权^均|
Y = kr R + kgG + kbB
其中k是权重因数?/span>
上面的公式计出了亮度信息,q有颜色信息Q用色差(color difference/chrominance?/span>chromaQ来表示Q其中每个色差分量ؓR,G,B值和亮度Y的差|
Cb = B Q?/span>Y
Cr = R Q?/span>Y
Cg = GQ?/span> Y
其中Q?/span>Cb+Cr+Cg是一个常敎ͼ其实是一个关?/span>Y的表辑ּQ,所以,只需要其中两个数值结?/span>Y值就能够计算出原来的RGB倹{所以,我们仅保存亮度和蓝色、红色的色差|q就?/span>(Y,Cb,Cr)?/span>
相比RGB色彩I间Q?/span>YCbCr色彩I间有一个显著的优点?/span>Y的存储可以采用和原来画面一L分L率,但是Cb,Cr的存储可以用更低的分L率。这样可以占用更的数据量,q且在图像质量上没有明显的下降。所以,色彩信息以低于量度信息的分辨率来保存是一个简单有效的囑փ压羃Ҏ?/span>
?/span>COLOUR SPACES .17 ITU-R recommendation BT.601 中,在计?/span>YӞ权重选择?/span>kr=0.299,kg=0.587,kb=0.114。于是常用的转换公式如下Q?/span>
Y = 0.299R +
Cb = 0.564(B Q?/span> Y )
Cr = 0.713(R Q?/span> Y )
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb
有了q个公式Q我们就能够一q?/span>RGB画面转换成ؓYUV画面了,反过来也可以。下面将画面数据I竟是以什么Ş式存储v来的?/span>
?/span>RGB24格式中,对于宽度?/span>w,高度?/span>h的画面,需?/span>w*h*3个字节来存储其每个像素的rgb信息Q画面的像素数据是连l排列的。按?/span>r(0,0),g(0,0),b(0,0);r(0,1),g(0,1),b(0,1);…;r(w-1,0),g(w-1,0),b(w-1,0);…;r(w-1,h-1),g(w-1,h-1),b(w-1,h-1)q样的顺序存放v来?/span>
?/span>YUV格式中,?/span>YUV420格式Z。宽度ؓw高度?/span>h的画面,其亮?/span>Y数据需?/span>w*h个字节来表示Q每个像素点一个亮度)。?/span>Cb?/span>Cr数据则是画面?/span>4个像素共享一?/span>Cb,Cr倹{这?/span>Cb?/span>w*h/4个字节,Cr?/span>w*h/4个字节?/span>
YUV文g中,把多个的画面连l存放。就?/span>YUV YUV YUV…..q样的不断连l的形式Q而其中每?/span>YUVQ就是一q画面?/span>
在这单个YUV中,?/span>w*h个字节是Y数据Q接着?/span>w*h/4个字节是Cb数据Q再接着?/span>w*h/4个字节ؓCr数据?/span>
在由q样降低了分辨率的数据还原出RGB数据的时候,p依据像素的位|找到它对应?/span>Y,Cb,Cr|其中Y值最好找刎ͼ像素位置?/span>x,y的话Q?/span>Y数据中第y*width+x个数值就是它?/span>Y倹{?/span>Cb?/span>Cr׃是每2x2像素的画面块拥有一个,q样Cb?/span>Cr数据相当于两个分辨率?/span>w/2 * h/2的画面,那么原来画面中的位置?/span>x,y的像素,在这L低分辨率画面中的位置?/span>x/2,y/2Q属于它?/span>Cb,Cr值就在这个地方:(y/2)*(width/2)+(x/2)?/span>
Z直观赯Q再下面的图中,分别?/span>Y画面(Cb,Cr=0)?/span>Cb,Cr画面(Y=128)昄出来Q可?/span>Cb,Cr画面的分辨率?/span>Y画面?/span>1/4。但是合成一个画面之后,我们的眼睛丝毫感觉不?/span>4个像素是q一?/span>Cb,Cr的?/span>
?/span>Cb,Cr画面攑֤观察Q里面颜色相同的块都?/span>2x2大小的?/span>
附g?/span>Windows Mobile上用公式进?/span>YUV?/span>RGB转换的程序。其中需要注意的?/span>Cb,Cr在计过E中是会出现负数的,但是?/span>-128?/span>127q些数值都用一个字节表C,d的时候就映射0?/span>255q个区间Q成Z无符L|所以要减去128Q才能参与公式计。这Lq算有Q点运,效率是比较低的,所以要提高效率的话Q一般在实用E序中用整数计或者查表法来代ѝ还有,q算后的r,g,b可能会超q?/span>0-255的区_作一个判断进行调整就可以了?/span>
不过q里面的YUV TO RGB的算?效率实在是低,因ؓ里面有了点q算,解一?76*144的图像大概需?00ms左右,q是无法忍受?如果消除点q算,只需?0ms左右,效率的提升真是无法想?所以大家还是避免在手机上面q行点q算.