Javascript Google应用程序引擎上的Flash外部接口存在问题

Javascript Google应用程序引擎上的Flash外部接口存在问题,javascript,flash,google-app-engine,Javascript,Flash,Google App Engine,在过去的几个小时里,我一直在努力解决这个问题,我真的不知道会出什么问题。我只是想让Javascript与Flash进行文本通信。我找到了这个源代码的好例子 我在本地运行了html文件,它可以从flash发送和检索文本。然后,我将同样的示例加载到我的dev google应用服务器中,我无法将文本从javascript发送到flash。奇怪的是,flash能够发送Javascript文本。有人能看看他们能不能和GAE合作吗?万分感谢 这可能与谷歌应用引擎本身无关,因为整个过程都是在浏览器中运行的—

在过去的几个小时里,我一直在努力解决这个问题,我真的不知道会出什么问题。我只是想让Javascript与Flash进行文本通信。我找到了这个源代码的好例子


我在本地运行了html文件,它可以从flash发送和检索文本。然后,我将同样的示例加载到我的dev google应用服务器中,我无法将文本从javascript发送到flash。奇怪的是,flash能够发送Javascript文本。有人能看看他们能不能和GAE合作吗?万分感谢

这可能与谷歌应用引擎本身无关,因为整个过程都是在浏览器中运行的——除非在你没有提到的地方存在某种服务器依赖性。假设不是这样的话

如果您能够让Flash通过ExternalInterface.call()调用JavaScript,而不是让JavaScript调用Flash,那么可能有一两件事:您的EI回调和处理程序没有正确连接(在Flash中),或者您的JavaScript在浏览器中的SWF对象上没有句柄

您可以尝试发布一些代码,但在此期间,我知道有些东西在IE和FireFox中都可以使用。首先,浏览器代码:

<html>
<head>
<script language="JavaScript" type="text/javascript">

    var swfReady = false;

    function callbacksInitialized()
    {
        swfReady = true;
    }

    function helloFlash()
    {
        if (swfReady)
        {   
            // Get a handle on the Flash object
            var swfObject = navigator.appName.indexOf("Microsoft") != -1 ? window["HelloMac"] : document["HelloMac"] ;

            // Call back into the Flash file 
            swfObject.helloFlash(document.getElementById("txtMessage").value);
        }
    }

    function helloMac(message)
    {
        alert(message);
    }

</script>
</head>
<body scroll="no">
    <div align="center">

        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
                id="HelloMac" width="600" height="300"
                codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
                <param name="movie" value="HelloMac.swf" />
                <param name="quality" value="high" />
                <param name="bgcolor" value="#869ca7" />
                <param name="allowScriptAccess" value="sameDomain" />
                <embed src="HelloMac.swf" quality="high" bgcolor="#869ca7"
                    width="600" height="300" name="HelloMac" align="middle"
                    play="true"
                    loop="false"
                    quality="high"
                    allowScriptAccess="sameDomain"
                    type="application/x-shockwave-flash"
                    pluginspage="http://www.adobe.com/go/getflashplayer">
                </embed>
        </object>

        <br /><br />
        <input type="text" id="txtMessage" value="Hello, Flash!" /><br />
        <input id="btnSend" type="button" value="Send to Flash" onclick="helloFlash();" />
    </div>
</body>
</html>

var swfReady=假;
函数callbacksInitialized()
{
swfReady=true;
}
函数helloFlash()
{
如果(swfReady)
{   
//获取Flash对象的句柄
var swfObject=navigator.appName.indexOf(“Microsoft”)!=-1?窗口[“HelloMac”]:文档[“HelloMac”];
//调回闪存文件
swfObject.helloFlash(document.getElementById(“txtMessage”).value);
}
}
函数helloMac(消息)
{
警报(信息);
}



现在,Flash代码(在我的例子中,它是Flex,所以希望它是清晰的):


该示例演示了如何使用一些文本将Flash调用到JavaScript中,以及如何使用相同的方式将JavaScript调用回Flash中。需要注意的几点:

  • 确保您等待呼叫 闪烁,直到闪烁通知 浏览器已准备好开始接收 电话(如我的 CallbackInitialized()方法)
  • 测试以确保您正在使用 适当的浏览器特定对象 参考(例如,窗口[“HelloMac”] 与文档[“HelloMac”]相比)

不知道更多,我猜这是这两个项目之一,因为这是我的经验。希望有帮助!我会密切关注这篇文章,以备您的后续跟进。

是的,克里斯蒂安·努恰托的回答很有帮助。问题是,在javascript调用flash函数时,javascript无法使用swf文件。Christian的技巧确保在javascript需要时加载并启动swf文件。

我在代码中没有看到对allowDomain函数的调用。如果没有,安全沙箱将不允许您的flash应用程序在服务器上与flash通信,反之亦然。为flash应用程序将在其上执行的每个域添加对
System.security.allowDomain(“mydomain.com”、“mySecondDomain.com”、“etc.com”)的调用。此外,嵌入代码还需要通过包含参数
来指定对JavaScript的访问

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" height="300" width="600">

    <mx:Script>
        <![CDATA[

            import mx.controls.Alert;
            import flash.external.ExternalInterface;

            private function init():void
            {
                addCallbacks(); 
            }

            private function addCallbacks():void
            {
                ExternalInterface.addCallback("helloFlash", this_helloFlash);
                ExternalInterface.call("callbacksInitialized");
            }

            // Display a message from the host
            private function this_helloFlash(message:String):void
            {
                Alert.show(message);
            }

            // Send a string to the host
            private function helloMac():void
            {
                if (ExternalInterface.available)
                {
                    ExternalInterface.call("helloMac", txtMessage.text);
                }
            }

        ]]>
    </mx:Script>

    <mx:VBox horizontalCenter="0" verticalCenter="0">
        <mx:TextInput id="txtMessage" text="Hello, Mac!" />
        <mx:Button id="btnSend" label="Send to Host" click="helloMac()" />
    </mx:VBox>

</mx:Application>