代号One Capture API的正确用法

时间:2018-10-05 21:45:09

标签: codenameone

我试图使用以下代码来录制带有真实设备(Android和iPhone)的一些视频,并查看生成的文件大小。但这是行不通的……它似乎可以录制,但是它既不能在Android上也不可以在iOS上播放生成的视频。

我编写了以下代码,将一些示例合并为Codename One API。怎么了?

    Form hi = new Form("Capture", BorderLayout.center());
    Container cnt = new Container(BoxLayout.y());
    hi.setToolbar(new Toolbar());
    Style s = UIManager.getInstance().getComponentStyle("Title");
    FontImage icon = FontImage.createMaterial(FontImage.MATERIAL_VIDEOCAM, s);

    FileSystemStorage fs = FileSystemStorage.getInstance();
    String recordingsDir = fs.getAppHomePath() + "recordings/";
    fs.mkdir(recordingsDir);
    try {
        for (String file : fs.listFiles(recordingsDir)) {
            Button mb = new Button(file.substring(file.lastIndexOf("/") + 1) + " - " + (int) (fs.getLength(recordingsDir + file) / 1024.0 / 1024.0 * 100) / 100.0 + " MB");
            mb.addActionListener((e) -> {
                try {
                    Media video = MediaManager.createMedia(recordingsDir + file, true);
                    hi.removeAll();
                    hi.add(BorderLayout.CENTER, new MediaPlayer(video));
                    hi.revalidate();
                } catch (IOException err) {
                    Log.e(err);
                }
            });
            cnt.add(mb);
        }
        hi.add(BorderLayout.CENTER, cnt);

        hi.getToolbar().addCommandToRightBar("", icon, (ev) -> {
            try {
                String file = Capture.captureVideo();
                if (file != null) {
                    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MMM-dd-kk-mm");
                    String fileName = sd.format(new Date());
                    String filePath = recordingsDir + fileName;
                    Util.copy(fs.openInputStream(file), fs.openOutputStream(filePath));
                    Button mb = new Button(file.substring(file.lastIndexOf("/") + 1) + " - " + (int) (fs.getLength(filePath) / 1024.0 / 1024.0 * 100) / 100.0 + " MB");
                    mb.addActionListener((e) -> {
                        try {
                            Media video = MediaManager.createMedia(filePath, true);
                            hi.removeAll();
                            hi.add(BorderLayout.CENTER, new MediaPlayer(video));
                            hi.revalidate();
                        } catch (IOException err) {
                            Log.e(err);
                        }
                    });
                    cnt.add(mb);
                    cnt.getParent().revalidate();
                }
            } catch (IOException err) {
                Log.e(err);
            }
        });
    } catch (IOException err) {
        Log.e(err);
    }
    hi.show();

这是我在点击按钮以打开录制的视频后在iPhone X上看到的内容(这与我在Android 7上看到的非常相似):

enter image description here

1 个答案:

答案 0 :(得分:1)

我花了很多时间看着这个,很尴尬...

更改此:

Form hi = new Form("Capture", BorderLayout.center());

对此:

Form hi = new Form("Capture", new BorderLayout());

前者为组件提供其首选的尺寸。后者对其进行缩放以占用可用空间。在大多数平台上,首选大小为零,因为视频需要加载才能应用首选大小。加载时,需要重新布局。