Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Проблема с загрузкой (http://www.flasher.ru/forum/showthread.php?t=212711)

Comer 12.04.2016 17:41

Проблема с загрузкой
 
Создал swf под Андроид. Хочу загрузить в него другой swf с листалкой, который тоже сделан под Андроид.
Если при компиляции назначение родительского swf Flash Player 20, то грузится нормально. Но если назначение родительского swf AIR 20.0 for Android, тогда программа выдаёт ошибку:
Код AS3:

SecurityError: Error #2070: Security sandbox violation: caller file:///G:/№2/Листалка/perelistyvanie.swf cannot access Stage owned by app:/Родительский.swf.
    at flash.display::Stage/requireOwnerPermissions()
    at flash.display::Stage/addEventListener()
    at perelistyvanie_fla::MainTimeline/frame1()[perelistyvanie_fla.MainTimeline::frame1:8]

Подскажите, пожалуйста, как подгрузить swf с листалкой в андроид-приложение?
Вот код листалки, на всякий случай. Код полностью рабочий.
Код AS3:

Multitouch.inputMode = MultitouchInputMode.GESTURE;
 
var currentGalleryItem:Number = 1;
var totalGalleryItems:Number = 4;
 
stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrame);
 
function fl_SwipeToGoToNextPreviousFrame(event:TransformGestureEvent):void
{
    if(event.offsetX == 1)
    {
        if(currentGalleryItem > 1){
            currentGalleryItem--;
            slideRight();
        }
    }
    else if(event.offsetX == -1)
    {
        if(currentGalleryItem < totalGalleryItems){
            currentGalleryItem++;
            slideLeft();
        }
    }
}
 
var slideCounter:Number = 0;
function slideLeft(){
    gallery_items.addEventListener("enterFrame", moveGalleryLeft);
    (root as MovieClip).nextFrame();
}
function slideRight(){
    gallery_items.addEventListener("enterFrame", moveGalleryRight);
    (root as MovieClip).prevFrame();
}
 
function moveGalleryLeft(evt:Event){
    gallery_items.x -= 48;
    slideCounter++;
    if(slideCounter == 10){
        gallery_items.removeEventListener("enterFrame", moveGalleryLeft);
        slideCounter = 0;
    }
}
function moveGalleryRight(evt:Event){
    gallery_items.x += 48;
    slideCounter++;
    if(slideCounter == 10){
        gallery_items.removeEventListener("enterFrame", moveGalleryRight);
        slideCounter = 0;
    }
}


illuzor 12.04.2016 18:02

Попытка обратиться к stage, когда он ещё не существует. Нужно сначала поставить слушатель добавления на stage.

Comer 12.04.2016 18:15

Цитата:

Сообщение от illuzor (Сообщение 1193310)
Попытка обратиться к stage, когда он ещё не существует. Нужно сначала поставить слушатель добавления на stage.

А как это сделать практически? Подскажите, пожалуйста, а то я в этом ещё не очень силён.
Я так понимаю, что куда-то надо вставить addEventListener. Правильно?

illuzor 12.04.2016 19:38

Да, в конструктор главного класса флешки addEventListener(Event.ADDED_TO_STAGE, onAddedToStage)
Ну и соответствующий метод.

Comer 12.04.2016 19:53

Цитата:

Сообщение от illuzor (Сообщение 1193312)
Да, в конструктор главного класса флешки addEventListener(Event.ADDED_TO_STAGE, onAddedToStage)
Ну и соответствующий метод.

Пробую, что-то не получается. Нужно это вставить в код подгружаемой флешки? В ту, которая с листалкой?

illuzor 12.04.2016 20:09

В код подгружаемой

Comer 12.04.2016 20:18

Цитата:

Сообщение от illuzor (Сообщение 1193314)
В код подгружаемой

Я так и делаю. Не пойму, чего-то не хватает. Выдаёт ошибку:
Код AS3:

Монтажный кадр 1, слой "Actions", кадр 1, строка 2, столбец 24        1086: Синтаксическая ошибка: ожидается точка с запятой перед leftparen.

Но ставить точку с запятой перед скобками - это же неправильно?

caseyryan 13.04.2016 06:20

Цитата:

Сообщение от illuzor (Сообщение 1193310)
Попытка обратиться к stage, когда он ещё не существует. Нужно сначала поставить слушатель добавления на stage.

В ошибке же явно написано
Цитата:

cannot access Stage owned by app:/Родительский.swf.
Не может получить доступ к объекту Stage, принадлежащему другой swf.
То есть stage то он видит, но по соображениям безопасности доступ к нему ограничен.
Надо грузить флешку указывая контекст загрузки
Вот код из одной из моих игр, в которой грузились swf с сервера
Код AS3:

var loader:Loader                                = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderCompele);
if (Security.sandboxType == Security.REMOTE) {
        var context:LoaderContext        = new LoaderContext();
        context.applicationDomain        = new ApplicationDomain(ApplicationDomain.currentDomain);
        loader.loadBytes(byteArray, context);
} else {
        loader.loadBytes(byteArray);
}

Тут тебе loadBytes можно заменить на load, если грузишь не из байт массива, а напрямую с диска.

Цитата:

Код AS3:

Монтажный кадр 1, слой "Actions", кадр 1, строка 2, столбец 24        1086: Синтаксическая ошибка: ожидается точка с запятой перед leftparen

.
Но ставить точку с запятой перед скобками - это же неправильно?
Не факт, что дело в этом. Он просто отваливается на этом месте. Покажи код


п.с. Никогда не называй файлы кириллицей и никогда не используй пробелы в называниях файлов. Только латиница и числа. Иначе хватанешь какой-нибудь непонятный баг, и будешь долго искать причины и ломать голову, "что же не так?"

