手机拍照,浏览手机的文件夹,上传照片到服务器

news/2024/10/31 9:31:01/

      利用J2ME中提供的可选包JSR75提供的功能,浏览手机的文件夹,并且将用户的照片上传到服务器,实现相册的功能。 

      完全实现了浏览手机的文件系统的功能。但是在浏览文件系统的时候,需要用户确认。我在使用Nokia6233的手机测试的时候,由于每次访问文件,都需要确认,所以很烦人。不知道大家有没有什么好的方法。如果方便告诉我的话,请用cuilichen@hotmail.com与我联系,多谢。

import javax.microedition.lcdui.*;
import java.util.Enumeration;
import javax.microedition.io.file.FileSystemRegistry;
import javax.microedition.io.file.FileConnection;
import javax.microedition.io.Connector;
import java.util.Vector;
import java.io.*;
import javax.microedition.io.HttpConnection;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author cuilichen
 * @version 1.0
 */
public class Brower implements Runnable, CommandListener {
    /**
     * 进入的历史记录
     * 其中的成员每三个为一组
     */
    Vector history;
    /**
     * 用来显示当前的文件夹下面的内容的List
     */
    List folder;
    /**
     * 当前的路径
     */
    String cPath;
    /**
     * 文件夹中各个对象的URL
     */
    String[] children;
    /**
     * 文件夹中的各个对象是否是子文件夹
     */
    byte[] isDir;
    /**
     * 在List中,表示该对象是文件夹还是文件的图标
     */
    Image[] logos;
    /**
     * 图片文件的数据
     */
    byte[] data;

    /**
     * 构造函数
     */
    public Brower() {
        history = new Vector();
    }

    /**
     * 初始化,显示根目录
     */
    public void init() {
        int roots = this.getRoots();
        if (roots > 0) { //得到根目录列表
            logos = new Image[2]; //准备图标
            logos[0] = Core.getImage("logoF");//文件的图标
            logos[1] = Core.getImage("logoD");//文件夹的图标
            if (prepare2show()) { //显示列表成功
                showList();
                return;
            }
        }
        Core.setDisplay(Core.core);
        Core.received.addElement("<show>调用手机的浏览器失败");
    }

    /**
     * 得到根目录列表数组
     * @return int
     */
    private int getRoots() {
        Enumeration rootEnum = FileSystemRegistry.listRoots();
        Vector v = new Vector();
        while (rootEnum.hasMoreElements()) {
            String root = (String) rootEnum.nextElement();
            v.addElement(root);
        }
        if (v.size() == 0) {
            return -1;
        } else {
            children = new String[v.size()];
            v.copyInto(children);
            cPath = "";
            return children.length;
        }
    }

    /**
     * 得到当前目录下的内容,查看各项内容是文件夹还是文件
     * @return boolean   是否成功
     */
    private boolean prepare2show() {
        isDir = new byte[children.length];
        FileConnection fc = null;
        try {
            for (int i = 0; i < children.length; i++) {
                fc = (FileConnection) Connector.open("file:///" + cPath +
                    children[i]);
                if (fc.isDirectory()) {
                    isDir[i] = 1;
                    for (int j = 0; j < i; j++) { //处理,保证先排文件夹,后排文件
                        if (isDir[j] == 0) {
                            String temp = children[i];
                            for (int k = i; k > j; k--) {
                                children[k] = children[k - 1];
                            }
                            children[j] = temp;
                            isDir[i] = 0;
                            isDir[j] = 1;
                            break;
                        }
                    }
                } else {
                    isDir[i] = 0;
                }
                fc.close();
                fc = null;
            }
            history.addElement(children);
            history.addElement(isDir);
            history.addElement(cPath);
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        } finally {
            if (fc != null) {
                try {
                    fc.close();
                } catch (IOException ex1) {
                }
            }
        }
    }

    /**
     * 显示文件夹里面的内容的列表
     */
    private void showList() {
        folder = new List(cPath, List.IMPLICIT);
        if (cPath.length() == 0) {
            folder.setTitle("我的手机");
        }
        if (children.length > 0) {
            for (int i = 0; i < children.length; i++) {
                folder.append(children[i], logos[isDir[i]]);
            }
            folder.addCommand(new Command("确定", Command.OK, 1));
        } else {
            folder.append("文件夹是空的", null);
        }
        if (history.size() > 3) {
            folder.addCommand(new Command("返回", Command.BACK, 1));
        }
        folder.setCommandListener(this);
        Core.setDisplay(folder);
    }

    /**
     * 得到指定文件夹中的各个对象的URL
     * @return int          对象的数量
     */
    private int getChildren() {
        FileConnection fc = null;
        try {
            System.out.println("file:///" + cPath);
            fc = (FileConnection) Connector.open("file:///" + cPath);
            Vector v = new Vector();
            Enumeration child = fc.list();
            while (child.hasMoreElements()) {
                String fileName = (String) child.nextElement();
                v.addElement(fileName);
            }
            if (v.size() > 0) {
                children = new String[v.size()];
                v.copyInto(children);
                return children.length;
            } else {
                children = new String[0];
                return 0;
            }
        } catch (Exception ex) {
            return -1;
        } finally {
            if (fc != null) {
                try {
                    fc.close();
                } catch (IOException ex1) {
                }
            }
        }
    }

    /**
     * 显示“返回”之后的内容
     * @param father boolean   是否是返回上一层
     */
    private void getBack(boolean father) {
        if (father) {
            for (int i = 0; i < 3; i++) {
                history.removeElementAt(history.size() - 1);
            }
        }
        children = (String[]) history.elementAt(history.size() - 3); //里面的对象的名称
        isDir = (byte[]) history.elementAt(history.size() - 2); //里面的对象是不是文件夹
        cPath = (String) history.elementAt(history.size() - 1); //文件夹的绝对路径
        showList();
    }

