如何在flex中浏览移动目录?

时间:2013-01-05 13:46:14

标签: actionscript-3 flex flash-builder

我在手机上拍摄了3个视频,默认情况下存储在手机图库(图库/视频/)中。我必须在我的一个flex移动应用程序中播放这3个视频。如何将视频传输到flex项目?如果我需要浏览移动目录,请亲自帮我一些代码。

2 个答案:

答案 0 :(得分:0)

我也在寻找这个问题的答案。现在,基于其他Stackoverflow讨论,详尽阅读教程和Adobe文档,以及对两者的评论(通常是更有用的资源),我得出的结论是,这是不可能的。

  • 您可以使用CameraRoll.browseForImage()并打开iOS照片库以查看MediaType.IMAGE的所有实体,但它不会向您显示MediaType.VIDEO

  • 您可以使用CameraUI通过委派启动系统摄像头并返回MediaPromise,但据我所知,它不保存您在任何地方捕获的视频,我找不到访问该方法的方法使用MediaPromise捕获视频(至少使用Loader类)

这是我的代码,作为该方向的提示。第二个代码块使用CameraRoll来浏览ForImage(),但API中没有browseForVideo()。

if(CameraUI.isSupported)
{
    camera = new CameraUI();

    camera.addEventListener(MediaEvent.COMPLETE,    videoMediaEventComplete);
    camera.addEventListener(Event.CANCEL,           cameraCanceled);
    camera.addEventListener(ErrorEvent.ERROR,       cameraError);

    camera.launch(MediaType.VIDEO);
}
else
{
    statusText.text = "Camera not supported on this device.";
    startTimer();
}


if (CameraRoll.supportsBrowseForImage)
{
    roll = new CameraRoll();

    roll.addEventListener(MediaEvent.SELECT,    cameraRollEventComplete);
    roll.addEventListener(Event.CANCEL,         cameraCanceled);
    roll.addEventListener(ErrorEvent.ERROR,     cameraError);

    roll.browseForImage();
}
else
{
    statusText.text = "Camera roll not supported on this device.";
    startTimer();
}

答案 1 :(得分:0)

我发现使用委派的系统摄像头捕获的视频存储在iOS -DOES! - 允许访问的临时存储位置。 (我感到非常震惊。)

捕获的视频不会像使用iOS系统相机应用程序捕获的其他视频一样添加到设备的相机胶卷中,因此它不足以捕获视频并希望以后能够访问它(例如,如果CameraRoll.browseForVideo ()曾被添加到API中。

因此,您必须“在获得良好的时候”并将文件从临时存储位置移动到某个非易失性位置,例如ApplicationStorageDirectory或用户的Documents目录(我认为iOS中的唯一选项)。 / p>

MediaPromise ...我认为......通过任何直接渐进式加载器/流转化器方法访问视频完全没用,但仍提供临时文件的位置/ url / path / filename,以便您可以执行文件操作在它上面。

当使用CameraRoll.browseForImage()时,有一些教程可以解决MediaPromise中缺少文件位置/ url / path / filename的问题...而且该方法是使用加载器类来加载图像内容(然后您可以将其写入文件),但在拍摄视频时,视频内容无法访问,而是提供了文件位置/ url / path / filename。讽刺的是,我几乎没有资源可以帮助解决这个问题。

我将要包含一些代码块,而不是真正编辑它们以去掉多余的位,因为当我需要在床上时,它已经过去了,但我希望你能拥有它。我可能会在以后清理它。

此部分位于Spark SkinnablePopUpContainer中,我对多个按钮使用相同的单击事件,因此下面的“case”位于该事件处理函数的switch-case中。

如果您不熟悉,'close(true,data)'是关闭SkinnablePopUpContainer的方法,告诉父/所有者有意关闭容器并且应该查找要共享的数据对象(即,有变化是'提交'。

case "cameraVideo":
{
    if(CameraUI.isSupported)
    {
        camera = new CameraUI();
        camera.addEventListener(MediaEvent.COMPLETE,     videoMediaEventComplete);
        camera.addEventListener(Event.CANCEL,            cameraCanceled);
        camera.addEventListener(ErrorEvent.ERROR,        cameraError);
        camera.launch(MediaType.VIDEO);
    }
    else
    {
        statusText.text = "Camera not supported on this device.";
        startTimer();
    }
    break;
}

protected function cameraCanceled(event:Event):void
{
    statusText.text = "Camera access canceled by user.";
    startTimer();
}

protected function cameraError(event:ErrorEvent):void
{
    statusText.text = "There was an error while trying to use the camera.";
    startTimer();
}

protected function videoMediaEventComplete(event:MediaEvent):void
{
    statusText.text="Preparing captured video...";

    camera.removeEventListener(MediaEvent.COMPLETE,     videoMediaEventComplete);
    camera.removeEventListener(Event.CANCEL,    cameraCanceled);
    camera.removeEventListener(ErrorEvent.ERROR,        cameraError);

    var media:MediaPromise = event.data;

    data.MediaType = MediaType.VIDEO;
    data.MediaPromise = media;
    data.source = "camera video";

    close(true,data)
}

此部分是SkinnablePopUpContainer的父/所有者的close处理程序中的Actionscript(包含有用代码后将被截断)

private function choosePictureLightboxClosed(event:PopUpEvent):void
{
    imageButtonsActive = false;

    if(event.commit)
    {
        this.data = event.data as Object;

        filters = new Array();
        selection = true;

        switch(data.MediaType)
        {
            case MediaType.VIDEO:
            {
                mediaType = "video"; 

                trace(data.MediaPromise.file.url  + " - " + data.MediaPromise.relativePath + " - " +data.MediaPromise.mediaType);

                var sourceFile:File = new File(data.MediaPromise.file.url);
                var destinationFile:File = File.applicationStorageDirectory.resolvePath("User" +parentApplication.userid);

                if(destinationFile.exists && !destinationFile.isDirectory)
                {
                    destinationFile.deleteFile();
                }
                destinationFile.createDirectory();

                destinationFile = destinationFile.resolvePath("Videos");
                if(destinationFile.exists && !destinationFile.isDirectory)
                {
                    destinationFile.deleteFile();
                }
                destinationFile.createDirectory();

                destinationFile = destinationFile.resolvePath(parentApplication.userid+"Video"+new Date().getTime()+".mov");
                trace(destinationFile.nativePath);

                sourceFile.moveTo(destinationFile,true);

                break;
            }

我确实希望这会有所帮助。这是一个非常令人沮丧的事情(在我们的项目中,政府补助资金和我们完全无法满足的最后期限)是非常令人沮丧的,我非常希望这些来之不易的解决方案可以帮助其他人避免相同的经历。