Comer 13.04.2016 10:15

Цитата:

Сообщение от caseyryan (Сообщение 1193319)
Не факт, что дело в этом. Он просто отваливается на этом месте. Покажи код

п.с. Никогда не называй файлы кириллицей и никогда не используй пробелы в называниях файлов. Только латиница и числа. Иначе хватанешь какой-нибудь непонятный баг, и будешь долго искать причины и ломать голову, "что же не так?"

По твоему совету переименовал оба файла английскими буквами. Для сокращения абсолютного пути выложил их на рабочий стол и тестирую.
Вот код родительского swf (в который загружаю)
Код AS3:

stop();
 
btn.addEventListener(MouseEvent.CLICK, fl_ClickToLoadUnloadSWF);
 
import fl.display.ProLoader;
var fl_ProLoader:ProLoader;
var fl_ToLoad:Boolean = true;
 
function fl_ClickToLoadUnloadSWF(event:MouseEvent):void
{
        if(fl_ToLoad)
        {
                fl_ProLoader = new ProLoader();
                fl_ProLoader.load(new URLRequest("file:///C:/Users/Саша/Desktop/Listalka.swf"));
                addChild(fl_ProLoader);
        }
        else
        {
                fl_ProLoader.unload();
                removeChild(fl_ProLoader);
                fl_ProLoader = null;
        }
        fl_ToLoad = !fl_ToLoad;
}

Вот код флешки с листалкой (которую загружаю)
Код AS3:

stop();
 
Multitouch.inputMode = MultitouchInputMode.GESTURE;
 
var currentGalleryItem:Number = 1;
var totalGalleryItems:Number = 4;
 
stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrame);
 
 
function fl_SwipeToGoToNextPreviousFrame(event:TransformGestureEvent):void
{
        if(event.offsetX == 1)
        {
                if(currentGalleryItem > 1){
                        currentGalleryItem--;
                        slideRight();
                        trace ("Листает");
                }
        }
        else if(event.offsetX == -1)
        {
                if(currentGalleryItem < totalGalleryItems){
                        currentGalleryItem++;
                        slideLeft();
                }
        }
}
 
var slideCounter:Number = 0;
function slideLeft(){
        gallery_items.addEventListener("enterFrame", moveGalleryLeft);
        (root as MovieClip).nextFrame();
}
function slideRight(){
        gallery_items.addEventListener("enterFrame", moveGalleryRight);
        (root as MovieClip).prevFrame();
}
 
function moveGalleryLeft(evt:Event){
        gallery_items.x -= 48;
        slideCounter++;
        if(slideCounter == 10){
                gallery_items.removeEventListener("enterFrame", moveGalleryLeft);
                slideCounter = 0;
        }
}
function moveGalleryRight(evt:Event){
        gallery_items.x += 48;
        slideCounter++;
        if(slideCounter == 10){
                gallery_items.removeEventListener("enterFrame", moveGalleryRight);
                slideCounter = 0;
        }
}

Вот полный текст ошибки при тестировании загрузки:
Код AS3:

SecurityError: Error #2070: Security sandbox violation: caller file:///C:/Users/Саша/Desktop/Listalka.swf cannot access Stage owned by app:/Roditelsky.swf.
        at flash.display::Stage/requireOwnerPermissions()
        at flash.display::Stage/addEventListener()
        at Listalka_fla::MainTimeline/frame1()[Listalka_fla.MainTimeline::frame1:14]

Хочу ещё раз обратить внимание на то, что если при компиляции в параметрах публикации назначение родительского swf Flash Player 20, то грузится нормально. Но если назначение родительского swf AIR 20.0 for Android, тогда программа выдаёт ошибку. Возможно, это чем-то тебе поможет.

Попробуй, пожалуйста, разобраться. Может получится? На тебя только и надеюсь. У тебя огромный опыт и, самое главное, есть желание помогать людям!

caseyryan 14.04.2016 10:41

Мой главный совет был не переименовать файлы, а создать контекст загрузки. Это во-первых. Во-вторых, что толку от переименования файла, если у тебя в пути все равно содержатся руские буквы?
Третье: рабочий стол - это не директория приложения, и считается не безопасной для флешки. Чтобы что-то работало с рабочего стола, нужно указать ее как разрешенную здесь https://www.macromedia.com/support/d...manager04.html
Но лучше сделай, чтобы обе флешки лежали в директории приложения, откуда они по умолчанию могут грузиться.

Comer 14.04.2016 11:06

Цитата:

Сообщение от caseyryan (Сообщение 1193350)
Мой главный совет был не переименовать файлы, а создать контекст загрузки.

Легко сказать - "...создать контекст загрузки..." Ты хоть объясни, как это делается...

caseyryan 14.04.2016 11:20

Я тебе даже код привел. Куда уж подробнее?
читай внимательнее http://www.flasher.ru/forum/showpost...19&postcount=8

Comer 14.04.2016 11:32

Цитата:

Сообщение от caseyryan (Сообщение 1193355)
Я тебе даже код привел. Куда уж подробнее?
читай внимательнее http://www.flasher.ru/forum/showpost...19&postcount=8

Да код-то я вижу. Я только ещё не всё в нём понимаю. Растолкуй, пожалуйста, что там к чему.

Добавлено через 10 часов 44 минуты
Цитата:

Сообщение от caseyryan (Сообщение 1193355)
Я тебе даже код привел. Куда уж подробнее?
читай внимательнее http://www.flasher.ru/forum/showpost...19&postcount=8

Ты хотя бы эти строчки объясни. Просто прочитай, что они означают. Вот эти:
Код AS3:

1. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderCompele);
2. loader.loadBytes(byteArray, context);



Часовой пояс GMT +4, время: 00:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.