j2meblog

symbian

2009年10月9日 #

J2ME手机编程的启示http://www.j2mehome.com/j2me/jichu/12635.html

最近空闲的时间学了一下j2me开发游戏编程,感觉还是很有意思。看了很多代码后才发现很多东西的不变的:
    1.  对操作系统的了解:不了解操作系统也可以编程序,但是,也许在效率上也许会有点的偏差。
         同时对线程的理解也是编好游戏的关键。
    
    2. 面向对象程序设计:理解设计模式,框架会对我们理解游戏编程有很大的用处,如何合理的建立类,
        如何合理的建立类与类之间的关系是面向对象要解决的基本问题。

        很多时候,做程序和做人一样,只有把握根本才不会出方向性的问题,做人要讲一个真字,真实的生活,
    真诚的对人。这样,我们才会问心无愧。只有踏实的生活,才能快乐,只有本色的生活,才能快乐,只有
    勇于面对,才会快乐。只有这样,你老了以后,即使一事无成,也不会感觉人生很无奈。
       无论你是什么人,在做什么事情,都是表面的东西。就像写游戏和写网站的人,他们在做不同的事情,
    却要遵循相同的原则,期间会有一点差异,但是把握本质就不会搞错方向。
       没有钱也是这样活,有钱也是这样活,没有钱一天是24个小时,有钱也是一天24个小时,比尔盖茨也
    会因为yahoo而头大,你会因为买房子,娶老婆而头大,我相信,天底下有很多东西的原理都是相似的,
    不管你的生活状态如何,美来自内心,美不来自美宝莲。真实的生活,真实的体验生活,还是那句话,
    人诗意的生活。编程,做有思想的程序员。
       我最想不通的事情是为什么实际上的事情都是有规律的
                                     -----阿尔伯特 爱因斯坦 Tag标签: 游戏编程,操作系统,面向对象

 

posted @ 2009-10-09 21:55 j2meer 阅读(41) | 评论 (0)编辑 收藏

http://www.j2mehome.com/ PHP - 获取访客来路信息

PHP - 获取访客来路信息(转自php100)
不少网站访问统计程序提供有来路信息,客户查阅统计资料时从中得知访问者从什么网站连接过来。所谓来路,其实就是别人从哪里点击了你网站的链接,即,从什么页面连接到你的网站。 在PHP中,获取来路信息是非常简单的,我们只需用到referer。HTTP头携带的信息


不少网站访问统计程序提供有“来路”信息,客户查阅统计资料时从中得知访问者从什么网站连接过来。所谓“来路”,其实就是别人从哪里点击了你网站的链接,即,从什么页面连接到你的网站。

在PHP中,获取“来路”信息是非常简单的,我们只需用到referer。HTTP头携带的信息当中包含有一个变量$_SERVER['HTTP_REFERER'],它提供的就是“来路”完整URL地址。以下代码放入你的PHP页面脚本,它就能够打印出连接到该脚本所在页面的具体地址(即“来路”):

    $v_url=$HTTP_REFERER;
    print $v_url;

比如,用户从本站的友情链接点击你的网站,你将得到类似“http://www.php100.com/forum”的URL地址。就这么简单。

来路的URL地址可能是很长的。作为来路地址,很多情况下,我们可能只关心它属于哪个网站,即,网站的虚拟主机名叫什么。一个URL地址包含有诸多实体信息,主要有:

    ·方案(scheme)- HTTP
    ·主机(host) - http://www.php100.com/
    ·路径(path) - /forumwww.php100.com,即本站的虚拟主机名。

PHP提供一个截取这些实体信息的简便方案:parse_url()函数。parse_url()函数解析一个URL并返回一个数组,该数组就包含有上述实体及其他诸如端口(port)、查询(querry)等信息。试看:

    $v_url='http://www.php100.com/forum/reg.php'; //待处理的URL地址
    $str_ar=parse_url($v_url);
    $v_host=$str_ar['host'];
    print $v_host;

执行以上脚本,浏览器将显示:
j2me

posted @ 2009-10-09 21:23 j2meer 阅读(37) | 评论 (0)编辑 收藏

2009年8月19日 #

