Сохранение растрового изображения на iOS с помощью Adobe AIR

Я наконец-то пытаюсь перенести свои Flash-игры в приложения, начиная с iOS. Я застрял на функции сохранения изображений. В swf я использовал jpegencoder для сохранения на настольный сервер. После некоторых исследований показалось, что этот код все еще должен работать на мобильных устройствах, поэтому я попробовал, но он, похоже, ничего не делает при тестировании на iPhone из Adobe AIR (кнопка регистрирует щелчок, но нет изображения, которое может быть найдено, нет уведомлений о том, что что-то происходит, не запрашивается разрешение на доступ к изображениям и т. д.). Это старый код:

saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave);
function saveToDiscSave(e:MouseEvent):void {
    this.visible = false;  //hides menu

    var bitmapData:BitmapData = new BitmapData(1242,1864);
    bitmapData.draw(MovieClip(root));
    var jpgEncoder:JPGEncoder = new JPGEncoder(80);
    var byteArray:ByteArray = jpgEncoder.encode(bitmapData);
    var fileReference:FileReference=new FileReference();
    fileReference.save(byteArray, "Dinogeddon-DollDivine.jpg");

    //this.visible = true;  //returns menu. commented out to see if click registered
}

Итак, проведя дополнительные исследования, я нашел код CameraRoll, который выглядел просто и выглядел так, как будто он был создан специально для iOS. Я попробовал это, но у меня та же проблема: нет доказательств того, что что-то происходит. Изображение не сохранено, ошибок нет, запросов разрешений нет.

saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave);
function saveToDiscSave(e:MouseEvent):void {
    this.visible = false;

    var cameraRoll:CameraRoll = new CameraRoll();
    var bitmapData:BitmapData = new BitmapData(1242,1864);
    bitmapData.draw(MovieClip(root));
    cameraRoll.addBitmapData(bitmapData);

    //this.visible = true;
}

Мол, даже не знаю, где я ошибаюсь ... Могут ли приложения в тестовом режиме сохранять изображения? Стоит ли ожидать появления какого-либо уведомления? Есть ли ограничение на размер вещей, сохраняемых на телефон? HALP


