接触J2ME 也有一段时间了,把JME比作一个太监,过之而不及啊。操作系统对J2ME于 的Security 限制真是太多太多了,
欢迎转载 http://blog.allove.org
1.J2ME 访问用户已读的短信
2. J2ME 非认证Midlet 访问网络 PIM ,MULITIMEDIA 等等的安全警告!
3.J2me Midlet开机启动
4.操作系统IPC 进程 Device 信息 电池信息等访问
痛苦久了就会想办法去解决它了,最开始在上unix课程的时候老师 讲到Socket 标准问题,突然间有个灵感,Symbian和Midlet 能否用Socket 通信呢?Socket 既然所有的都遵循标准那么理论上面就是可行的了!
那么实现了Midlet 和操作系统的通信 那么不就可以利用J2ME 去调用那些我们无法触及的应用呢!那不是一下子让J2ME 的限制又扩展了很多了 呵呵
解决思路 就是
一个Symbian Native Services 然后 一个Midlet 访问数据 Native Services 监听来自端口的信息 接受之后进行本地处理 然后将结果返回给Midlet .
以利用J2ME 读取用户短信为例
启动 socket 服务— 监听 —- Midlet 通过Socket 向 Native Services 发送请求 —-》处理数据—-》接受数据—》Midlet处理 更多应用
Symbian 代码 片段 监听Socket
blank.Open(socketServ);
listener.Accept(blank, status);
User::WaitForRequest(status);
if(status != KErrNone) User::Leave(KErrGeneral);
gConsole->Printf(_L("Accepted connection!!n"));
blank.RecvOneOrMore(buffer, 0, status, dummyLength);
User::WaitForRequest(status);
if(status != KErrNone) User::Leave(KErrGeneral);
if( (buffer[0] == 'p') )
{
ProcessList(&buffer);
gConsole->Printf(_L("Processing process request!!n"));
}
else if( (buffer[0] == 'c') )
{
gConsole->Printf(_L("Closing server!!n"));
running = EFalse;
buffer.Copy(KClosing);
}
else
{
gConsole->Printf(_L("Bad command!!n"));
buffer.Copy(KBadCommand);
}
blank.Write(buffer, status);
User::WaitForRequest(status);
if(status != KErrNone) User::Leave(KErrGeneral);
blank.Close();
}//end of while loop
MIDLET 数据处理
import javax.microedition.io.*;
import java.io.*;
public class ClientConnection {
private NATClientMIDlet midlet;
private static String url = “socket://127.0.0.1:8100″;
//http://blog.allove.org/archives/j2me-fuck-symbian
private String request;
public ClientConnection(NATClientMIDlet midlet) {
this.midlet = midlet;
}
public void sendRequest(String message) {
this.request = message;
new Thread(){
public void run() {
if( request.equals(”") ){
midlet.showAlert(”Enter a request!”);
}else {
sendMessage();
}
}
}.start();
}
public void sendMessage() {
try{
StreamConnection conn = (StreamConnection)Connector.open(url);
OutputStream out = conn.openOutputStream();
byte[] buf = request.getBytes();
out.write(buf, 0, buf.length);
out.flush();
out.close();
byte[] data = new byte[256];
InputStream in = conn.openInputStream();
int actualLength = in.read(data);
String response = new String(data, 0, actualLength);
midlet.textBox.setString(response);
in.close();
conn.close();
}catch(IOException ioe){
ioe.printStackTrace();
midlet.showAlert(”Allove 连接失败”);
}
}
}
这里只提供了解决思想和简单的解决方案 实际应用还得与实际情况进行分析和权衡 找到合适的方案