www.j2mehome.com Symbian 程序编程规范和数据类型

Symbian编程规范很大程度上遵循传统的 C++编码规范,除此之外,Symbian应用程序还有自己的一些程序规范:

        1.类名和函数名的第一个字母必须为大写字母,如CSimple类和Printf()函数。

        2.类成员的变量的第一个字母必须为小写i,如共有变量TInt iVal (TInt 为变量类型)。

        3.函数的形式参数名称第一个字母必须为a,如定义形参变量aInt、aValue。

        4.宏名必须以下划线开头,并且名字中的各个单词之间也要用下划线分开。如宏 _UHEAP_MARK、_LIT,另外宏名的每个字母都应该为大写字母。

        5.常量的第一个字母必须为大写字母K,如KFormat,KFileName等。

        6.枚举名称以T开头,如THelloWorldCmdAppExit。

        7.函数名称以大写L结尾表示函数在执行时可能会产生异常,如doExampleL()函数。

j2me之家 http://www.j2mehome.com/

posted @ 2009-08-19 00:21 j2meer 阅读(25) | 评论 (0)编辑 收藏

2009年8月15日 #

symbian开发的一些相关文章

1998年6月,由爱立信、诺基亚、摩托罗拉和Psion共同出资,筹建了Symbian公司。Symbian公司以开发和供应先进、开放、标准的手机操作系统——Symbian OS为目标。如今,围绕着Symbian OS开发和生产的一系列软硬件产品,在全球掌上电脑和智能手机市场上占据了大部分的份额。如果您对移动开发领域充满好奇,很想一探究竟。那么请随我们一起开始激动人心的Symbian开发之旅。

 

Symbian开发专题之工具篇

 

Symbian 开发环境搭建

Symbian 开发工具

posted @ 2009-08-15 00:33 j2meer 阅读(21) | 评论 (0)编辑 收藏

2009年8月13日 #

开机就能自动启动MIDlet J2ME push实现

J2ME开机自启动功能是通过Push注册来完成的,因此可以使用两种方式来注册。第一种通过在jad文件注明PUSH注册的方式即可,如下。

//MIDlet-Push-: , ,
MIDlet-Push-1: autostart://:, AutoStartStatic, *

请注意URL的写法是autostart://:

如果想动态注册,可以通过下面的方法。

//Registers the pushRegistry
public void Register(){
// List of registered push connections.
String connections[];
// Check to see if the connection has been registered.
// This is a dynamic connection allocated on first
// time execution of this MIDlet.
connections = PushRegistry.listConnections(false);
if (connections.length == 0) {
try {
//Register so the MIDlet will wake up when phone is started.
PushRegistry.registerConnection("autostart://:", "AutoStartDyn", "*");
sDisplayString = "MIDlet is registered";
} catch (Exception ex) {
System.out.println("Exception: " + ex);
sDisplayString = "Fail: " + ex;
}
} else {
sDisplayString = "Already registered";
}
displayForm.deleteAll();
displayForm.append(sDisplayString);
}

//Unregisters the pushRegistry
public void Unregister(){
if (PushRegistry.unregisterConnection("autostart://:")){
System.out.println("The pushRegistry is unregistered");
sDisplayString = "MIDlet is unregistered.";
}else{
System.out.println("There is no pushRegistry to unregister");
sDisplayString = "No MIDlet to unregister or failed to unregister";
}
displayForm.deleteAll();
displayForm.append(sDisplayString);
}

由于手头没有SonyEricsson JP7平台的手机,因此没有办法测试开机自动启动功能。有条件的可以自己测试一下。

http://www.j2mehome.com/j2me/jinjie/9268.html

posted @ 2009-08-13 22:25 j2meer 阅读(193) | 评论 (0)编辑 收藏

2009年7月23日 #

j2me播放音频的代码

j2me播放音频的代码import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import java.io.*;

public class PlayWav_2 extends MIDlet implements CommandListener {
 private Display display;

 private Form mainForm; // Main form

 private Command exitCommand; // Command to exit the MIDlet

 private Command playCommand; // Command to play wav file

