自己給西門子C65也寫過一段時間程式,其中也發現很莫名其妙的問題,找遍N個網站,才發現開發西門子手機軟體的實在是少得可憐……唉,也只能怨西門子不爭氣吧!
在這裡寫一些自己開發中遇到的問題,也算是給西機的開發FANS做些參考吧!
1.不支援GameCanvas.getState()
雖然西門子C65號稱支援CLDC1.1和MIDP2.0,其實是沒有完全實現的。其中GameCanvas.getState()就是一例子,如果在編程中採用getState()方法,將會出現意想不到的結果,因為無論如何,getState()返回的永遠是0值,而不是鍵位值。
可以用下面這個類做測試:
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.*;
public class myGameCanvas extends GameCanvas
{
Graphics g=getGraphics();
public myGameCanvas()
{
super(false);
}
protected void keyPressed(int keyCode)
{
int keyState=this.getKeyStates();
if(keyState!=0)
{
g.setColor(0,0,0);
g.fillRect(0,0,this.getWidth(),this.getHeight());
g.setColor(255,255,0);
g.drawString("keyCode"+Integer.toString(keyCode),20,20,0);
g.drawString("keyState "+Integer.toString(keyState),20,40,0);
}
else
{
g.setColor(0,0,0);
g.fillRect(0,0,this.getWidth(),this.getHeight());
g.setColor(255,255,0);
g.drawString("keyCode "+Integer.toString(keyCode),20,20,0);
g.drawString("keyState "+Integer.toString(keyState),20,40,0);
}
this.setFullScreenMode(true);
flushGraphics();
}
}
2.檔案名稱大小寫
西門子的實體機子對檔案名稱區分大小寫,比如"a.PNG"和"a.png"是不同的檔案,但在windows的模擬器下是同一個檔案。這會造成一個結果就是,明明在模擬器中順利讀出了圖片,但在實機中就是拋出異常!
3.模擬器不支援media.*
這應該是模擬器的不完善,凡是涉及到media.*的都會提示“JAVA ERRO”!但是在實體機上一切運行正常。所以打算在軟體中播放聲音的朋友,還是要到實體機中去嘗試,說不定很多問題就迎刃而解。
例如,此段代碼在模擬器中出錯,但在實體機中正常通過:
try
{
InputStream in = getClass().getResourceAsStream("/res/music"+stageNum+".mid");
player = Manager.createPlayer(in,"audio/midi");
player.setLoopCount(4);
player.start();
}
catch(IOException e){}
catch(MediaException e){}
4.模擬器不支援RMS
不知道為什麼,模擬器一直不支援RMS,總之解決方案也只能用WTK內建的模擬器測試是否正常,或是直接拷貝到手機上測試了。