如何在Adobe AIR应用中检测Windows系统是否安装Flash Player?
在Windows AIR应用中检测Flash Player的可行方案
我之前帮不少AIR开发者解决过Windows上检测Flash Player的问题,你试过的Capabilities.version和HTMLLoader.swfCapability确实有坑——前者有时候会返回AIR自带的Flash版本,后者更是经常误判为已安装。给你几个实测靠谱的方案:
方法一:通过Windows注册表检测(最准确)
Flash Player在Windows系统的注册表中会留存官方的安装信息,包括版本号,我们可以通过AIR的NativeProcess执行系统命令来查询:
步骤说明:
- 首先在你的AIR应用
application.xml中添加扩展桌面权限,因为NativeProcess需要这个权限:<supportedProfiles>extendedDesktop</supportedProfiles> - 编写代码查询注册表(兼顾32位和64位系统):
import flash.desktop.NativeProcess; import flash.desktop.NativeProcessStartupInfo; import flash.filesystem.File; import flash.events.ProgressEvent; import flash.events.IOErrorEvent; import flash.events.NativeProcessExitEvent; var processInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); var regExe:File = new File("C:\\Windows\\System32\\reg.exe"); processInfo.executable = regExe; // 先尝试查询64位系统的注册表路径 var args64:Vector.<String> = new Vector.<String>(); args64.push("query"); args64.push("HKLM\\SOFTWARE\\Wow6432Node\\Macromedia\\FlashPlayer"); processInfo.arguments = args64; var process:NativeProcess = new NativeProcess(); process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputReceived); process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, try32BitPath); process.addEventListener(NativeProcessExitEvent.EXIT, onProcessExit); process.start(processInfo); function onOutputReceived(event:ProgressEvent):void { var output:String = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable); if (output.indexOf("Version") !== -1) { var versionStr:String = output.split("Version")[1].trim(); trace(`Flash Player已安装,版本:${versionStr}`); } } function try32BitPath(event:IOErrorEvent):void { // 64位路径查询失败,切换到32位系统的注册表路径 var args32:Vector.<String> = new Vector.<String>(); args32.push("query"); args32.push("HKLM\\SOFTWARE\\Macromedia\\FlashPlayer"); processInfo.arguments = args32; process.start(processInfo); } function onProcessExit(event:NativeProcessExitEvent):void { if (event.exitCode !== 0) { trace("未安装Flash Player"); } }
方法二:通过加载测试SWF检测(验证可用性)
如果你的需求是确认系统能否正常运行SWF(而不只是是否安装),可以嵌入一个极小的空SWF文件,通过Loader加载来判断:
步骤说明:
- 制作一个1x1的空SWF文件(命名为
test.swf),打包到AIR应用的资源目录中; - 编写加载代码:
注意:如果你的AIR应用使用的是AIR Runtime,它本身包含Flash Player核心,但这个方法检测的是系统全局的Flash Player环境(比如浏览器插件对应的运行时)。import flash.display.Loader; import flash.net.URLRequest; import flash.events.Event; import flash.events.IOErrorEvent; var swfLoader:Loader = new Loader(); swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoadSuccess); swfLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onSwfLoadFail); swfLoader.load(new URLRequest("test.swf")); function onSwfLoadSuccess(event:Event):void { trace("Flash Player已安装且可正常运行"); // 这里也可以获取版本信息 var flashVersion:String = Capabilities.version; trace(`版本:${flashVersion}`); } function onSwfLoadFail(event:IOErrorEvent):void { trace("未安装Flash Player或版本过低无法运行SWF"); }
方法三:检查安装目录文件(快速判断)
Flash Player在Windows上的默认安装路径比较固定,我们可以通过AIR的File类直接检查关键文件是否存在:
import flash.filesystem.File; // 检查64位系统的Flash插件文件 var flashFile64:File = new File("C:\\Windows\\SysWOW64\\Macromed\\Flash\\NPSWF32.dll"); // 检查32位系统的Flash插件文件 var flashFile32:File = new File("C:\\Windows\\System32\\Macromed\\Flash\\NPSWF32.dll"); if (flashFile64.exists || flashFile32.exists) { trace("Flash Player已安装"); } else { trace("未安装Flash Player"); }
这种方法简单快速,但无法直接获取版本号,适合只需要判断是否安装的场景。
内容的提问来源于stack exchange,提问作者bio
相关产品推荐
相关产品推荐

