??xml version="1.0" encoding="utf-8" standalone="yes"?> 郑昀@ultrapower 产品名称 产品版本 Keyword: Mobile RSS Bloglines BloglinesMobileBuddy 1.0.12 [J2ME] BloglinesMobileBuddy (Bloglines手机伴G) 开源说?/SPAN> 我的资源Q?/SPAN>虽然q有q样那样的问题,但是作ؓ(f)一?/SPAN>Alpha版本?/SPAN>j2me软gQ能够在Nokia S60pd手机上运行,q样已经_?jin),所以先攑և源代码,希望抛砖引玉吸引有志者(h)l在此基上修攏V?/SPAN> http://www.cnblogs.com/Files/zhengyun_ustc/flickrBuddy.rar 服务器端?/SPAN>web service已经能够发布alpha版本?jin),请在下蝲。这是一?/SPAN>tomcat+axis搭徏环境下的java web service?/SPAN> 提请注意的是Q由于本源代码中包含?/SPAN>bluegammon/jmobilecore/henson.midp.Float/Zohar Melamed’s Jbloglines{开放源代码库,所以我也遵?/SPAN>GPL协议Q请看后面的“开源版权声明”?/SPAN> http://www.cnblogs.com/Files/zhengyun_ustc/BloglinesMobile-deployed.rar Nokia S60pd安装E序Q用数据U传BloglinesMobile.jar到?zhn)的手Z卛_安装?/SPAN> 试体验 我在Nokia 7610上测试过?jin),整体视觉效果q是不错的,而且d和阅读速度q是蛮快的。昨晚上Q在手机上竟然踏t实实把按摩乳的?/SPAN>让小强真正来一ơ历?/SPAN>》和?/SPAN>正面新闻》共计七千七百余字的|志看完?jin),呵呵Q不得不佩服Nokia7610的内存够大的Q竟然还能够畅地显C?/SPAN> Z么要?/SPAN>Bloglines制作无线阅读软g呢? ?/SPAN>2005q?/SPAN>10月,Web 2.0 Conference最后一天的?x)议上?/SPAN>Ask Jeeves的一位副董事长公布了(jin)旗下Bloglines|站的一?/SPAN>最新数?/SPAN>(PPT格式)Q这些数据也可以从另一个方面体现出目前RSS的用状c(din)?/SPAN> - 有超q?/SPAN>135万条Feed臛_有一个订阅者?/SPAN> - 14,363?/SPAN>Feed的订阅者超q?/SPAN>50人?/SPAN> - 437?/SPAN>Feed的订阅者在1000Z上?/SPAN> - 60?/SPAN>Feed?/SPAN>5000Z上订阅?/SPAN> - Slashdot是唯一订阅者超q?/SPAN>50000人的Feed?/SPAN> Bloglines是目前用最为广泛的在线RSS阅读服务之一Q这么多的订阅者,他们也许需要在无线条g下阅?/SPAN>Bloglines提供的服务,所以我制作?jin)这ƾ手机程序?/SPAN> Bloglines 是什?/SPAN> Bloglines 是一个全球最抢眼的基?/SPAN>Web?/SPAN>blog订阅跟踪服务之一Q它允许个h?/SPAN> weblog 和新ȝ各种订阅保持跟踪Q这些订阅内容以 Really Simple SyndicationQ?/SPAN>RSSQ和 Atom 提供的Ş式交付?/SPAN> 我每天第一件事情就是打开bloglinesQ看看我订阅?/SPAN>21个资料库有没有更C们的blog?/SPAN>21个资料库Q是不是了(jin)点?我也曄看过其他人有q成千上万个资料库,不过Q我感觉其中80%?/SPAN>blog其实不值得逐日跟踪?/SPAN> ׃我这个版本的 Bloglines Mobile Buddy手机伴G 也是Zbluegammon/jmobilecore/henson.midp.Float/Zohar Melamed’s Jbloglines{?/SPAN>基础上加入我的智慧整合而来的,所以决定遵?/SPAN>GPL协议的大意开放源代码Q?zhn)可以自由传播和修改,在遵照下面的U束条g的前提下Q?/SPAN> 条g1 只要你在Bloglines Mobile Buddy?/SPAN>每一副本上明昑֒恰当地出版版权声明,保持此许可证的声明和没有担保的声明完整无损,q和E序一L(fng)每个其他的程序接受者一份许可证的副本,你就可以用Q何媒体复制和发布你收到的原始的程序的源代码。你可以{让副本的实际行动收取一定费用,但必M先得到郑昀的同意?/SPAN> 条g2 你可以修?/SPAN>Bloglines Mobile BuddyE序的一个或几个副本或程序的M部分Q以此Ş成基于程序的作品。只要你同时满下面的所有条Ӟ你就可以按前面第一Ƅ要求复制和发布这一l过修改的程序或作品?/SPAN> aQ?/SPAN> 你必d修改的文件中附有明确的说明:(x)你修改了(jin)q一文g?qing)具体的修改日期?/SPAN> bQ?/SPAN> 你必M你发布或出版的作品(它包含程序的全部或一部分Q或包含q序的全部或部分衍生的作品Q允许第三方作ؓ(f)整体按许可证条款免费使用?/SPAN> cQ?/SPAN> 如果修改的程序在q行时以交互方式d命o(h)Q你必须使它在开始进入常规的交互使用方式时打印或昄声明Q包括适当的版权声明和没有担保的声明(或者你提供担保的声明)(j)Q用户可以按此许可证条款重新发布E序的说明;q告诉用户如何看到这一许可证的副本。(例外的情况:(x)如果原始E序以交互方式工作,它ƈ不打印这L(fng)声明Q你的基于程序的作品也就不用打印声明Q?/SPAN> q样Q?zhn)可以自׃用ƈ传播本源代码Q当然请(zhn)原不动地保留原作者信息?/SPAN> ~写?/SPAN> 日期 关键?/SPAN> 郑昀@ultrapower 2005-12-27 Mobile RSS READER ONLINE BLOGLINES Java J2ME L(fng)Q?BR>《Series 60 Developer Platform 2.0: Specification v1.0》, /** /** /** /** /** /** QIftkeysq没有被包含在QDQͼQ0的规范中Q所以, 以下Ҏ(gu)打电(sh)话的手机按键的定义是在nokia、三星和MotorolaQv80/220/300/400/500/600, e398, c650Q:(x)
/** 以下q种定义是在襉K子:(x)
/** 以下q种定义是在Motorola platform phones iDEN, T280, T72x, v6x
/** 2005q?2?5日晚上:(x) W一步,输入你的bloglinesd?sh)子邮g地址Q?/P>
然后输入你的d密码Q?/P>
然后手机去bloglines站点(g)索你所订阅的blog源,q将标题和未读blog条目数显C在界面上,如下所C:(x) 点击其中一个blog标题Q你可以看到该blog的你未读过的blog文章集合Q如下所C:(x) 与之对照的blog文章如下所C:(x) 更多囄Q?BR> 2005q?2?5? 它是利用?A >http://www.bloglines.com/myblogsq个世界上最大的blog订阅源服务提供的服务Q请看它的界面:(x) 下面是我的“关于”,呵呵Q?BR>
开源版权声?/SPAN>
]]>
你所说的KEY_SOFTKEY1,KEY_SOFTKEY2,KEY_SOFTKEY3q几个定义,应该是Nokia Qテ QPQ中的uullEanvas定义的吧?
而QDQͼQ0的Eanvas规范ƈ没有定义q几个?/P>
Page 77:
Left soft key, -6, "Left soft key" or left soft-key symbol
Right soft key, -7, "Right soft key" or right soft-key symbol
Middle soft key, -5, "Select", "Middle soft key" or similar symbol
所以我们的Qokia、Samsung和SonyEricsson专有E序中会(x)q么定义Q?BR> /**
* Key code for the FIRE game action.
*/
public static final int KEY_FIRE = -5;
* Key code for left soft key
*/
public static final int KEY_SOFT_LEFT = -6;
* Key code for right soft key
*/
public static final int KEY_SOFT_RIGHT = -7;
在摩托罗拉专有的E序中则q么定义Q?BR> /**
* Key code for the FIRE game action.
*/
public static final int KEY_FIRE = 20;
* Key code for left soft key
*/
public static final int KEY_SOFT_LEFT = 21;
* Key code for right soft key
*/
public static final int KEY_SOFT_RIGHT = 22;
在西门子E序中则q么定义Q?BR> /**
* Key code for the FIRE game action.
*/
public static final int KEY_FIRE = -26;
* Key code for left soft key
*/
public static final int KEY_SOFT_LEFT = -1;
* Key code for right soft key
*/
public static final int KEY_SOFT_RIGHT = -4;
如果你非要在手机上用这几个QIftkeysQ那么请注意手机的差异,你可能需要针对不同款手机分别定义?jin)?BR>
* Key code for PHONE_ON key (green button)
*/
public static final int KEY_PHONE_ON = -10;
* Key code for PHONE_ON key (green button)
*/
public static final int KEY_PHONE_ON = -11;
* Key code for PHONE_ON key (green button)
*/
public static final int KEY_PHONE_ON = -14;
]]>
今日完成的开发,是点d面列出的blog订阅源标题,则请求bloglines(g)索这个特定订阅的博客d条目?BR>以弹出式对话框展C文章内宏V?BR>下面演示此j2me软gQ?/P>
Q?/P>
]]>
制作完成?jin)flickrBuddy web serviceQ可以完成对bloglines api的方便调用。手机客L(fng)则用kSoap来访
问这个flickrBuddy web service来获得用L(fng)bloglines订阅源?BR>首先Q可以看C的“my feeds”中列出的blog订阅源标题(sh)?qing)未L目的数目。比如:(x)
Engadget Simplified Chinese[16]
旁观者的奇妙冒险[0]
未完?- Incomplete[0]
王徏[0]
车东[Blog^2][0]
下一步完成:(x)
点击“Engadget Simplified Chinese[16]”的标题菜单Q就可以看到未读的条目全文?/FONT>
]]>
new Thread(this, "Menu thread").start();
必须改写?BR>
Thread thread;
(thread = new Thread(this)).start();
方能在真Zq行?BR>
q种E序自动退出的问题Q有时候是因ؓ(f)你根本猜想不到的代码D的,q时候只能通过二分排除?不断地注释代码来~小代码范围)来判定了(jin)?
W二Q再譬如_(d)
你的代码中有对double的用,比如q种代码Q?BR>
double alpha = (double)Math.abs(i - m_canvasWidth / 2) /
(double)m_canvasWidth;
但是Q注意一点,CLDC1.1才开始支持MathQ“Math functions in java.lang package is available only since CLDC-1.1”。所以,如果你一旦在CLDC1.0的nokia手机上用,那么Q即使你用了(jin)try/catch捕获异常Q程序也?x)自动退出?BR>
q时候你也不要惊诧?
W三Q?BR>Thread thread;
(thread = new Thread(this)).start();代码可以q行?BR>但是Thread thread;
(thread = new Thread(this, "Menu thread")).start();
׃(x)DNokia真机立即退出?BR>同样Q?BR>Thread thread;
(thread = new Thread(new Runnable()
{
public void run()
{
m_inputHandler.handleStringInput(input);
}
}, "inputHandler")).start();
也会(x)D立即退出?BR>以上虽然模拟器可以运行,但是真机是不允许的?/DIV>
]]>
探烦(ch)手机
javaMEpȝ信息的实用工?/SPAN>
本文档帮你了(jin)解实用工?/SPAN>midletinfoQ简单地_(d)它发掘(sh)(jin)javaME所能得到的大多数系l信息,对试囑ְ自己的程序在不同ƾ手Zq行的开发者会(x)很有帮助的?/SPAN>
下蝲链接Q?/SPAN>http://jmobilecore.sourceforge.net/midletinfo/index.html?/SPAN>
官方介绍Q?/SPAN>
Midletinfo展示以下信息Q?/SPAN>
u pȝ信息Q?/SPAN>内存?sh)?qing)j2me属性;
u 屏幕信息Q分辨率、色彩支持、绘制属性和按键属性;
u 字体Q?/SPAN>
u d上按键对应的?/SPAN>(很有用!)Q?/SPAN>
u 所支持的连接协议类型;
q些信息对于开发者而言Q都非常有用。比如说很多开发者遇到的问题是,按键对应的数|每款手机都不太一_(d)?/SPAN>midletinfo很Ҏ(gu)帮你定?jin)?/SPAN>
源代码在此:(x)http://jmobilecore.sourceforge.net/midletinfo/src
如图所C:(x)
看,~码cd?/SPAN>cldccd?/SPAN>midpcd都知道了(jin)?/SPAN>
如图所C:(x)
是否支持双缓册Ӏ屏q大都知道?jin)?/SPAN>
如图所C:(x)
按下哪个键,屏幕上就l制?gu)个键对应的倹{?/SPAN>
如图所C:(x)
看,手机当前是否支持http/tcp/udp/file/sms/cbs/ssl都可以立即知道?/SPAN>
郑昀@ultrapower |
名称 |
版本 |
Keyword: midlet information j2me tool |
midletinfo |
0.9.1 |
而且我搜索了(jin)它的5个java文gQ它在什么情况下调用System.gc()呢?
下面三种情况Q?BR>用户q回游戏?可能之前L听电(sh)话了(jin)Q或者去讄里改参数?jin)?Q?BR>用户选完飞机后,q可能是一个选项菜单Q选飞机时所用到的资源可能以后在游戏中没必要用,所以及(qing)时回收一下;
昄q关界面Ӟq时候有卡的现象Q欢喜的用户也不?x)在意的?/P>
除此之外没有了(jin)?BR>
Nokia 的文?/STRONG>Known Issues In The Nokia 6600 MIDP 2.0 Implementation v1.7_(d)(x)
2.15.1 Garbage collecting
Description
Calling the System.gc() method results in extreme slowness and jamming. In Monty 1.0 VM, garbage
collection is different and every time System.gc is called, the entire memory is really cleared.
This is an extremely slow process!
Solution
Do not call the System.gc method at all, or call the System.gc() garbage collecting method only
in non-time-critical situations, such as screen transitions, state transitions, pause states,
etc. If the System.gc() method is used, it is recommended to add a short delay (~20-50 ms) after
the method call to ensure the sufficient time for the garbage collection, as in the following
example
System.gc();
Thread.sleep(delay); delay = 20-50 ms
Windcao提供?/SPAN>CreateAlphaImage的意思是q样的“如果需要半透明可以先在image上画Q然后把q个Image弄成半透明的。最后将Imagel到Canvas上就OK?jin)”?/SPAN>
我在工程中用?jin),有效果,好像也不需要对原始?/SPAN>Image src有什么特D要求?/SPAN>
可以?/SPAN>
做一下对比?/SPAN>
后者没有将囄?/SPAN>CreateAlphaImage处理。所以绘制的囄覆盖?jin)原来的文字?/SPAN>
我是在一?/SPAN>CustomItem扩展cM使用q个半透明囄的,代码如下所C:(x)
实践效果q是不错的?/SPAN>
感谢windcao的代码共享和思\提供Q?/SPAN>
解决办法Q?/STRONG>
一是确定服务器端正地改写?jin)HTTP_CONTENT_LENGTH头域Q?BR>二是针对手机端拿C(jin)HTTP_CONTENT_LENGTH的错误数?1Q作相应处理?/P>
]]>
2.1 How do I write a xxxx game ?
2.2 Where can I find xxxx's developer's site? Where can I find xxxx's SDKs ?
2.3 How do I make a game? Do I need to learn Java first ?
2.4 What are the basic differences between developing in J2SE and J2ME?
2.5 How do I do xxxxx? (Which isn't realated to or doesn't use J2me)
2.6 How much Heap/What screen size is/What MIDP or CLDC version is XXX handset/device?
3.1 How do I use the Nokia UI API in the Wireless Toolkit?
3.2 How do I add API X (bluetooth, wma, mmapi, Image.getRGB, ...) to a phone that does not have built in support for API X?
3.3 I am using a third party library in my app and when I try to emulate it I gives me an error like: preverfication error: com/cool/library/ClassA. What am I doing wrong?
3.4 But it's a library therefore it goes into the library directory right?
3.5 Where can I find out about XXX api to see if it is possible to do YYY with j2me?
3.6 Where can I find out if my phone supports XXX JSR?
3.7 How can I find out about whether a specific phone supports soemthing with closed APIs?
4.1 What language should I write my server in?
4.2 How do I talk to a FTP server, database, www.something.com:xxx?
4.3 How do I connect to an Database? / Can I use SQL?
4.4 I get an Exception when I try to connect to web services from the WTK emulators?
4.5 Where can I find a list of GPRS access points for REAL internet access not just WAP gateway access?
6.1 Can I access the phone's xxxx? (memory, phone book, inbox, pictures...) ?
6.2 Is it possible to access the SIM card from a java midlet in order to get the operator ID and the telephone number?
6.3 Can I access the Pictures/SMS/Phones numbers that are already on my phone?
7.1 I want to display a "Busy, please wait..." screen while i do my networking/any other lengthy process, but the waiting screen never appears, and after the process is over the result screen appears. What's wrong ?
7.2 How do I capture keypresses on a Form/List/Alert?
7.3 Ok, then how do I put a canvas on the form or use a highlevel widget on the canvas?
7.4 Why doesnt my app switch between my two/three/fifty-seven canvases when I call myDisplay.setCurrent(nextCanvas)?
7.5 Why when I set the GameCanvas to full screen does getHeight() not return the right value?
9.1 I've just developed a J2ME app in an emulator. Now I want to try it in a real phone. How can I transfer my app to a phone? Do I need to do it Over the Air (OTA) and pay a call charge each time?
9.2 But how do I do an OTA installation?
9.3 How can I automatically update my MIDlet from within the MIDlet?
11.1 Memory Management In J2ME
11.2 What is garbage collection?
11.3 Where is the Java equivalent of delete?
11.4 What happens when I call System.gc()?
11.5 Assuming garbage collection does occur, how does it work?
11.6 This tutorial is pretty useless, what can you tell me that is definitive?
11.7 How can I make it easy to ensure an object's eligibility for garbage collection?
11.8 How can I prevent my object from being elegible for garbage collection?
11.9 My device has XX kilobytes of memory but I cannot allocate all of it. What is going on?
11.10 When I print out an object I get something like Object@345563. Isn't this the address of the object?
11.11 How do I deal with OutOfMemoryErrors?
11.12 Is there any way to determine the real addresses of objects on the heap?
唯一支持的同步播N乐的办法是,midi和wav声音混合播放?BR>即是这P也存在着一个限Ӟ(x)
应用E序必须先播放midi(可以作ؓ(f)背景音乐)Q然后再播放wavQwav文gq必L以下的格式:(x)
PCM 8000KHZQ?BR> 8BitQ?BR> Mono?/P>
除了(jin)上面q种Ҏ(gu)Q只要是一个新的media被播放,上一个Player必须被停止而且释放资源?BR>
我的一个设x(chng)(未曾代码试验q,错了(jin)h?Q?/P>
用户按键??那么计数他按?jin)多下Q根据他按的ơ数M事先写好的数l中查到是哪一个字W。如果用戯q没有再按下去,那么C(jin)一定时_(d)应该确认他的输入了(jin)Qtimer呢就调用confirmCharacter()?/P>
String[] values = {".,1","abc","def"... ...};
keyPressed(keyCode) {
int index = keyCode - KEY_NUM0;
if(index == lastindex) charselected++;
else lastindex = index;
// here reset the key confirmation timer
tempInputString+=values[index].char(charselected);
}
//When timer gets triggered, it calls this method
void confirmCharacter() {
inputString = tempInputString;
lastindex = -1;
}
如果我说错了(jin)Q请指出?/P>
譬如说你当前是在一个Canvas上,okQ?BR>To "catch" an event, just implement one of
# showNotify()
# hideNotify()
# keyPressed()
# keyRepeated()
# keyReleased()
# pointerPressed()
# pointerDragged()
# pointerReleased()
如果你特地针对keyPressedQ那么:(x)
public class MyCanvas extends Canvas {
MyMIDlet midlet; // the midlet reference
public MyCanvas(MyMIDlet m) {
midlet = m;
}
protected void keyPressed(int keyCode) {
if (getGameAction(keyCode) == Canvas.FIRE) {
midlet.firePressed();
}
}
}
不过Q值得注意的是Q手机的按键q不能保证个个都能拿刎ͼ而且上下左右之类的特定意义的按键也未见得都有Q所以小?j)?
Port number Description
2805 WAP WTA secure connection-less session service
2923 WAP WTA secure session service
2948 WAP Push connectionless session service (client side)
2949 WAP Push secure connectionless session service (client side)
5502 Service Card reader
5503 Internet access configuration reader
5508 Dynamic Menu Control Protocol
5511 Message Access Protocol
5512 Simple Email Notification
9200 WAP connectionless session service
9201 WAP session service
9202 WAP secure connectionless session service
9203 WAP secure session service
9207 WAP vCal Secure
49996 SyncML OTA configuration
49999 WAP OTA configuration
普通SMS的端口是特定的,可以通过this.getAppProperty("SMS_Port")来获取,只要你的讑֤支持JSR120?/P>
http://www.j2medev.com/bbs/dispbbs.asp?boardid=21&id=4099&star=1#2083 Q这里是原始讨论贴?/SPAN>
q里我们l出一个思\Q?/SPAN>可以先这P手机先访问一个固定的|址Q然后就?x)被分配一?/SPAN>IPIP?jin)?/SPAN>
Efei_(d)刚才试?jin)下Q用一D|档上提供的代码,也就那两三句?/SPAN>
try{
ServerSocketConnection scs = (ServerSocketConnection) Connector.open("socket://:1234");
frmMain.append("ip:" + scs.getLocalAddress());
}
catch (Exception e) {}
取得?jin)一?/SPAN>IPQ?/SPAN>10.66.7.28?/SPAN>
q个IP外部|络是无法访问的Q换a之,内部|络可以讉K?/SPAN>
所以只要在Ud的机房有服务器,你可以访问了(jin)
但是q有个问题,q个IP是动态变化的Q所以至需要客L(fng)先访问服务器一下,让服务器知道你现在的IP?/SPAN>
efeisocket://10.15.134.128:4234Internetp2p理论上也许是可行的?/SPAN>
http://www.cnblogs.com/Files/zhengyun_ustc/GetDynamicIP.rarjarhttp://www.cnblogs.com/Files/zhengyun_ustc/GetDynamicIP-deployed.rar下蝲Q?/SPAN>
Nokia7610试通过?/SPAN>
朋友们也可以自己在真Z试验下这个程序?/SPAN>
socket IP |
//Use an unrestricted filter. String filter = "*"; String url = "socket://:" + m_sSocketPort; ServerSocketConnection ssc = null; try { //Open the connection. ssc = (ServerSocketConnection) Connector.open(url); System.out.println("/* Already Open the connection!"); //Discover the system-assigned port. url = "socket://:" + ssc.getLocalPort(); //Register the connection now. The AMS will //remember the registered URL even when the MIDlet //is not active. PushRegistry.registerConnection(url, m_sMidletClassName, filter); System.out.println("/* Already Register the connection now!" + url); //Now publish the push URL. We can use an HTTP //POST or a socket or datagram for this. String purl; purl = "socket://" + ssc.getLocalAddress() + ":" + ssc.getLocalPort(); publishInboundConnection(purl, m_sMidletClassName); } |
1. Java SDK (JDK) from Sun (you should already have this)
2. Java Wireless Toolkit (WTK) also from Sun
3. Ant and Antenna to allow you to automate your build
1. keytool (from the JDK)
2. 3. 4. 5. 6. 7. 8.
1. javac to build your MIDlet paying special attention to your classpath and bootclasspath options (otherwise preverification will fail). I also set target to 1.1 and source to 1.3
2. 3. 4. 5. 1. jarsigner
2. 3. 4. JadTool.jar from the WTK
5. 6. JadTool.jar
7. 8. jar, signing, nokia, midlets, technology
W二Q?MessageConnection)Connector.open监听不同端口是没有问题的。比?A >http://www.cnblogs.com/Files/zhengyun_ustc/SimplePushRegistry.rar的例子,你就可以看出q一炏V在midlet的startApp中,
protected void startApp() throws MIDletStateChangeException {
if (!init) {
init = true;
String[] conns =
PushRegistry.listConnections(false);
System.out.println("Found " + conns.length +
" connections.");
for(int ccnt=0; ccnt < conns.length; ccnt++){
DatagramHandler handler =
new DatagramHandler(conns [ccnt], this);
connectionHandlers.addElement(handler);
handler.start();
}
}
}
从而得到所有注册的q接Qƈ转发l线E处理。线E就可以Ҏ(gu)所传入的连接名Uͼ自行打开Q?BR> public DatagramHandler(String c, PushSMSListner midlet){
try {
dgc = (DatagramConnection)Connector.open(c);
} catch (IOException x){
x.printStackTrace();
}
m_midlet = midlet;
}