 public PlayWav_2() {
  display = Display.getDisplay(this);
  
  exitCommand = new Command("Exit", Command.EXIT, 1);
  playCommand = new Command("Play", Command.SCREEN, 2);
  
  mainForm = new Form("Play WAV file");
  mainForm.addCommand(exitCommand);
  mainForm.addCommand(playCommand);
  mainForm.setCommandListener(this);
 }

 public void startApp() {
  display.setCurrent(mainForm);
 }

 public void pauseApp() {
 }

 public void destroyApp(boolean unconditional) {
 }

 
 public void commandAction(Command c, Displayable s) {
  if (c == exitCommand) {
   destroyApp(false);
   notifyDestroyed();
  } else if (c == playCommand)
   playwavfile();
 }

 
 public void playwavfile() {
  try {
   // 从Jar包中读取wav文件
   InputStream in = getClass().getResourceAsStream("/test.wav");
   //指定文件类型
   Player p = Manager.createPlayer(in, "audio/x-wav");
                        p.realize();
                        p.prefetch(); 
   p.start();                       
                        if(p.getState()==300){p.close();}
  } catch (Exception e) {

   Alert alr = new Alert("错误", "不能够播放 WAV 文件!", null,
     AlertType.ERROR);
   alr.setTimeout(Alert.FOREVER);
   display.setCurrent(alr, mainForm);
  }
 }
}

http://www.j2mehome.com/

 

posted @ 2009-07-23 21:14 j2meer 阅读(153) | 评论 (0)编辑 收藏

2009年7月21日 #

研究了一下J2ME的文件系统操作(JSR75),对常用操作进行了一下总结。

1)判断 手机是否支持文件系统

 /**
  *
检测手机是否支持文件系统
  * @return
  */
 public boolean isSupportFileSystem(){
  String v = System
  .getProperty("microedition.io.file.FileConnection.version");
  if(v!=null)return true;
  return false;
 }
 
通过判断SystemProperty是否存在来判断。

2)打开文件连接
         
无论是要读文件还是要写文件,首先必须得到该文件的Connection
         
使用Connector.open方法,有2个参数,第一个参数是路径,第二个参数是权限。
         
权限没什么好说的了,一共就3个可能:Connector.READConnector.WRITEConnector.READ_WRITE
         
现在来说说路径,路径是以URL形式书写的,以"file://"开头,如果是本机上的文件就加上localhost,即如果是E:/a.dat文件的路径应该是"file://localhost/E:/a.dat"

          顺便说说手机的目录结果,由于我是使用S603版的机器进行测试,所以介绍一下其目录结构。KJava程序可访问的驱动器就2个:CE(如果有扩展卡)。E驱动器下所有目录文件都可以访问,路径是E:/开始;C驱动则不是,只有图片、声音和影像三个目录可以访问,访问其它目录将抛SecurityException,其这三个目录的路径分别是C:/data/ImagesC:/data/SoundsC:/data/Videos。怎么知道有哪些目录可以访问呢,很简单把WTK自带的PDADemo放在手机上,运行FileBrowser测试一下就行了。

            FileConnection fc = (FileConnection)
                Connector.open(file://localhost/E:/a.dat  , Connector_READ_WRITE);

3)读文件
           InputStream fis = fc.openInputStream();    

          很简单,就是用openInputStream打开一个流,和读取网络数据一样,这里就不赘述了。
4)写文件

        byte[] b="Hello World".getBytes();

          OutputStream fos = fc.openOutputStream();   

          fos.write(b,0,b.length);

          使用方法也是和写网络数据一样,打开一个OutputStream就可以了,不过有一点要注意的(在N93上测试的结果,其它机器不清楚),写文件总是从开头开始写,而且不会清空原来的内容。例如本来文件中有内容abcdefghijk,再打开文件往里面写入123,最后文件的内容是什么呢?不是abcdefghijk123,也不是123,而是123defghijk。那么需要续写文件怎么办?我的做法的先把原内容读出到一个StringBuffer中,再续写在StringBuffer里,再写入文件,不知道还有没有更方便的方法。

 

 

