- 浏览: 167857 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
兰斯洛特1987:
顶!!!!谢谢分享.最近我也在研究这玩意...
Java语言的Hook实现 -
pu02203:
我把Confidant.jar, 丢进去eclipse, 里面 ...
重磅推出诛仙辅助软件第二波:Java版按键精灵 -
泣血端午:
Calculagraph 这是哪个类啊?
A星算法 -
haitaohehe:
我使用的是jstl1.0 可是在使用<c:set va ...
JSTL1.0和JSTL1.1的区别 -
micheal19840929:
学习楼主,我也测试一下~看看兼容性吧。lanlanzhilia ...
手机版飞鸽传书:无线牵
在J2ME开发的时候,可能会需要浏览手机的文件目录,但是又没有和J2SE里面的JFileChooser一样的组件可以用,只有自己写一个了,在写的过程中,发现了一些问题,在此与大家分享一下。
一开始我以为,只要是支持JSR75的手机都可以支持手机内所有文件的访问,可是在真机上一看才知道,手机的文件或者文件夹有公有与有私有之分,我们看上去像是公有的文件夹,在J2ME里面却不能访问。比如我测试用的手机是诺基亚的N76,它的SD卡上的Music目录,对于程序来说,就是私有的,不能访问的,而"手机动漫"这个目录却是能访问的。难怪我测了很多次放在Music目录里面的歌曲,怎么播也播不出来,后来经过一步一步的调试,才知道原来此目录下面的文件不可读。要知道ME的调试是多么不方便,又不能用System.out.println调试,因为在真机上面根本就没有输出窗口。只能自己一句一句用Alert来调试。
不说废话了,先给出代码吧。这是一个继承自 List的组件。用列表的方式显示出当前目录下的所有文件。本来是想全新写一个的,后来发现netbeans有一个,所以就直接用了它的,写得很不错,说到这里,我觉得netbeans很多地方确实不错,只是很多人由于以前的偏见没有给它机会而已。
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.io.IOException; import java.util.Enumeration; import javax.microedition.io.Connector; import javax.microedition.io.file.FileConnection; import javax.microedition.io.file.FileSystemRegistry; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.List; /** * * * * * @author hadeslee */ public class FileBrowser extends List implements CommandListener { /** * * Command fired on file selection. */ public static final Command SELECT_FILE_COMMAND = new Command("选择", Command.OK, 1); private String currDirName; private String currFile; private Image dirIcon; private Image fileIcon; private CommandListener commandListener; /* special string denotes upper directory */ private static final String UP_DIRECTORY = ".."; /* * special string that denotes upper directory accessible by this browser. * * this virtual directory contains all roots. */ private static final String MEGA_ROOT = "/"; /* separator string as defined by FC specification */ private static final String SEP_STR = "/"; /* separator character as defined by FC specification */ private static final char SEP = '/'; private Display display; private String selectedURL; private String filter = null; private String title; /** * * Creates a new instance of FileBrowser for given <code>Display</code> * object. * * * @param display * non null display object. */ public FileBrowser(Display display) { super("文件浏览器", IMPLICIT); currDirName = MEGA_ROOT; this.display = display; super.setCommandListener(this); setSelectCommand(SELECT_FILE_COMMAND); try { dirIcon = Image.createImage(this.getClass().getResourceAsStream( "dir.png")); } catch (IOException e) { dirIcon = null; } try { fileIcon = Image.createImage(this.getClass().getResourceAsStream( "file.png")); } catch (IOException e) { fileIcon = null; } showDir(); } /** * * 显示当前的文件夹 */ private void showDir() { new Thread(new Runnable() { public void run() { try { showCurrDir(); } catch (SecurityException e) { Alert alert = new Alert("错误", "您没有权限访问此文件或文件夹!", null, AlertType.ERROR); alert.setTimeout(2000); display.setCurrent(alert, FileBrowser.this); } catch (Exception e) { e.printStackTrace(); } } }).start(); } /** * * Indicates that a command event has occurred on Displayable d. * * * @param c * a <code>Command</code> object identifying the command. This * is either * one of the applications have been added to * <code>Displayable</code> with * <code>addCommand(Command)</code> * or is the implicit * <code>SELECT_COMMAND</code> of List. * * @param d * the <code>Displayable</code> on which this event has * occurred */ public void commandAction(Command c, Displayable d) { if (c.equals(SELECT_FILE_COMMAND)) { List curr = (List) d; currFile = curr.getString(curr.getSelectedIndex()); new Thread(new Runnable() { public void run() { if (currFile.endsWith(SEP_STR) || currFile.equals(UP_DIRECTORY)) { openDir(currFile); } else { // switch To Next doDismiss(); } } }).start(); } else { if (commandListener != null) { commandListener.commandAction(c, d); } } } /** * * Sets component's title. * * * @param title * component's title. */ public void setTitle(String title) { this.title = title; super.setTitle(title); } /** * * Show file list in the current directory . */ private void showCurrDir() { if (title == null) { super.setTitle(currDirName); } Enumeration e = null; FileConnection currDir = null; deleteAll(); if (MEGA_ROOT.equals(currDirName)) { append(UP_DIRECTORY, dirIcon); e = FileSystemRegistry.listRoots(); } else { try { currDir = (FileConnection) Connector.open("file:///" + currDirName); e = currDir.list(); } catch (IOException ioe) { } append(UP_DIRECTORY, dirIcon); } if (e == null) { try { currDir.close(); } catch (IOException ioe) { ioe.printStackTrace(); } return; } while (e.hasMoreElements()) { String fileName = (String) e.nextElement(); if (fileName.charAt(fileName.length() - 1) == SEP) { // This is directory append(fileName, dirIcon); } else { // this is regular file if (filter == null || fileName.indexOf(filter) > -1) { append(fileName, fileIcon); } } } if (currDir != null) { try { currDir.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } private void openDir(String fileName) { /* * In case of directory just change the current directory * and show it */ if (currDirName.equals(MEGA_ROOT)) { if (fileName.equals(UP_DIRECTORY)) { // can not go up from MEGA_ROOT return; } currDirName = fileName; } else if (fileName.equals(UP_DIRECTORY)) { // Go up one directory // TODO use setFileConnection when implemented int i = currDirName.lastIndexOf(SEP, currDirName.length() - 2); if (i != -1) { currDirName = currDirName.substring(0, i + 1); } else { currDirName = MEGA_ROOT; } } else { currDirName = currDirName + fileName; } showDir(); } /** * * Returns selected file as a <code>FileConnection</code> object. * * * @return non null <code>FileConection</code> object */ public FileConnection getSelectedFile() throws IOException { FileConnection fileConnection = (FileConnection) Connector .open(selectedURL); return fileConnection; } /** * * Returns selected <code>FileURL</code> object. * * * @return non null <code>FileURL</code> object */ public String getSelectedFileURL() { return selectedURL; } /** * * Sets the file filter. * * * @param filter * file filter String object */ public void setFilter(String filter) { this.filter = filter; } /** * * Returns command listener. * * * @return non null <code>CommandListener</code> object */ protected CommandListener getCommandListener() { return commandListener; } /** * * Sets command listener to this component. * * * @param commandListener * <code>CommandListener</code> to be used */ public void setCommandListener(CommandListener commandListener) { this.commandListener = commandListener; } private void doDismiss() { selectedURL = "file:///" + currDirName + currFile; CommandListener listener = getCommandListener(); if (listener != null) { listener.commandAction(SELECT_FILE_COMMAND, this); } } }
这个类可以用做浏览手机文件之用,也可以用做得到得选的文件之用,如果想要在选择了文件以后做什么事情的话,可以调用它的setCommandListener方法。并且处理SELECT_FILE_COMMAND.
经过试验,我发现所有的只读文件夹对于FileConnection来说,就是私有的,是不能访问到的,所以当我们要访问的时候,最好是把那些只读的文件夹改为可读写。
发现一件N76的文件的好玩的事情。在N76里面,你访问的时候,总共有四个根文件夹,分别是:手机存储/ C:/ 存储卡/ E:/可是我发现手机存储和C是一样的,存储卡和E也是一样的,也就是说可以用file:///手机存储/来访问也可以用file:///C:/来访问。
发表评论
-
J2ME的RMS
2010-04-10 23:32 2514在JAVAME中,程 ... -
M3G游戏中性能提升技巧
2010-03-28 17:59 753JSR184 M3G(Mobile 3D Grap ... -
在J2ME开发中获取系统属性
2010-03-27 18:21 521在J2ME开发中,我们经常需要和手机系统进行交互,获得一些和系 ... -
导出M3G文件指南
2010-03-25 12:54 954概述: 这 ... -
J2ME中使用microlog
2010-03-22 22:17 1410import javax.microedition.mi ... -
M3G教程:进阶篇(六)动画
2010-03-21 21:33 1315M3G中动画的数据结构如下: 【载入W ... -
3DS MAX导出M3G动画
2010-03-21 10:11 19981、用3D Studio Max或者Maya的插件h3texp ... -
M3G教程:进阶篇(四)模型
2010-03-21 01:18 1060import javax.microedition.lc ... -
M3G教程:进阶篇(三)纹理
2010-03-21 01:18 1036纹理(Texture) java.lang.Objec ... -
M3G教程:进阶篇(二)灯光
2010-03-21 01:16 1664灯光(Lighting) java.lang.Obje ... -
M3G教程:进阶篇(一)金字塔
2010-03-21 01:15 1211关于World public class World ... -
M3G教程:入门篇
2010-03-21 01:14 16383D技术对我们来 ... -
一点对m3g模型文件解析的工作
2010-02-11 09:49 861因为最近不会在m3g文件上继续工作,把之前一点少少的工作放出来 ... -
J2ME 3d之3DMAX制作M3G错误二例
2010-02-11 09:35 0(1) 在制作J2ME 3D所需的M3G时出现导出 ... -
M3G教程:进阶篇(五)立即模式
2010-02-09 23:51 0保留模式和立即模式渲染 保留模式是当你使用一个世界它含有的全 ... -
KVM的类加载
2010-02-09 15:46 822首先简要介绍一下class文件的结构(详细内容请参考Java虚 ... -
手机版飞鸽传书:无线牵
2010-01-30 21:02 2927【中文名】无线 ... -
FileConnection简介(JSR-75)
2010-01-29 01:17 8911 引言 本文档 ... -
J2ME添加自定义图标
2010-01-23 23:52 1374与图标有关的是这两行: MIDlet-Icon: ... -
j2me签名相关注意事项
2010-01-23 23:45 2029我们得到一个证书后就可以对j2me的jad文件进行签名。这 ...
相关推荐
在开发J2ME应用时,通常会根据设备特性和需求选择合适的JSR API。例如,如果需要开发一个包含蓝牙功能的应用,JSR 82是必不可少的;如果要创建一个地理位置相关的应用,那么JSR 179将是关键。通过了解和熟练掌握这些...
创建一个计算器应用涉及使用J2ME的基础UI组件,如TextItem用于输入数字和运算符,ChoiceGroup用于选择运算类型,以及Command对象来处理用户操作。计算逻辑通常会封装在一个单独的类中,处理输入数据并返回结果。 4...
这涉及到读取文件系统目录,可能需要JSR-75(File Connection API)的支持。用户可以选择本地存储卡上的MP3文件进行播放。 ### 7. 性能优化 J2ME应用需要考虑内存和处理器性能。播放大文件时,可能需要分块加载和...
实验中使用了TextBox组件显示书籍内容,List组件作为书目的选择菜单,Form组件展示章节列表。实验中增加了新的书籍和调整了文本样式,如斜体、粗体和下划线。通过实现CommandListener和ItemCommandListener接口,...
JSR 75,即“个人信息服务”规范,为J2ME提供了一套API来访问这些功能。本文将深入探讨如何在J2ME中利用JSR 75包中的PIM API来访问手机本地的电话本。 首先,JSR 75为PIM提供了统一的接口,使得开发者可以跨不同...
4. **用户界面(UI)**:设计友好的用户交互界面,如出牌选择、提示信息等,这在J2ME中通常用到Form、ChoiceGroup和TextBox等组件。 5. **网络通信**:如果游戏支持多人在线对战,那么可能还包括网络通信模块,使用...
理解容器、组件、布局管理器以及事件处理是构建交互式应用的关键。 三、J2ME网络编程 1. **无线通信协议栈**:J2ME提供了JSR 82(Java API for Bluetooth Wireless Technology)和JSR 118(Java API for Wireless ...
- J2ME提供了JSR-82(Java Bluetooth API)和JSR-80(Java Infrared API),支持设备之间的无线通信。 10. **性能优化** - 由于J2ME设备资源有限,优化代码以减少内存占用和提高执行效率至关重要。例如,避免使用...
2. **文件选择组件**: - 在J2ME中,通常使用` javax.microedition.io.Connector` 和 `javax.microedition.io.FileConnection` 类来访问和操作文件系统。 - 用户界面组件,如`javax.microedition.lcdui.List` 或 `...
Java 2 Micro Edition(J2ME)是Java平台的一个重要组成部分,专门设计用于资源有限的设备,如移动电话、个人信息管理器(PDA)和数字电视。J2ME提供了丰富的功能,允许开发者创建各种应用程序,包括游戏、实用工具...
MIDP是J2ME中最重要的框架之一,它包括用户界面(UI)组件,如Canvas和Form,以及网络和数据存储功能。Canvas允许自定义绘图,而Form可以展示文本和输入控件。MIDP的网络API支持HTTP和WAP协议,使得应用能访问互联网...
5. **网络连接**:虽然这个项目没有明确提及网络功能,但J2ME的MIDP提供了JSR-82(Java Bluetooth API)和JSR-118(Java Wireless Toolkit for WAP 2.0)等可选包,可以用于实现数据同步或备份到云端服务器,增加...
在J2ME中实现GPS定位和导航功能,开发者通常会利用JSR179,即Location API,这是一个专门为移动设备设计的定位接口规范。 **JSR179:Location API** JSR179,全称为“Java Specification Request 179”,为Java ME...
作为Java技术的三大分支之一,J2ME与J2SE(Java 2 Standard Edition,适用于桌面系统)和J2EE(Java 2 Enterprise Edition,用于企业级服务)共同构成了Java的生态系统。J2ME是一系列规范的集合,由Java Community ...
在J2ME移植过程中,可能涉及多个JSR,例如JSR-139(Connected Limited Device Configuration,CLDC)和JSR-184(MIDP,Mobile Information Device Profile),它们分别定义了J2ME的基础框架和用户界面组件。...
### LWUIT,j2me教程 #### LWUIT简介 LWUIT(Light Weight User Interface Toolkit)是一个专为Java ME平台设计的轻量级用户界面工具包。它为开发者提供了丰富的功能,包括类似Swing的MVC(Model-View-Controller...
3. 解码:通过自定义解码器或利用第三方库如JSR-135(Java Media Framework)进行解码。 4. 播放控制:实现播放、暂停、停止等操作,以及进度调整功能。 5. 错误处理:处理网络错误、解码错误等异常情况。 四、优化...
- **灵活运用**:根据应用的具体需求灵活选择MVC模式的变体,比如单一控制器或多控制器模式。 综上所述,随着硬件性能的不断提升和软件复杂度的增加,MVC模式在J2ME应用程序设计中的应用变得愈发重要。通过合理设计...
9. **打包和部署**:J2ME应用通常被打包成JAR(Java Archive)文件和jad(Java Application Descriptor)文件,jad文件包含了应用程序的元数据。用户可以通过无线下载或物理传输安装J2ME应用。 通过深入学习和理解...
Java以其跨平台的优势,成为移动游戏开发的热门选择,特别是J2ME(Java 2 Micro Edition)平台,为开发移动设备上的应用程序提供了强大的支持。在这个教程中,我们将深入探讨如何使用Java和J2ME来创建手机游戏。 ...