当前位置: 首页 > 知识库问答 >
问题:

如何使用Codename One和CN1 FileChooser本地保存和检索文件?

谢清野
2023-03-14
    null

下面是我使用的代码:

 final Button getFileChooser = new Button("Get file chooser");
    getFileChooser.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {

            if (FileChooser.isAvailable()) {
                FileChooser.showOpenDialog(".pdf, .jpg, .jpeg, .png", e2-> {
                    String file = (String)e2.getSource();
                    if (file == null) {
                        hi.add("No file was selected");
                        hi.revalidate();
                    } else {
                        String extension = null;
                        if (file.lastIndexOf(".") > 0) {
                            extension = file.substring(file.lastIndexOf(".")+1);
                            ToastBar.showMessage("1: " + file, FontImage.MATERIAL_CHECK);
                            rawFilename.setText("raw: " + file);
                            //java.util.List<String> filepathParsed = StringUtil.tokenize(file, "[/.]");
                            StringBuilder hi = new StringBuilder(file);
                            if (file.startsWith("file://"))
                                hi.delete(0, 7);
                            int lastIndexPeriod = hi.toString().lastIndexOf(".");
                            Log.p(hi.toString());
                            String ext = hi.toString().substring(lastIndexPeriod);
                            String hmore = hi.toString().substring(0, lastIndexPeriod -1);

                            String hi2 = hmore +/* "/file" +*/ ext;/*hi;*/
                            Log.p("hi2 = " + hi2);
                            secondFilename.setText("2nd: " + hi2);
                            //secondFilename.setText((String)evt.getSource());
                            try {
                                saveFileToDevice(file, ext);
                            } catch (URISyntaxException e) {
                                e.getMessage();
                            }
                            //sendFileViaEmail(hi2, file);


                        } else {
                            ToastBar.showMessage("2: " + file + " " + extension, FontImage.MATERIAL_CHECK);
                        }
                    }
                    hi.revalidate();
                });
            }
        }
    });

 protected void saveFileToDevice(String hi, String ext) throws URISyntaxException{
    URI uri = new URI(hi);
    String path = uri.getPath();
    Log.p("uri path: " + uri.getPath() + " ; scheme: " + uri.getScheme());
    /*if (path.contains("..jpg")) {
        int indexLastPeriodBeforeExt = path.lastIndexOf(".");
        path = path.substring(0, indexLastPeriodBeforeExt) + path.substring(indexLastPeriodBeforeExt+ 1);
        Log.p("new path: " + path);

    }*/
    if (Display.getInstance().getPlatformName().equals("and"))
        path = "file://" +path;
    String home = FileSystemStorage.getInstance().getAppHomePath();
    char sep = FileSystemStorage.getInstance().getFileSystemSeparator();
    String userDir = home + sep + "myapp";
    /*if (hi.startsWith("file://")) {
        hi = hi.substring(7);
    }*/
    int index = hi.lastIndexOf("/");
    hi = hi.substring(index + 1);
    Log.p("hi after substring 7: " + hi);
    FileSystemStorage.getInstance().mkdir(userDir);
    String fPath = userDir + sep + hi ;
  /*  if (hi.contains("..jpg")) {
        int indexLastPeriodBeforeExt = hi.lastIndexOf(".");
        hi = hi.substring(0, indexLastPeriodBeforeExt) + hi.substring(indexLastPeriodBeforeExt+ 1);
        Log.p("new hi: " + hi);
    }*/

        Log.p("does it exist? " + FileSystemStorage.getInstance().exists(userDir));
        String imageFile = userDir + sep + hi;
         String[] roots = FileSystemStorage.getInstance().getRoots();
            if (roots.length > 0) {
                for (int i = 0; i < roots.length; i++)
                    Log.p("roots" + i + " " + roots[i]);
            }
            try {
                String[] files = FileSystemStorage.getInstance().listFiles(userDir);
                for (int i = 0; i < files.length; i++) {
                    Log.p(i + " " + files[i]);
                    //secondName = files[files.length-1];
                    Log.p("secondname: " + secondName);
                }
                sendFileViaEmail(imageFile, ".jpg");
            } catch (IOException e) {
                e.getMessage();
            }
        }