person ola.rogula    schedule 08.04.2016    source источник
comment
Вы хотите, чтобы изображение в рулоне камеры? или просто хранится где-то на устройстве, откуда вы можете получить его позже? FileReference Я не думаю, что работает на мобильных устройствах, вам придется использовать классы FileStream и File для сохранения в каталог хранилища приложения. Вы убедились, что CameraRoll.supportsAddBitmapData верно?   -  person BadFeelingAboutThis    schedule 08.04.2016
comment
Кроме того, вы должны следить за ошибками, поскольку метод addBitmapData камеры является асинхронной операцией. cameraRoll.addEventListener(ErrorEvent.ERROR, handleMyError);, вы также можете прослушивать событие Event.COMPLETE.   -  person BadFeelingAboutThis    schedule 08.04.2016
comment
Приложению изображение не понадобится. Это просто для собственного прочтения. Меня не волнует, конкретно ли это фотопленка .. Я просто хочу, чтобы она сохранялась везде, где обычно для такого рода вещей?   -  person ola.rogula    schedule 08.04.2016
comment
Тогда Camera Roll - самое подходящее место. Прослушайте ошибки и убедитесь, что CameraRoll поддерживается (хотя всегда должен быть на iOS).   -  person BadFeelingAboutThis    schedule 08.04.2016
comment
Как узнать об ошибках при тестировании на устройстве? Я бы попробовал это на эмуляторе на моем компьютере, но он тестирует гигантскую игру и обрезает нижнюю половину на моем мониторе, поэтому я не могу таким образом протестировать большинство кнопок. Это очень расстраивает: /   -  person ola.rogula    schedule 08.04.2016
comment
Если вы не хотите настраивать удаленную отладку на устройстве, просто поместите текстовое поле в свое приложение и напишите в нем сообщение об ошибке. Вы можете отлаживать устройство, я думаю, что в FlashPro / AnimateCC это настраивается в настройках AIR (нажмите гаечный ключ рядом с целью вывода в настройках публикации)   -  person BadFeelingAboutThis    schedule 08.04.2016
comment
@ ola.rogula, почему вы не можете отлаживать на устройстве? скомпилировать с помощью ipa-debug-interpter, а затем fdb для прослушивания. Вы должны иметь его для тестирования на реальном устройстве.   -  person SaachiTech    schedule 08.04.2016
comment
Дело не в том, что я не хочу ... Я делаю приложение впервые и даже не знаю, что возможно. Так можно ли при тестировании на телефоне получать сообщения об ошибках? Прохладный. Я тоже не знаю, как отправлять сообщения об ошибках в текстовое поле ... Я даже не знал, что могу управлять сообщениями об ошибках с помощью кода хе-хе. Похоже, что будет легче найти для него настройку, я попробую. Но выглядит ли код cameraRoll так, как будто он должен теоретически работать? Или мне не хватает абзаца о том, как заставить его записывать на диск или что-то в этом роде?   -  person ola.rogula    schedule 08.04.2016
comment
@ ola.rogula по идее код правильный и должен работать. Подробнее об этом читайте здесь help.adobe.com/ en_US / FlashPlatform / reference / actionscript / 3 / вы можете добавить полное событие, чтобы проверить правильность вызова addbitmapdata.   -  person SaachiTech    schedule 08.04.2016
comment
@SameerJain ах, спасибо, отлично! Понятия не имею, почему эта документация не появилась, когда я гуглил. Я просто использовал их пример кода, и он работал отлично ... попросил разрешения и все такое. У меня даже не было возможности попытаться включить сообщения об ошибках. Думаю, я поработаю с кодом и отправлю свой последний в качестве ответа ...   -  person ola.rogula    schedule 08.04.2016
comment
..но странно, я использовал код, позволяющий пользователю просматривать изображение ... но он позволял им сохранять его вместо этого, хотя код нигде не использовал рисование .. Что происходит? Так сбивает с толку ..   -  person ola.rogula    schedule 08.04.2016
comment
Странный. Это как если бы телефон всегда тестировал более старую версию, чем я кодировал ... Я передаю файл между ПК и Mac для развертывания, поэтому что-то должно сохраняться неправильно. Но, по крайней мере, хорошие новости, я думаю, это означает, что код камеры действительно работает правильно! = D   -  person ola.rogula    schedule 08.04.2016
comment
Сейчас я точно использую код камеры, но он снова не работает. Понятия не имею, что происходит. Даже не знаю, правильно ли тестирую. Я готова плакать. И теперь у меня есть беспокойство, потому что я знаю, что кто-то начнет кричать на меня, что потоки stackoverflow не должны быть такими длинными аааааа :(   -  person ola.rogula    schedule 09.04.2016
comment
... может быть, изображение слишком большое или что-то в этом роде? Но почему однажды это сработало?   -  person ola.rogula    schedule 09.04.2016
comment
Ооооо, хорошо .. так он спрашивает разрешения только один раз? Я думаю, это работает! Уф ~   -  person ola.rogula    schedule 09.04.2016
comment
@ ola.rogula рада, что это работает. Настройте FDB, чтобы вы могли выполнять отладку на реальном устройстве. Зачем переносите на макинтош. Используйте AIR SDK в Windows, скомпилируйте с помощью команды, установите на устройство и выполните отладку. Все операторы трассировки появятся в FDB. Убедитесь, что itunes установлен в Windows.   -  person SaachiTech    schedule 09.04.2016
comment
И да, как только разрешение будет зарегистрировано, оно больше не будет запрашиваться, вы можете отозвать разрешение, сначала удалив приложение, либо из настроек. Удачи   -  person SaachiTech    schedule 09.04.2016
comment
@SameerJain большое спасибо, я не знал, что могу протестировать на ПК! Поскольку код работает, и проблема была больше связана с моей внимательностью при тестировании, если хотите, вы можете написать ответ, разъясняющий это для меня, ха-ха ... Типа, очень простые инструкции по тестированию с ПК и самые простые способ получения сообщений об ошибках и т. д. И я выберу его в качестве ответа :) Примерно так, код камеры правильный. Убедитесь, что вы тестируете это так:   -  person ola.rogula    schedule 10.04.2016
comment
@ ola.rogula, здесь есть все, что вам нужно help.adobe.com/en_US / воздух / сборка /. Загрузите последнюю версию AIR SDK и используйте команды. Убедитесь, что вы запускаете команду в правильном каталоге. В поиске google есть много ссылок Adobe Air FDB   -  person SaachiTech    schedule 11.04.2016