这段时间因为开发上要用到本地文件,因此开始接触Jsr75的包,Jsr75分两个部分,一部分是File,即本地文件系统,一部分是PIM,说白了就是电话本之类的信息,我先学习的是File部分,通过import javax.microedition.io.file.*里的包,可以实现自由访问本机的文件系统,就跟Windos里的资源管理器一样,在这里我介绍几个我写的方法

.获取指定路径的目录和文件列表

 /*目录文件列表*/
 public Vector list(String path)
 {
  try
  {
   FileConnection fc=(FileConnection)(Connector.open(path));
   if(fc.exists())
   {
    Vector listVec=new Vector(0,1);
    Enumeration en=fc.list();
    while(en.hasMoreElements())
    {
     listVec.addElement((String)(en.nextElement()));
    }
    return listVec;
   }
   else
   return null;
  }
  catch(Exception e)
  {
   System.out.println("listErr:"+e.toString());
   return null;   
  }
 }

方法里的path参数就是要查找的路径,比如file:///c:/pictures/,切记,如果是目录Path,那么后面的/一定不能省,否则会查找不到内容。这个方法返回的是一个包含了指定Path下的所有目录名和文件名的向量。

.建立或者保存一个文件到指定路径

 /*保存文件*/
 public void saveFile(String path,byte[] fileData)
 {
  try
  {
   FileConnection fc=(FileConnection)(Connector.open(path));
   fc.create();
   fc.setWritable(true);
   OutputStream os=fc.openOutputStream();
   os.write(fileData);
   os.close();
  }
  catch(Exception e)
  {
   System.out.println("saveFileErr:"+e.toString());
  }
 } 

fileData是需要保存的文件内容,可以是声音,也可以是图像,或者文字之类

http://www.j2mehome.com/j2me/jichu/10448.html

posted @ 2009-07-21 20:46 j2meer 阅读(228) | 评论 (0)编辑 收藏

S60/Symbian应用程序常用架构/框架