    /**
     * 得到文件的数据
     * @param fileName String
     * @return boolean        读取的操作是否成功
     */
    private boolean getData(String fileName) {
        FileConnection fc = null;
        InputStream is = null;
        try {
            fc = (FileConnection) Connector.open("file:///" + fileName);
            is = fc.openInputStream();
            data = new byte[is.available()];
            is.read(data);
            return true;
        } catch (Exception ex) {
            data = null;
            return false;
        } finally {
            if (fc != null) {
                try {
                    fc.close();
                } catch (IOException ex1) {
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException ex2) {
                }
            }
        }
    }

    /**
     * implements CommandListener
     * @param c Command
     * @param d Displayable
     */
    public void commandAction(Command c, Displayable d) {
        if (d == folder) {
            if ("返回".equals(c.getLabel())) { //返回
                getBack(true);
            } else { //确定
                int index = folder.getSelectedIndex();
                if (index >= isDir.length) {
                    return;
                }
                if (isDir[index] == 0) {
                    String fileName = cPath + folder.getString(index);
                    if (fileName.endsWith(".jpg") || fileName.endsWith(".JPG") ||
                        fileName.endsWith(".png") || fileName.endsWith(".PNG")) {
                        if (getData(fileName)) {
                            new Thread(this).start();
                        } else {
                            System.out.println("读取文件失败");
                        }
                    }
                } else {
                    cPath += folder.getString(index);
                    int flag = getChildren();
                    if (flag >= 0) { //得到下层内容成功
                        if (prepare2show()) {
                            showList();
                            return;
                        }
                    }
                    getBack(false); //得到下层的内容失败,那么显示原来的内容
                }
            }
        }
    }

    /**
     * implement Runnable
     * 向服务器发送照片
     * 服务器是使用tomcat和servlet实现的
     */
    public void run() {
        String server = "http://218.200.0.1:8080/Photo/receiver";
        HttpConnection conn = null;
        OutputStream os = null;
        try {
            conn = (HttpConnection) Connector.open(server, 3, true);
            conn.setRequestProperty("Content-Length", "" + data.length);
            os = conn.openOutputStream();
            os.write(data);
            os.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (Exception ex) {}
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception ex) {}
        }

    }
}


http://www.ppmy.cn/news/460632.html

相关文章

电脑端如何访问手机SD卡中的文件

看到标题&#xff0c;估计各位看官有点懵&#xff0c;访问SD卡中的文件&#xff0c;你连上数据线不就行了&#xff0c;或者说你想要获取一些数据&#xff0c;你用及时通讯&#xff08;微信&#xff0c;钉钉&#xff0c;QQ等等&#xff09;&#xff0c;在线传输不就行了&#xf…

手机拍照保存raw图片,并导出手机拍摄的raw到本地电脑

1&#xff1a;安装adb工具&#xff0c;直接从百度网盘下载里面的两个文件 adb和run.sh脚本下载地址 提取码&#xff1a;mmew 2&#xff1a;其中platform-tools_r30.0.5-windows.zip&#xff0c;文件是adb的安装文件&#xff0c;只需要将其解压到一个特定的目录&#xff0c;比如…

电脑上与android手机文件互传

#在电脑上操作android手机目录文件 安装apk ./adb install *.apk 查看是否连接手机 ./adb devices 进入手机目录 ./adb shell 拷贝电脑文件 a.txt 到手机指定目录下 /data/local/manue/ ./adb push a.txt /data/local/manue/ 拷贝手机文件/data/local/manue/a.txt 到电脑里 ./…

手机访问电脑文件_彻底解决手机-电脑互传大文件的难题 电脑-手机快捷互联互通...

我们现在大多时候&#xff0c;手机和电脑传输数据都有用微信文件传输助手&#xff0c;或者QQ类型的功能。但是用这两个工具有2个问题&#xff0c;都是大于100M就不能传输了&#xff0c;而且传输图片的时候会进行压缩&#xff0c;即使你勾选了上传原图。所以我们需要找到更快捷方…

同样是处理器,为啥机器人不能直接用电脑和手机的CPU?

刚入行的小白&#xff0c;经常会发出这样的灵魂拷问——机器人可以直接用电脑和手机的CPU吗&#xff1f;本文将从生活事例引入&#xff0c;详细回答这个问题&#xff0c;并总结出机器人处理器的实际需求。 前阵子刷到一条有味道的新闻。 一台刚买来的扫地机器人&#xff0c;扫…

手机连接电脑后,QT的QDIR怎么读取手机文件路径

大家都知道Qt的QFileSystemModel类可以建立硬盘上的文件资源模型&#xff0c;从而实现简单的文件管理和文件夹管理&#xff0c;那么手机中的文件该怎么获取呢&#xff1f;这里做i用个小测试&#xff1a; 话不多说 直接上代码&#xff1a; QString filedir QCoreApplication:…

手机连接电脑后,电脑上显示不出来手机的文件夹

每次把传输模式改成 传输文件后&#xff0c;自动变成 仅充电 找到开发人员选项&#xff0c;把“仅充电模式下允许adb调试”勾选上&#xff0c;然后再连接电脑就好了。电脑上显示出了手机。

2023年软件测试的高薪机会在哪?

没入行或已经入行测试的小伙伴们&#xff0c;快看过来。来看看你们的高薪机会在哪里&#xff01; 我们先来看几个高薪招聘需求&#xff01; 高薪招聘需求1 要求看起来不是很高&#xff0c;应届生和在校生都可以&#xff0c;而且薪资达到了12K&#xff0c;14薪。 但是&#xff0…