日期:2014-05-20  浏览次数:20881 次

j2me 实现打电话功能

此实例为本人原创的电话呼叫程序,用户输入号码进行拨号,由于本人一直是搞低级UI开发的,所以并没有用高级控件做输出体。

?

框架代码1 - Constant

import javax.microedition.lcdui.Graphics;
/**
?* @author 空白节奏
?* */
public class Constant 
{
	public static final int SCR_WIDTH = 240;
	public static final int SCR_HEIGHT = 320;
	public static final int SCR_CENTERW = 120;
	public static final int SCR_CENTERH = 160;
	public static final byte FPS = 20;
	public static final String rms_name = "RMS_name";
	
	//走程状态
	public static int MIDLetState = 0;
	public static final int MIDLetState_LOGO = 1;
	public static final int MIDLetState_MENU = 2;
	
	public static final int KEY_UP = -1;
	public static final int KEY_DOWN = -2;
	public static final int KEY_LEFT = -3;
	public static final int KEY_RIGHT = -4;
	public static final int KEY_FIRE = -5;
	public static final int KEY_LSOFT = -6;
	public static final int KEY_RSOFT = -7;
	public static final int KEY_CLEAR = -8;
	public static final int KEY_SEND = -10;
	public static final int KEY_END = -11;
	public static final int KEY_ASTERISK = 42;// *
	public static final int KEY_POUND = 35;// #
	public static final int KEY_NUM0 = 48;
	public static final int KEY_NUM1 = 49;
	public static final int KEY_NUM2 = 50;
	public static final int KEY_NUM3 = 51;
	public static final int KEY_NUM4 = 52;
	public static final int KEY_NUM5 = 53;
	public static final int KEY_NUM6 = 54;
	public static final int KEY_NUM7 = 55;
	public static final int KEY_NUM8 = 56;
	public static final int KEY_NUM9 = 57;


	public static final int GLT = Graphics.LEFT | Graphics.TOP;
	public static final int GRT = Graphics.RIGHT | Graphics.TOP;
	public static final int GLB = Graphics.LEFT | Graphics.BOTTOM;
	public static final int GRB = Graphics.RIGHT | Graphics.BOTTOM;
	public static final int GTH = Graphics.TOP | Graphics.HCENTER;
	public static final int GBH = Graphics.BOTTOM | Graphics.HCENTER;
	public static final int GLV = Graphics.LEFT | Graphics.VCENTER;
	public static final int GRV = Graphics.RIGHT | Graphics.VCENTER;
	public static final int GHV = Graphics.HCENTER | Graphics.VCENTER;
}

?

框架代码2 - GameMIDlet

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
/**
?* @author 空白节奏
?* */
public class GameMIDlet extends MIDlet 
{
	static GameMIDlet gameMIDlet = null;
	Displayable current = null;
	GameMaster gm = null;

	public GameMIDlet() 
	{
		gameMIDlet = this;
	}

	protected void startApp()
	{
		current = Display.getDisplay(this).getCurrent();
		if(current == null)
		{
			gm = new GameMaster(this);
			Display.getDisplay(this).setCurrent(gm);			
		}
		else
		{
			Display.getDisplay(this).setCurrent(current);
		}
	}

	protected void pauseApp() 
	{
		
	}

	protected void destroyApp(boolean arg0)
	{
		
	}

	public static void quitApp()
	{
		gameMIDlet.destroyApp(true);
		gameMIDlet.notifyDestroyed();
		gameMIDlet = null;
	}
}

?

?

框架代码3 - GameMaster

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
?* @author 空白节奏
?* */
public class GameMaster extends Canvas implements Runnable
{
	private boolean isStart = false;
	private Image img_buffer = null;
	private Graphics gg;
	private boolean isFullScreen = true;
	call c = null;
	GameMIDlet gml = null;
	public GameMaster(GameMIDlet gml)
	{
		this.gml = gml;
		init();
		setFullScreenMode(isFullScreen);
		isStart = true;
		new Thread(this).start();
	}
	
	public void paint(Graphics g)
	{
		gg.setColor(0);
		gg.setClip(0, 0, Constant.SCR_WIDTH, Constant.SCR_HEIGHT);
		gg.fillRect(0, 0, Constant.SCR_WIDTH, Constant.SCR_HEIGHT);
		
		c.paint(gg);
		
		g.drawImage(img_buffer, 0, 0, Constant.GLT);
	}
	
	public void update()
	{
		c.updata();
	}
	
	public void keyPressed(int keyCode)
	{
	}
	
	public void keyReleased(int keyCode)
	{
	}
	
	public void pointerPressed(int x, int y)
	{
		c.pointerPressed(x, y, gml);
	}
	