所谓应用程序架构是指应用程序框架类的集合。基于所需的UI设计,应用程序可以具有稍微不同的架构,但是每种架构都有一些公共部分,称为核心应用程序类

  一、先看一下基础部分,具体架构在第二部分介绍

  (1)核心应用程序类.

  所有的S60 UI应用程序都具有一些基本功能:

  提供一个用户界面,用于显示信息并允许用户进行交互

  响应各种用户启动的事件,比如用户选择一个菜单项

  响应系统启动的不同事件,比如导致屏幕重绘的window服务器事件

  能够保存和恢复应用程序数据

  可以唯一性的向框架标志自身

  向框架提供有关应用程序的描述性信息,比如图标和标题等

  这些类是:视图(View)、文档(Document)、应用程序(Application)、应用程序UIApplication UI)。

  一个程序只能有一个文档,可以有多个视图。

  (2)应用程序初始化

  必须创建下面的每个方法,才能提供最小的S60应用程序:

  a、所有S60 UI都实现一个全局函数E32DLL(),当应用程序启动时,框架将首先调用该函数,该函数也称为DLL入口点,应用程序必须存在该函数。每个S60 UI 应用程序都是一个多态DLL

  b、让框架调用NewApplication(),该函数是由DLL导出的唯一函数。

  c、创建应用程序类的一个实例,并返回它的指针,以后框架使用该指针完成应用程序的创建。

  d、由框架调用AppDllUid()返回应用程序的UID。该函数必须返回在.mmp文件中指定的值,并且可用于确定应用程序的实例是否正在运行。

  e、框架获取指向新创建Document类的指针,CreateDocumentL()。

  fNewL()具体去创建

  g、矿见获取AppUi类的指针,CreateAppUiL()。

  h、由new EleaveCappUi()具体创建。

  这样一个最简短直观的框架就创建完毕。

  (3)重要的AppUi方法:

  AppUi提供了许多方法,框架可以调用这些方法通知每个应用程序各种事件。

  HandKeyEvent()用于处理用户按键

  HandleForegroundEventL()当应用程序切换到前台或从前台切换到后台时调用该函数,默认的实现可以处理键盘焦点的改变。

  HandleSystemEventL()传递由窗口服务器生成的事件

  HandleApplicationSpecificEventL()可以自己定义的自定义事件的通知。默认的实现可以处理颜色方案改变的通知。

  HandleCommandL()用于处理用户选择的菜单项

  (4)设计应用程序UI

  关于术语视图(view

  视图是概念性的术语,含义是数据模型在屏幕上的表示,实际上由一个或多个从CcoeControl派生而来的UI控件实现视图,这些控件按层次结构进行组织。父控件通常被称为容器(Container),除了用于实现视图的父控件,这种控件被称为对话框(Dialog

  在Avkon视图切换架构中,术语“Avkon视图指的是系统范围内的View服务器注册的类,它控制视图的实例化和析构。

  二、常见的symbian应用程序架构:

  每种架构都提供了设计应用程序UI的不同方法――所有的架构都提供了提交视图或应用程序数据可视化表示的方法,同时提供了一种用户用来与架构进行交互的机制。

  先简单认识一下:基于对话框的架构和传统的基于Symbian OS的架构虽不相同,但和Avkon视图切换架构相比,这两种架构彼此更为类似。Symbian开发     Symbian系统

http://www.j2mehome.com/

 

posted @ 2009-07-21 19:59 j2meer 阅读(76) | 评论 (0)编辑 收藏

2009年7月16日 #

自己总结的一些J2ME开发经验点滴

想实现一个UI,提示用户输入PIN码,输入完后函数返回用户输入的PIN码。代码如下:

public class PinInputForm
 extends Form
 implements CommandListener
{

......

 public String GetInputPIN(Display display)
 {
  //show dialog
  Displayable prevUi= display.getCurrent();
  display.setCurrent(this);
  //wait for "ok"
  synchronized(this){
   try{
    wait();
   }catch(Exception e){}
  }
  display.setCurrent(prevUi);
  return m_strRet;
 }
 public void commandAction(Command c, Displayable s)
 {
  if(c==m_CancelCommand)
  {
   m_strRet=null;
   synchronized(this){
    notify();
   }
  }
  else if(c==m_OkCommand)
  {
   m_strRet= m_txtBoxPIN.getString();
   synchronized(this){
    notify();
   }
  }
 }
}

这在Windows下很好实现,只要一个模式对话框就可以。但发现在J2ME环境下,竟然无法实现。原因是:J2ME为Midlet提供一个UI线程,且仅有一个。如果用户在该线程下阻塞,Midlet就得不到再次调度

系统原理如下:

 

经过调用Connet后:

 

如果在connet处阻塞的话,系统线程就出不来了

来源:http://www.j2mehome.com/ j2me教程 CLDC

 

posted @ 2009-07-16 19:51 j2meer 阅读(56) | 评论 (0)编辑 收藏

Symbian近期推Beta版开源Symbian

北京时间7月10日上午消息,据国外媒体昨日报道,希望被苹果iPhone和谷歌Android的势头压过。这两家竞争对手此前都已经推出了软件开发工具包并开办了应用商店。

亚1年前收购了Symbian,并将其打造成非赢利性组织Symbian基金会,而本次Beta版的Symbian^2将是该基金会的首个成果。Symbian基金会的目的是希望创建一款开源手机操作系统,可以被所有手机厂商

制订了非常积极的更新时间表。伍德预计,Symbian^2每半年就会进行一次升级以提升功能。伍德说,尽管从技术层面说,Symbian^2可以在部分现有的设备上运行,但最终的决策仍然取决于手机厂商和运营商。

Symbian基金会执行副总裁大卫伍德(David Wood)称,开源Symbian操作系统的Beta版本将于未来几周内发布。

伍德说,正式版的开源Symbian系统将在6个月后发布,搭配该系统的手机将于2010年初面世。这款名为Symbian^2的开源系统将整合之前版本的Symbian以及诺基亚S60、MOAP和UIQ等多款系统的元素。

诺基Symbian基金会还为该系统的智能手机操作系统,诺基亚却不

尽管Symbian仍然是全球使用最广泛

采用。该基金会的成员包括ATT、三星、LG电子、沃达丰和其他在业内颇具影响力的厂商。

http://www.j2mehome.com/

 

posted @ 2009-07-16 19:48 j2meer 阅读(27) | 评论 (0)编辑 收藏

仅列出标题  下一页