一开始我以为,只要是支持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.
*/
package com.hadeslee.test;
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
*/
责任编辑:小草