Ответы (2)


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

При правильной работе он один раз запрашивает разрешение на устройстве, а после этого сохраняется без уведомления, поэтому я добавил несколько анимаций, чтобы скрыть кнопку «Сохранить» на несколько секунд, чтобы пользователь не перегружал себя спамом, и чтобы дать визуальное представление. признак того, что кнопка была нажата.

person ola.rogula    schedule 11.04.2016

Мобильные приложения во многом похожи на настольные, но ваш код в любом случае не адаптирован для этого. Вы даже не пытаетесь использовать классы, специально созданные для настольных и мобильных устройств, такие как, например, класс File. В любом случае, прежде чем я покажу вам шаги, которые вам нужно забыть о создании swf для Интернета (это то, что показывает ваш код), вам нужно мобильное / настольное приложение, а затем адаптироваться к нему и использовать классы AIR.

Сначала получите данные, заполнив массив байтов:

var byteArray:ByteArray = new ByteArray();
bitmapData.encode(new Rectangle(0,0,bitmapData.width,bitmapData.height), new PNGEncoderOptions(), byteArray);

Во-вторых, выберите место назначения (на мобильных устройствах это обычно File.applicationStorageDirectory) и используйте файл класса AIR.

var dest:File = File.applicationStorageDirectory.resolvePath("mypng.png");

В-третьих, у вас есть данные, у вас есть место назначения, теперь сохраните их с помощью класса AIR FileStream:

var stream:FileStream = new FileStream();
stream.open(dest, FileMode.WRITE);
stream.writeBytes(byteArray);
stream.close();

Вот и все. Используйте класс File для создания каталогов и файлов в каталоге хранилища. Осторожно, на мобильном устройстве вы не сможете сохранить файл где угодно, поэтому лучше использовать applicationStorageDirectory, поскольку он всегда доступен и изолирован для вашего использования.

person BotMaster    schedule 09.04.2016
comment
Мне показалось, что запись растровых данных в каталог хранилища приложений на iOS работает медленно. Я использую ANE, который пишет слишком быстро. - person SaachiTech; 09.04.2016
comment
Единственная медленная операция с Adobe AIR на iOS - отрисовка в растровые данные, размер которых может составлять n * 100 мс. - person BotMaster; 09.04.2016
comment
не думаю, я попытался сохранить полный экран, снятый с iphone5, и это требует много для сохранения по сравнению с ANE, сохраняющим растровые данные. - person SaachiTech; 09.04.2016
comment
Вы не согласны, а затем продолжаете подтверждать то, что я сказал, вы вообще читали мой комментарий? - person BotMaster; 09.04.2016
comment
Я говорю, что операция записи через Filestream на ios выполняется медленно, если вы пишете большие растровые данные, такие как OP, 1242,1864. - person SaachiTech; 09.04.2016
comment
Да, изображение довольно большое, но камера, кажется, работает довольно быстро .. Я тоже могу попробовать и сравнить, как только выясню, как лучше тестировать XD - person ola.rogula; 10.04.2016
comment
Прокрутка камеры @ ola.rogula может быть быстрой. Я никогда не тестировал это, потому что я хочу иметь больше контроля и перезагружать, если это необходимо, в моем приложении, просто показывая, что было сохранено через мое приложение. - person SaachiTech; 10.04.2016