在Mac上,可以将文件拖放到应用程序停靠栏中的应用程序图标上。是否可以获取该信息,是否可以在Windows上执行相同的操作?
我一直在阅读InvokeEvent,但我还没有看到它说可以将文件放在它的图标上。它也没有说明Windows是否支持该功能。
加分:
如何测试这个,因为Flash Builder没有安装应用程序(通过调试启动)。
答案 0 :(得分:0)
我已经在Mac上运行了,应该可以在Windows上运行。
当您注册不同的文件类型时,您可以删除图标上的文件并打开应用程序,并在为其添加事件侦听器后调度invoke事件(问题1已解决)。注册文件类型还允许您使用"打开..."在Mac和Windows上(问题2解决了)。
如果您使用Flash Builder或其他IDE来测试您的调用函数是否有效,则可以在Run / Debug启动参数(奖励积分)中添加该文件的路径。在它周围加上引号并用空格分隔它以添加其他参数。
您必须向应用程序添加事件侦听器,然后将调度任何和所有调用。在那之前他们只排队等候。
当您将多个文件放到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是必需的。 解决方案:您必须包含内容类型。在线其他地方提到它是可选的,但现在可能需要它。
错误104:application.fileTypes.fileType.extension是必需的。
解决方案:您必须包含扩展名。
错误105:application.fileTypes.fileType.extension包含无效值。 解决方案:扩展名不能为空或*。
错误105:application.fileTypes.fileType.name包含无效值。 解决方案:名称不能包含空格字符。