	public void init()
	{
		c = new call();
		img_buffer = Image.createImage(Constant.SCR_WIDTH, Constant.SCR_HEIGHT);
		gg = img_buffer.getGraphics();
	}
	
	long startTime = 0;
	long timeTaken = 0;
	public void run()
	{
		while (isStart)
		{
			startTime = System.currentTimeMillis();
			update();
			repaint();
			timeTaken = System.currentTimeMillis() - startTime;
			if(timeTaken < 1000 / Constant.FPS)
			{
				try
				{
					Thread.sleep(1000 / Constant.FPS - timeTaken);
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}
	}
}

?

逻辑代码 - call

import java.util.Vector;

import javax.microedition.io.ConnectionNotFoundException;
import javax.microedition.lcdui.Graphics;

/**
?* @author 空白节奏
?* */
public class call
{
	callButten[] cb = null;
	Vector v = new Vector(0, 1);
	String stError = "";
	public call()
	{
		init();
	}

	public void init()
	{
		cb = new callButten[13];
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j < 3; j++)
			{
				cb[(i*3)+j] = new callButten(1+(i*3)+j+"", 20+(j*40), 30+(i*50), 30, 30, -1, 0);
			}
		}
		cb[9] = new callButten("0", 150, 130, 30, 30, -1, 0);
		cb[10] = new callButten("拨打", 150, 30, 60, 30, -1, 0);
		cb[11] = new callButten("清除", 150, 80, 60, 30, -1, 0);
		cb[12] = new callButten("退出", 20, 220, 180, 30, -1, 0);
	}

	public void paint(Graphics g)
	{
		for(int i = 0; i < cb.length; i++)
		{
			cb[i].paint(g);
		}

		g.setColor(-1);
		g.fillRect(20, 180, 180, 30);

		if(v.size() > 0)
		{
			g.setColor(0);
			for(int i = 0; i < v.size(); i++)
			{
				g.drawString(v.elementAt(i).toString(), 22+(i*8), 182, 20);
			}
		}
		
		g.setColor(255,0,0);
		g.drawString(stError, 10, 20, 20);
	}

	public void updata()
	{

	}

	public void pointerPressed(int x, int y, GameMIDlet gm)
	{
		for(int i = 0; i < cb.length; i++)
		{
			if(x > cb[i].x && x < (cb[i].x + cb[i].width) && y > cb[i].y && y < (cb[i].y + cb[i].hight))
			{
				if(i < 10)
				{
					v.addElement(cb[i].num);
				}
				else if(i == 10)
				{
					callplat(gm);
				}
				else if(i == 11)
				{
					if(v.size() > 0)
						v.removeElementAt(v.size()-1);
				}
				else if(i == 12)
				{
					gm.quitApp();
				}
			}
		}
	}

	public void callplat(GameMIDlet gm)
	{
		String stURL = "";

		for(int i=0; i<v.size(); i++)
		{
			stURL += v.elementAt(i).toString();
		}

		try {
			if(!stURL.equals(""))
			{
				gm.platformRequest("tel:"+stURL);
			}
		} catch (ConnectionNotFoundException e) {
			stError = e.getMessage();
		}
	}
}

class callButten
{
	String num;
	int x, y, width, hight;
	int bgColor, strColor;
	callButten(){}
	callButten(String num, int x, int y, int width, int hight, int bgColor, int strColor)
	{
		this.num = num;
		this.x = x;
		this.y = y;
		this.width = width;
		this.hight = hight;
		this.bgColor = bgColor;
		this.strColor = strColor;
	}

	void paint(Graphics g)
	{
		g.setColor(bgColor);
		g.fillRect(x, y, width, hight);
		g.setColor(strColor);
		g.drawString(num, x+(width>>1)-5, y+(hight>>1)-5, 20);
	}
}

?

?

实现了J2ME的打电话功能,需要MIDP2.0支持,需注意的是,有些机器不支持platformRequest方法,比如我的E680G就不支持,并且API对此方法的描述也是雷人,- - 大概意思是“此方法应该能够拨打指定电话号码”,应该二字很雷人。

?

转载请声明出处。?

?

附件1就是此程序实例。

附件2是jar。

1 楼 googya 2010-04-28  
啪啪啪一段代码!有点说明是否更好?!
2 楼 zovikoo 2010-04-30  
googya 写道
啪啪啪一段代码!有点说明是否更好?!

实在不知道该说明点啥好,因为这段代码太容易看懂了,需要注意点地方我写上了啊~ 以后我会多多说明的~ 感谢提醒
3 楼 Java1008 2010-05-27  
代码看了  问什么在电脑上 会呼出 connector
4 楼 zovikoo 2010-06-08  
电脑上当然是拨打不了的咯