Проблема с Flash ExternalInterface в Google App Engine - PullRequest
2 голосов
/ 23 января 2009

Я боролся с этим последние пару часов, и я действительно не знаю, что может быть не так. Я просто пытаюсь заставить Javascript общаться с Flash. Я нашел этот замечательный пример с этим источником

http://blog.circlecube.com/wp-content/uploads/2008/02/ActionscriptJavascriptCommunication.zip

Я запустил html-файл локально, и он отлично работает, отправляя и получая текст из flash. Затем я загружаю тот же самый точный образец на сервер приложений Google Dev и не могу отправить текст из JavaScript на Flash. Как ни странно, Flash может отправлять тексты Javascript. Кто-нибудь может увидеть, смогут ли они это запустить с помощью GAE? Спасибо миллион!

Ответы [ 3 ]

2 голосов
/ 23 января 2009

Вероятно, это не имеет отношения к движку приложений Google как таковому, поскольку все это работает в браузере - если только вы не упомянули какую-либо зависимость от сервера. Если предположить, что это не так ...

Если вы можете заставить Flash вызывать JavaScript с помощью ExternalInterface.call (), но не 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>

А теперь код Flash (в моем случае это Flex, так что, надеюсь, он понятен):

<?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>

В этом примере демонстрируется вызов Flash в JavaScript с некоторым текстом и аналогичный вызов JavaScript в обратном направлении. Некоторые моменты, на которые следует обратить внимание:

  • Убедитесь, что вы ждете , чтобы позвонить в Вспышка, пока Flash не уведомит браузер готов начать получать звонки (как указано моим Метод callbacksInitialized ()).
  • Тест, чтобы убедиться, что вы используете соответствующий специфичный для браузера объект ссылка (например, окно ["HelloMac"] против документа ["HelloMac"]).

Не зная больше, я предполагаю, что это один из этих двух предметов, так как это был мой опыт. Надеюсь, поможет! Я буду следить за сообщением о последующих мероприятиях на случай, если они у вас есть.

1 голос
/ 28 января 2009

Я не вижу вызова функции allowDomain в вашем коде. Если песочница безопасности не позволит вашему флеш-приложению взаимодействовать с флеш-памятью и наоборот на сервере. Добавьте вызов к System.security.allowDomain("mydomain.com", "mySecondDomain.com", "etc.com") для каждого домена, на котором будет выполняться флэш-приложение. Также встраиваемый код также должен указывать доступ для JavaScript, включая параметр <param name="allowScriptAccess" value="always" />.

0 голосов
/ 23 января 2009

Да, ответ Кристиана Нунциато полезен. Проблема заключается в том, что ваш SWF-файл недоступен для JavaScript в тот момент, когда он вызывает функцию Flash. Хитрость Кристиана заключается в том, что SWF-файл загружается и запускается, когда это требуется вашему javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...