有没有办法让一个文件被放到Mac和Windows上的应用程序图标上?

时间:2016-04-22 09:58:04

标签: actionscript-3 air

在Mac上,可以将文件拖放到应用程序停靠栏中的应用程序图标上。是否可以获取该信息,是否可以在Windows上执行相同的操作?

我一直在阅读InvokeEvent,但我还没有看到它说可以将文件放在它的图标上。它也没有说明Windows是否支持该功能。

加分:
如何测试这个,因为Flash Builder没有安装应用程序(通过调试启动)。

1 个答案:

答案 0 :(得分:0)

我已经在Mac上运行了,应该可以在Windows上运行。

当您注册不同的文件类型时,您可以删除图标上的文件并打开应用程序,并在为其添加事件侦听器后调度invoke事件(问题1已解决)。注册文件类型还允许您使用"打开..."在Mac和Windows上(问题2解决了)。

如果您使用Flash Builder或其他IDE来测试您的调用函数是否有效,则可以在Run / Debug启动参数(奖励积分)中添加该文件的路径。在它周围加上引号并用空格分隔它以添加其他参数。

enter image description here

您必须向应用程序添加事件侦听器,然后将调度任何和所有调用。在那之前他们只排队等候。

当您将多个文件放到Mac上的应用程序图标上时,将会有一个带有多个参数的调用事件。在Windows和Linux上,将使用单个参数多次调度此事件。每个参数都是文件的完整路径。

如果正常打开应用程序并侦听invoke事件,即使应用程序上没有删除任何文件,也会调度它。这是标准调用类型,不包含任何参数。

下面的示例侦听invoke事件并处理不同的情况。

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx" 

                       invoke="windowedapplication1_invokeHandler(event)"
                       >

    <fx:Script>
        <![CDATA[

            protected function windowedapplication1_invokeHandler(event:InvokeEvent):void {
                var invokeArguments:Array = event.arguments;
                var filePath:String;
                var stream:FileStream;
                var file:File;
                var testing:Boolean = false;


                // application icon had a file dropped on it or an associated file was double clicked while app was open
                if (event.reason == InvokeEventReason.STANDARD && invokeArguments.length) {

                    invokeWithFile(event.currentDirectory, invokeArguments);
                }


                // application opened normally
                if (event.reason == InvokeEventReason.STANDARD && 
                    (invokeArguments.length == 0 || testing)) {

                    if (testing) {
                        invokeArguments = ["/Users/me/Desktop/test.jpg"];
                    }

                    invokeWithFile(event.currentDirectory, invokeArguments);

                    return;
                }

                // application opened at login
                if (event.reason == InvokeEventReason.LOGIN) {
                    return;
                }

                // application opened from URL
                if (event.reason == InvokeEventReason.OPEN_URL) {
                    return;
                }

                // application opened from notification such as iOS APN
                if (event.reason == InvokeEventReason.NOTIFICATION) {
                    return;
                }
            }

            public var invokedFile:File;

            /**
             * Invoked file. 
             * */
            public function invokeWithFile(currentDirectory:File, invokedArguments:Array):void {
                var filePath:String = invokedArguments && invokedArguments.length ? invokedArguments[0] : null;
                var fileData:String;
                var fileStream:FileStream;
                var file:File;

                if (filePath) {
                    try {
                        file = new File(filePath);
                    }
                    catch (errorEvent:*) {
                        trace("Error: " + errorEvent.toString());
                        return;
                    }

                    if (file && 
                        file.exists && 
                        file.isDirectory==false && 
                        file.extension && 
                        file.extension.toLowerCase()=="mxml") {
                        fileStream = new FileStream();

                        try {
                            fileStream.open(file, FileMode.READ);

                            if (fileStream.bytesAvailable) {
                                fileData = fileStream.readUTFBytes(fileStream.bytesAvailable);
                            }
                        }
                        catch (error:*) {

                        }
                    }
                }
            }
        ]]>
    </fx:Script>

</s:WindowedApplication>

这是应用程序描述符文件。文件类型是严格的。我已经包含内联备注:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/20.0">

    <fileTypes>

        <fileType>
            <!--  name cannot contain a space -->
            <name>MXML.File</name>
            <!--  extension cannot be * -->
            <extension>mxml</extension>
            <description>MXML file</description>
            <!--  content type is required -->
            <contentType>text/plain</contentType>
        </fileType>
        <fileType>
            <name>Photoshop.Image</name>
            <extension>psd</extension>
            <description>Adobe Photoshop Image</description>
            <contentType>application/octet-stream</contentType>
        </fileType>
        <fileType>
            <name>JPEG.Image</name>
            <extension>jpg</extension>
            <description>JPEG Image</description>
            <contentType>image/jpeg</contentType>
        </fileType>
        <fileType>
            <name>JPEG.Image</name>
            <extension>jpeg</extension>
            <description>JPEG Image</description>
            <contentType>image/jpeg</contentType>
        </fileType>
        <fileType>
            <name>PNG.Image</name>
            <extension>png</extension>
            <description>PNG Image</description>
            <contentType>image/png</contentType>
        </fileType>
        <fileType>
            <name>GIF.Image</name>
            <extension>gif</extension>
            <description>GIF Image</description>
            <contentType>image/gif</contentType>
        </fileType>

    </fileTypes>

</application>

文件类型错误:

错误104:application.fileTypes.fileType.contentType是必需的。 解决方案:您必须包含内容类型。在线其他地方提到它是可选的,但现在可能需要它。 ContentType is required error

错误104:application.fileTypes.fileType.extension是必需的。 解决方案:您必须包含扩展名。
enter image description here

错误105:application.fileTypes.fileType.extension包含无效值。 解决方案:扩展名不能为空或*。 enter image description here

错误105:application.fileTypes.fileType.name包含无效值。 解决方案:名称不能包含空格字符。 enter image description here