protected void sendFileViaEmail(String hi2, String file) {
    Message m = new Message("Test message");
    //m.getAttachments().put(file, "image/jpeg");
    m.setAttachment(hi2);
    m.setAttachmentMimeType(Message.MIME_IMAGE_JPG);
    //m.setMimeType(Message.MIME_IMAGE_JPG);
    //m.getAttachments().put(imageAttachmentUri, "image/png");
    Display.getInstance().sendMessage(new String[] {"myemail@example.com"}, "test message cn1", m);
}

在将cn1-filechooser库导入项目并刷新库后,我将GetFileChooser按钮添加到表单中。filechooser可以工作--我在模拟器、Android设备和iPhone上都试过了。

我的问题是:

 String[] files = FileSystemStorage.getInstance().listFiles(userDir);
            for (int i = 0; i < files.length; i++) {
                Log.p(i + " " + files[i]);
                //secondName = files[files.length-1];
                Log.p("secondname: " + secondName);
            }

共有1个答案

柴瀚
2023-03-14

手机不允许这样。它们没有像台式机那样的文件系统。所以file chooser真的启动了一个工具来帮助你从不同的应用程序中选择一个文件,然后这个文件被复制到你的本地应用程序沙箱中,在那里你可以访问应用程序的内容。

当然,这将不能用于保存,因为这意味着您可能会损坏另一个应用程序中的文件,所以您被限制写入安装的其他应用程序的目录,甚至无法知道哪些应用程序安装在哪里······

要将文件传输到不同的应用程序,您可以通过共享按钮或显示的低级API使用共享意图。这允许您将图像发送到whatsapp或类似的功能,这在手机中是有意义的。

 类似资料:
  • 问题内容: 我在这里遇到的一个问题可能是一个我忽略的非常简单的答案……如何使用NSURL检索本地文件?我在这里: 但是,在成功构建之后,它将挂在var urlpath上。我到处搜寻,并在这里和其他地方尝试了一些建议,但无济于事。请帮忙?:( 问题答案: 您正在尝试从文件系统而不是从Web加载文件。 对于创建,您需要使用fileURLWithPath:类方法。 更改您的方法,例如: 迅捷2 迅捷3

  • 问题内容: 我正在尝试将Redis会话集成到用Node.js编写的身份验证系统中。 我已经能够成功设置Redis服务器和Express服务器。 这是我的设置(只是重要的一点): 现在…我该如何实际创建,阅读和销毁会话?我已经阅读了很多关于如何设置的文章以及关于SO的许多问题,但是我发誓每个都只停留在配置上,并且不解释如何实际使用它… 我知道这可能非常简单,但是请不要投票,而只是解释一下:)。 问题

  • 我正在使用 react-native-fetch-blob 下载 mp3 文件,然后稍后播放它们。问题是当我关闭应用程序并再次重新启动时, 的实际路径会发生变化,这意味着我无法使用下载文件后立即存储的绝对文件路径在下次运行应用程序时检索文件。 下面是我下载和存储文件路径的代码: 我将存储为持久化应用程序状态的一部分。但是它没有用,因为下次我打开应用程序时,文件路径已被重新分配。例如,这是一个文件下

  • 在我的应用程序中,我有一个绑定到button onclick事件的脚本,可以动态生成文本文件。这些文件不太大(约3000行),但数据流入可能很慢(有时需要30分钟才能捕获所有流式数据)。一旦这个过程完成,我需要存储这个文件,以便用户可以下载它。我还将有文本文件生成从以前的实例,这个点击事件,以及需要区分它们。 最好的方法是什么?我可以在数据库中存储这样大小的文本文件,然后检索它吗?我应该只存储一个

  • 问题内容: 我将如何存储my_dict并使用Redis进行检索。例如,以下代码不起作用。 问题答案: 您可以通过(使用来设置多个键)来做到这一点。

  • 问题内容: 假设我有一个如下所示的javascript对象: 我将其字符串化以转换为JSON。如何将此JSON保存到本地文本文件,以便可以在记事本等中打开它。 问题答案: Node.js: 浏览器(webapi):