Отображение изображения с sd-карты

Урок 160. Рисование. Bitmap. Чтение изображений большого размера

Подробности 27 октября 2014

В этом уроке:

– читаем и отображаем большие изображения

Когда мы читаем изображение с SD-карты в Bitmap, оно в памяти занимает значительно больше, чем размер файла на SD. Потому что на диске оно хранится в сжатом JPG или PNG формате. А мы при чтении его распаковываем и получаем полновесный Bitmap.

Для примера возьмем изображение размером 5712х2986. Нам необходимо отобразить его в приложении.

Создадим проект:

Project name: P1601_BitmapLarge
Build Target: Android 4.4
Application name: BitmapLarge
Package name: ru.startandroid.develop.p1601bitmaplarge
Create Activity: MainActivity

res/values/dimens.xml:

300dp

res/layout/main.xml:

На экране только ImageView размером в 300dp

MainActivity.java:

package ru.startandroid.develop.p1601bitmaplarge; import java.io.File; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.widget.ImageView; public class MainActivity extends Activity { ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mImageView = (ImageView) findViewById(R.id.imageView); logMemory(); readImage(); logMemory(); } private void readImage() { File file = new File(Environment. getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),”map.jpg”); Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); Log.d(“log”, String.format(“bitmap size = %sx%s, byteCount = %s”, bitmap.getWidth(), bitmap.getHeight(), (int) (bitmap.getByteCount() / 1024))); mImageView.setImageBitmap(bitmap); } private void logMemory() { Log.i(“log”, String.format(“Total memory = %s”, (int) (Runtime.getRuntime().totalMemory() / 1024))); } }

Метод readImage – читает Bitmap из файла и отображает его в ImageView.

Метод logMemory показывает сколько КБ памяти занимает наше приложение. Будем вызывать этот метод до и после отображения, чтобы увидеть сколько памяти заняла картинка.

В папку Download на вашем девайсе или эмуляторе закиньте файл map.jpg.

Запускаем:

Смотрим лог:

Total memory = 3184bitmap size = 5712×2986, byteCount = 66625

Total memory = 69832

Впечатляет! Наше изображение заняло в памяти 66 мегабайт! Т.е. чтобы на экране отобразить изображение размером 300dp, мы держим в памяти изображение размером 5712х2986 и весит оно 66 мегабайт. Крайне неудачная реализация. А уж если придется выводить на экран несколько таких картинок, то OutOfMemory нам не избежать.

Надо картинку срочно уменьшать до необходимых нам размеров. Какие тут есть варианты?

Можно, например, ее читать так же, как мы это делаем сейчас, а перед тем, как помещать ее в ImageView, вызывать метод createScaledBitmap (Урок 158), чтобы привести к нужному размеру.

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

А значит, мы все равно можем словить OutOfMemory, если у нас с памятью напряги.

Тут нам помогут два параметра BitmapFactory.Options:

inJustDecodeBounds – поможет нам узнать размер изображения, не занимая память

inSampleSize – при чтении изображения уменьшит его размер в требуемое кол-во раз, и на выходе мы получим уже уменьшенную копию, что значительно сэкономит нам память. Этот коэффициент должен быть кратным двум.

Подробнее про эти параметры можно прочесть в Уроке 159.

Т.е. алгоритм таков:- выясняем размер изображения- определяем во сколько раз надо его уменьшить, чтобы получить нужный нам размер

– читаем его, сразу уменьшая до нужных нам размеров

Хелп гугла любезно предоставляет нам готовые методы с реализацией этого алгоритма.

Скопируем их оттуда в MainActivity.java, немного изменив, чтобы они читали файл не из ресурсов, а с SD:

public static Bitmap decodeSampledBitmapFromResource(String path, int reqWidth, int reqHeight) { // Читаем с inJustDecodeBounds=true для определения размеров final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, options); // Вычисляем inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Читаем с использованием inSampleSize коэффициента options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, options); } public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // Реальные размеры изображения final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Вычисляем наибольший inSampleSize, который будет кратным двум // и оставит полученные размеры больше, чем требуемые while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; }

В методе decodeSampledBitmapFromResource мы просто читаем изображение с включенным inJustDecodeBounds. Тем самым, в options помещаются данные о размере изображения, но само изображение не читается. Собственно, тут-то мы и экономим 66 метров.

Далее объект options с данными о размере изображения мы передаем в метод calculateInSampleSize. А также передаем туда ширину и высоту изображения, которые нам нужно получить на выходе. Метод calculateInSampleSize вычисляет (и помещает в inSampleSize) коэффициент уменьшения изображения.

Далее мы отключаем inJustDecodeBounds и получаем bitmap, который будет уменьшен до необходимых нам размеров.

Метод calculateInSampleSize на вход получает объект options, который содержит данные о реальном размере изображения. Также на вход идут reqWidth и reqHeight, в которые мы передаем желаемые нам размеры изображения.

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

Для этого он вычисляет половину ширины и высоты изображения, делит их на коэффициент и проверяет, что результат влезает в требуемые нами размеры. Если не влезает, то коэффициент увеличивается на два и снова идет проверка.

Этот цикл выполняется пока половина ширины и высоты изображения, поделенные на коэффициент не влезут в требуемые нами размеры.

Либо можно трактовать логику чуть по-другому. Цикл находит нам коэффициент, использование которого даст нам размер, который вместится в требуемый. А мы потом этот коэффициент откатываем на шаг назад, чтобы получить размер, который будет чуть больше требуемого.

В результате этот метод определит нам коэффициент так, чтобы изображение получилось максимально близко к требуемым размерам, но было бы больше их, а не меньше. Размер должен получится больше требуемого, чтобы не потерять в качестве изображения при отображении. Меньшее изображение пришлось бы растягивать, а это скажется на качестве.

Получить точно требуемые нам размеры мы не сможем, т.к. коэффициент должен быть кратным двум.

Перепишем метод readImage с использованием этих методов:

private void readImage() { int px = getResources().getDimensionPixelSize(R.dimen.image_size); File file = new File(Environment. getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),”map.jpg”); Bitmap bitmap = decodeSampledBitmapFromResource(file.getAbsolutePath(), px, px); Log.d(“log”, String.format(“Required size = %s, bitmap size = %sx%s, byteCount = %s”, px, bitmap.getWidth(), bitmap.getHeight(), bitmap.getByteCount())); mImageView.setImageBitmap(bitmap); }

Запускаем, смотрим лог:

Total memory = 3204Required size = 600, bitmap size = 1428×747, byteCount = 4166

Total memory = 7412

Стало значительно лучше. С учетом density наш ImageView имеет размер 600 px. И при чтении изображения был учтен этот размер. Теперь в памяти изображение размером 1428х747 и весом в 4 мегабайта. Это вполне приемлемый результат.

Кстати, если не очень понятен алгоритм метода calculateInSampleSize, то возьмите реальные цифры и попробуйте сами на бумажке по шагам все посчитать. Исходный размер был 5712х2986, а требуемый размер – 600х600.

Итак, мы получили 4 мегабайта вместо 66. Но этот результат можно еще немного улучшить. Нашему изображению не нужна прозрачность. Поэтому мы можем использовать RGB_565 конфигурацию вместо дефолтовой ARGB_8888. Это уменьшит вес bitmap еще в два раза (Урок 157).

В метод decodeSampledBitmapFromResource добавим перед return следующую строку:

options.inPreferredConfig = Bitmap.Config.RGB_565;

Запускаем, смотрим лог:

Total memory = 3172Required size = 600, bitmap size = 1428×747, byteCount = 2083

Total memory = 5296

Стало еще лучше, всего 2 мегабайта вместо 66, а результат визуально тот же самый.

В принципе, можно еще и createScaledBitmap применить, чтобы получить уж совсем необходимый вам размер. Это может еще раза в два снизить вес Bitmap.

Если мы теперь, например, уменьшим размер ImageView до 100 dp, то получим такие данные в логе:

Total memory = 3176Required size = 200, bitmap size = 714×374, byteCount = 521

Total memory = 3740

Изображение весит уже пол-мегабайта всего, а размер = 714х374.

И напоследок пара важных замечаний.

Если вы пишете, например, приложение – графический редактор, то ему реально нужно будет много памяти. В этом случае можно в манифесте в тег добавить параметр largeHeap=”true”.

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

Не стоит злоупотреблять этим параметром и включать его просто, чтобы быстро избавиться от OutOfMemory.

Обратите внимание на разницу во времени логов, которые у нас получались в приложении. Видно, что декодирование изображения может занять от нескольких сотен мсек. до нескольких секунд.

Это слишком большая длительность для выполнения операции в основном потоке. Если на экран требуется выводить несколько таких картинок, то задержка UI будет весьма ощутима. Поэтому декодирование рекомендуется проводить в отдельном потоке.

AsyncTask (Урок 86) и AsyncTaskLoader (Урок 135) вам в помощь.

На следующем уроке:

– используем memory-кэш
– используем библиотеку Picasso

Присоединяйтесь к нам в Telegram:

– в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

– в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование 

– ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

– новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме 

Источник: https://startandroid.ru/ru/uroki/vse-uroki-spiskom/372-urok-160-risovanie-bitmap-chtenie-izobrazhenij-bolshogo-razmera.html

Android не сохраняет на карту памяти microSD фото, приложения, музыку и файлы – что делать

Встроенная память Android устройства часто быстро заканчивается, поэтому пользователям приходится хранить большие объемы информации на microSD. Но что делать, если Андроид не сохраняет на карту памяти скачиваемый контент – приложения, фото, музыку, и другие файлы?

Данная статья подходит для всех брендов, выпускающих смартфоны на Android 9/8/7/6: Samsung, HTC, Lenovo, LG, Sony, ZTE, Huawei, Meizu, Fly, Alcatel, Xiaomi, Nokia и прочие. Мы не несем ответственности за ваши действия.

Проблемы с картой памяти

Прежде всего, необходимо убедиться, что карта памяти исправна и готова принимать файлы. Что делать:

  1. Убедитесь, что на внешнем накопителе есть свободное место. Откройте раздел «Память» в настройках телефона или подключите устройство к компьютеру.
  2. Если свободное место есть, но записать на него ничего не удается, проверьте файловую систему карты памяти. Флешку для Андроида нужно форматировать в FAT32. Сделать это можно на своем компьютере/ноутбуке, или прямо в телефоне.Увеличить
  3. Удостоверьтесь в аппаратной исправности накопителя. Если другая карта памяти с аналогичными параметрами и файловой системой работает без ошибок, то причину следует искать в самом носителе.

Карта памяти может быть несовместимой со смартфоном – например, превышать объем, допустимый для конкретной модели телефона. Если флешка больше какого-то объема гигабайт (32, 64, 128 и т.д.), то он просто не распознает ее, т.к. не запрограммирован на такой объем. В таком случае единственным выходом будет использование другого носителя microSD, меньшего объема.

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

Нужна помощь?

Не знаешь как решить проблему в работе своего гаджета и нужен совет специалиста? Напиши нам »

Неправильная папка в браузере

Если проблемы с сохранением возникают во время скачивания файлов в браузере, то следует проверить папку назначения. Она может быть указана неправильно, из-за чего браузер не понимает, как сохранять фото, музыку, видео и другой контент. Посмотрим на примере UC Browser:

  1. Откройте раздел «Загрузки» в главном меню.
  2. Нажмите «Настройки».
  3. В поле «Путь загрузки» укажите папку на карте памяти.

Увеличить

После такой короткой настройки файлы в браузере будут скачиваться только в указанный каталог на карте, не забивая внутреннюю память.

Файлы нельзя перенести на карту памяти

Чаще всего это относится к встроенным приложениям Android. В телефоне они могут храниться только на внутреннем накопителе, иначе смартфон не будет работать. В то же время любое приложение от стороннего разработчика можно переместить на микроСД.

  1. Откройте настройки Андроида, зайдите в раздел «Приложения».
  2. Найдите программу, которую хотите перенести на карту памяти вместе со всеми файлами.
  3. Нажмите «Переместить на SD».

Увеличить

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

Сбились настройки переноса файлов на карту памяти

В настройках Android вы можете вручную указать, какая память используется по умолчанию – внутренняя или внешняя. В зависимости от выбранного значения, файлы будут скачиваться на телефон или microSD-карту. После обновления системы настройки могут слететь, поэтому стоит их проверить.

Подобная настройка есть не у каждой модели и производителя. Проверьте у себя.

  1. Откройте настройки Андроида.
  2. Перейдите в раздел «Память».
  3. В поле «Место установки» или «Память по умолчанию» выберите значение «SD».

Увеличить

Когда настройки нет

Если нет возможности задать место сохранения файлов по-умолчанию, то здесь на помощь придут сами приложения. В том же браузере Samsung «Интернет» есть возможность задать место хранения:

Увеличить

Посмотрите в своем приложении, откуда вы собираетесь сохранять файлы, есть ли возможность в настройках выбрать место сохранения. Если такого нет, то придется вручную перемещать файлы с внутренней памяти на карту microSD.

Для управления файлами и местом их сохранения нелишним будет установить файловый менеджер – например, ES Проводник. С его помощью можно быстро перемещать целые папки из внутренней памяти на microSD.

Источник: https://androproblem.ru/polomki/android-ne-sohranyaet-na-kartu-pamyati-microsd.html

Восстановление Фото с Карт Памяти Цифровых Камер

Также можно прочитать другие наши статьи:
Что делать, чтобы вернуть утраченные файлы?
Восстановление Видео
Восстановление Данных с Внешнего Устройства с Поврежденной Файловой Системой

В большинстве любительских и профессиональных цифровых фотокамер файлы фото хранятся на картах памяти, например, на Secure Digital (SD) или CompactFlash. Они часто могут быть случайным образом отформатированы (это возможно, например, если карту памяти вставить в другое устройство), также никто не застрахован от случайного удаления фотографий с карты памяти как на самой фотокамере, так и на ПК.

Кроме этого, при некорректном удалении карты памяти из устройства она может оказаться поврежденной, а ее файлы – нечитаемыми. Такое случается сплошь и рядом, даже с опытными пользователями. К счастью восстановить фото с карты памяти цифровой камеры достаточно просто при помощи R-Undelete вне зависимости от того, были ли они просто удалены, или же карта памяти были отформатирована (повреждена).

Восстановление файлов с карт памяти мало чем отличается от восстановления утраченных, поврежденных или удаленных данных с других носителей – таких, например, как жесткий диск.

В действительности шансы успешного восстановления файлов с карт памяти цифровых камер часто выше вследствие следующих трех причин: карты памяти как правило имеют меньший размер (128 Гб и меньше); файлы на них обычно нефрагментированы; на них хранятся в основном только фотографии и видеофайлы.

В настоящей статье мы рассмотрим два наиболее типичных случая. Первый случай это восстановление при помощи R-Undelete случайно удаленных с карты памяти фотографий.

Воторой – восстановление фотографий после того, как карта памяти была отформатирована или файловая система на ней была повреждена.

В большинстве случаев файлы можно восстановить даже если карту невозможно прочесть на компьютере или цифровой камере.

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

Загрузите и инсталлируйте утилиту R-Undelete (если вы этого еще не сделали). См. веб-страницу Инструкции и Информация.

Маленькие карты SD (32ГБ или меньше) практически всегда отформатированы как устройства FAT32, а большие карты отформатированы как устройства exFAT. Для R-Undelete не требуется регистрация для восстановления устройств FAT или exFAT.

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

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

Например, ниже вы видите структуру файлов/папок, созданную при помощи цифровой камеры Canon:

Чтобы увеличить изображение, щелкните по нему мышью

Если бы у вас была камера Nikon, то создавались бы папки с именами, например, 100NIKON, 200NIKON и т.д. Данная стандартная структура имен повышает шансы восстановления удаленных фото при помощи R-Undelete.

После инсталляции R-Undelete на ПК можно вставить карту памяти в подключенный к компьютеру кардридер. Можно воспользоваться как внешним кардридером, подключенный через USB, так и внутренним (встроенным) кардридером настольного ПК, ноутбука или принтера. После этого компьютер распознает карту памяти и в главном окне R-Undelete появится еще один диск.

Обратите внимание: если файловая система карты памяти повреждена, то вы можете не увидеть соответствующий ей логический диск в главном окне R-Undelete. Однако шансы восстановления с нее файлов все же имеются (данный случай будет рассмотрен ниже в разделе Восстановление Фото с Поврежденных или Форматированных Карт Памяти).

Восстановление Удаленных Фото
Файлы цифровых фотографий могут быть удалены как на компьютере, так и на самой камере. Как правило в обоих случаях их удается полностью восстановить.

Предположим, что после случайного удаления фотографий на карту памяти не записывалась другая информация.

Если начать восстанавливать фотографии сразу после их удаления, то это значительно повысит ваши шансы (хотя все же имеются возможности восстановить утраченные фото когда карта использовалась после их удаления).

Запустите R-Undelete. На панели Disks найдите устройство чтения карты памяти и ее логический диск. Это можно сделать по размеру карты (1-256 ГБ, в то время как диски имеют размер 500 ГБ или более)

Чтобы увеличить изображение, щелкните по нему мышью

Наведите курсор мыши на карточку SD и кликните по пункту меню Show files, которое появится под иконкой диска.

R-Undelete начнет поиск файлов на карточке SD. После его окончания программа покажет найденные файлы на панели Files. Теперь необходимо найти те файлы, которые вы хотите восстановить.

R-Undelete сортирует файлы по наиболее типичным типам файлов и размещает их на соответствующих закладках. В нашем случае нужная закладка Pictures. На этой закладке есть дополнительная возможность показа файлов: картинки (Tiles). Кликните по закладке, выберите Tiles и их размер.

Чтобы увеличить изображение, щелкните по нему мышью

Файлы также можно искать вручную. Для этого кликните по кнопке Search (Поиск), задайте имя файла или файловую маску, кликните по кнопке Start, и только соответствующие файлы будут показаны на текущей закладке.

За более детальными инструкциями по сортировке файлов и ручному поиску обращайтесь к сетевой подсказке по R-Undelete File Search (поиск файлов) и File Sorting (сортировка файлов).

Хотя картинки позволяют вам разглядеть картинки достаточно отчетливо, их можно посмотреть более подробно во встроенном просмотрщике. Кликните правой кнопкой по файлу чтобы его увидеть.

Чтобы увеличить изображение, щелкните по нему мышью
Закройте просмотрщик чтобы вернуться к остальным файлам.

После того как удаленные файлы найдены, пометьте их для восстановления. Это проще сделать когда файлы показываются единым списком файлов с деталями (Details):

Чтобы увеличить изображение, щелкните по нему мышью

Когда нужные файлы помечены для восстановления, надо подготовить достаточно большое свободное место на другом диске, что бы сохранить эти файлы.

Никогда не сохраняйте восстановленные файлы на то место, где они были расположены, иначе они могут быть потеряны навсегда!

Выберите то, как R-Undelete сохранит файлы: в папки по типам файлов или в реальную структуру папок.

После того, как будут сделаны все необходимые приготовления, кликните по кнопке Recover для запуска процесса восстановления файлов. Подождите, пока R-Undelete восстановит файлы и посмотрите на результаты.

Чтобы увеличить изображение, щелкните по нему мышью

После окончания восстановления автоматически откроется папка с восстановленными файлами.

Чтобы увеличить изображение, щелкните по нему мышью

Восстановление Фото с Поврежденных или Форматированных Карт Памяти
Утрата фотографий на карте памяти возможна либо в результате их последовательного удаление, либо в результате форматирования карты памяти. Карты памяти обычно форматируют перед началом использования на компьютере или на цифровой камере.

Перед началом форматирования вы увидите предупреждение о том, что все данные на диске будут уничтожены. Однако в зависимости от способа форматирования и оперативности восстановления вам все же удастся восстановить ранее записанные на карту памяти фото даже после того, когда она была переформатирована.

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

Так что если новые данные на такую карту записаны не были, то вы сможете восстановить все утраченные фото. Точно так же, если файловая система карты памяти была повреждена и карта стала нечитаемой (например, она была некорректно извлечена), то с нее можно восстановить фото при помощи R-Undelete, даже если ее невозможно распознать в Windows или Mac.

В этом случае при помощи R-Undelete можно провести “поиск файлов по сигнатурам” или, как часто говорят, поиск при сканировании файлов известных типов. R-Undelete будет искать файлы по их сигнатурам, являющимися уникальными для каджого типа файлов, что позволит их корректно идентифицировать и восстановить.

Обратите внимание: в отличие от быстрого форматирования (форматирования, выполненного на большинстве цифровых камер), полное, безопасное форматирование и другие подобные варианты очистки дискового пространства могут сделать ваши файлы невосстанавливаемыми. Отметим еще раз, что вы можете оценить шансы восстановления при помощи просмоторщика R-Undelete.

Запустите R-Undelete. На панели Disks найдите устройство чтения карты памяти и ее логический диск. Это можно сделать по размеру карты (1-256 ГБ, в то время как диски имеют размер 500 ГБ или более)

Чтобы увеличить изображение, щелкните по нему мышью

Наведите курсор мыши на карточку SD и кликните по пункту меню Show files, которое появится под иконкой диска.

Но в этом случае R-Undelete не найдет никаких файлов, потому что файлов не существует после форматирования. Можно попробовать запустить глубокое сканирование для поиска утеряных файлов.

Во время этой процедуры R-Undelete глубоко анализирует все данные на диске, включая разбор информации и поиск файлов по их сигнатурам.

Вы может получить больше информации о глубоком сканировании и файловых сигнатурах в сетевой справке по R-Undelete: Deep Scan (Глубокое Сканирование)

Чтобы увеличить изображение, щелкните по нему мышью

Кликните по кнопке Deep scan. R-Undelete начнет сканирование. Вы можете наблюдать за процессом сканирования в то время, как R-Undelete анализирует карту SD.

Чтобы увеличить изображение, щелкните по нему мышью

В зависимости от вашего оборудования, время сканирования может меняться, даже во время процесса сканирования, и может быть достаточно долгим для больших карт SD. Прцесс сканирования можно временно прервать, а потом продолжить, кликнув по кнопке Resume (возобновить).

Файлы можно искать и просматривать так, как описано в разделе Восстановление Удаленных Фотографий.

После поиска удаленных файлов пометьте их для восстановления:

Чтобы увеличить изображение, щелкните по нему мышью

Когда нужные файлы помечены для восстановления, надо подготовить достаточно большое свободное место на другом диске, что бы сохранить эти файлы.

Никогда не сохраняйте восстановленные файлы на то место, где они были расположены, иначе они могут быть потеряны навсегда!

Выберите то, как R-Undelete сохранит файлы: в папки по типам файлов или в реальную структуру папок.

После того, как будут сделаны все необходимые приготовления, кликните по кнопке Recover для запуска процесса восстановления файлов. Подождите, пока R-Undelete восстановит файлы и посмотрите на результаты.

Чтобы увеличить изображение, щелкните по нему мышью

После окончания восстановления автоматически откроется папка с восстановленными файлами.

Чтобы увеличить изображение, щелкните по нему мышью

Заключение
Пользователь достаточно часто может как случайным образом удалить фотографии с карты памяти, так и случайно ее отформатировать. К счастью, восстановить фото с карты памяти достаточно просто при помощи утилиты R-Undelete.

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

“Поиск утраченных файлов (Fast search for lost files)” позволяет восстанавливать удаленные файлы прежде, чем они были перезаписаны, в то время как глубокое сканирование позволяет найти фотографии даже тогда, когда файловая система была удалена или повреждена.

Так что прежде чем паниковать, платить сотни долларов специалистам по восстановлению данных и, самое главное, прежде чем начинать записывать новые данные на карту памяти, воспользуйтесь вышеизложенными методиками и попробуйте найти и восстановить утраченные фото и видео при помощи R-Undelete. Он восстанавливает файлы с карт SD, без регистрации, т.е., бесплавтно.

Источник: https://www.r-undelete.com/ru/free-recovery-SDcards.html

Восстановление удаленных фотографий с карты памяти (SD card)

Здравствуйте.

С развитием цифровых технологий наша жизнь круто поменялась: даже сотни фотографий теперь можно уместить на одной маленькой SD карте памяти, размером не больше почтовой марки. Это, конечно, хорошо — теперь можно запечатлеть в цвете любую минуту, любое мероприятие или событие в жизни!

С другой стороны — при неаккуратном обращении или программном сбое (вирусах), в случае отсутствия резервных копий — можно сразу потерять кучу фотографий (и воспоминаний, что намного дороже, т.к. их не купишь).

Так собственно и произошло со мной: фотоаппарат переключился на иностранный язык (даже не знаю какой)  и я по привычке, т.к.

уже помню практически наизусть меню, попытался, не переключая язык, сделать парочку операций…

В результате сделал не то что хотел и удалил большую часть фотографий с SD карты памяти. В этой статье хотел бы рассказать об одной неплохой программе, которая поможет вам быстро восстановить удаленные фотографии с карты памяти (если с вами приключилось нечто подобное).

SD карта памяти. Используется во многих современных фотоаппаратах и телефонах.

Пошаговая инструкция: восстановление фотографий с SD карты памяти в Easy Recovery

1) Что нужно для работы?

1. Программа Easy Recovery (кстати, одна из лучших в своем роде).

Ссылка на официальный сайт: http://www.krollontrack.com/. Программа платная, в бесплатной версии есть ограничение на восстанавливаемые файлы (не сможете восстановить все найденные файлы + стоит ограничение на размер файла).

2. SD карту нужно подключить к компьютеру (т.е. вынуть из фотоаппарата и вставить спец. отсек; например, на моем ноутбуке Acer — такой разъем на передней панельке).

3. На SD карту памяти, с которой вы хотите восстановить файлы, ничего нельзя копировать или фотографировать. Чем раньше вы заметите удаленные файлы и начнете процедуру восстановления — тем больше шансов на успешную операцию!

2) Пошаговое восстановление

1. И так, карта памяти подключена к компьютеру, он ее увидел и распознал. Запускаем программу Easy Recovery и выбираем тип носителя: «карта памяти (flash)«.

2. Далее нужно указать букву карты памяти, которую присвоил ей ПК. Easy Recovery, обычно, автоматически определяет правильно букву диска (если нет, можно уточнить в «моем компьютере«).

3. Важный шаг. Нам нужно выбрать операцию: «восстановление удаленных и потерянных файлов«. Эта функция поможет так же если вы отформатировали карту памяти.

Так же нужно указать файловую систему SD карты (обычно FAT).

Файловую систему можно узнать, если открыть «мой компьютер или этот компьютер«, далее перейти в свойства нужного диска (в нашем случае SD карты). См. скриншот ниже.

4. В четвертом шаге программа просто переспрашивает вас все ли введено правильно, можно ли приступать к сканированию носителя. Просто нажимаем кнопку продолжить.

5. Сканирование идет, на удивление, достаточно быстро. Для примера: SD карта на 16 ГБ была полностью просканирована за 20 мин.!

После сканирования Easy Recovery предлагает нам сохранить файлы ( в нашем случае фотографии) которые были найдены на карте памяти. В общем, ничего сложного — просто выделяете фотографии которые хотите восстановить — далее нажимаете кнопку «сохранить» (картинка с дискеткой, см. скриншот ниже).

Затем нужно указать папку на жестком диске, куда будут восстановлены фотографии.

Важно! Нельзя восстанавливать фотографии на ту же карту памяти, с которой идет восстановление! Сохраняйте, лучше всего, на жесткий диск компьютера!

Чтобы в ручную не задавать каждому новому восстановленному файлу имя — на вопрос о перезаписи или переименовании файла: можно просто нажать  кнопку «нет для всех». Когда все файлы будут восстановлены, в проводнике будет намного быстрее и проще разобраться: переименовать как и что нужно.

Собственно на этом все. Если все сделали правильно — программа через некоторое время сообщит вам об успешной операции восстановления.  В моем случае удалось восстановить 74 удаленные фотографии. Хотя, конечно, дороги мне не все 74, а лишь 3 из них.

PS

В этой статье была приведена небольшая инструкция по быстрому восстановлению фотографий с карты памяти — 25 мин. на все про все! Если Easy Recovery находит не все файлы, рекомендую попробовать еще несколько программ подобного рода: https://pcpro100.info/programmyi-dlya-vosstanovleniya-informatsii-na-diskah-fleshkah-kartah-pamyati-i-t-d/

 И последнее — делайте резервные копии важных данных!

Всем удачи!

Источник: https://pcpro100.info/vosstanovlenie-udalennyih-fotografiy/

Получение пути к карте памяти SD Card на Android

Разрабатывая приложение для проведения соревнований, я столкнулся с проблемой хранения базы данных. Проблема состояла в том, как мне определить внешнюю карту памяти. В целом поиск в сети точного ответа не дал. Поэтому, объединив все найденные результаты, я собрал свой класс. Если кому интересно, смотрим под катом.
Итак, начнем с теории.

Терминология

Гугл нам говорит, что есть следующие понятия:

  1. Внутренняя (internal) память — это часть встроенной в телефон карты памяти. При ее использовании по умолчанию папка приложения защищена от доступа других приложений (Using the Internal Storage).
  2. Внешняя (external) память — это общее «внешнее хранилище», т.е.

    это может быть как часть встроенной памяти, так и удаляемое устройство. Обычно это часть встроенной памяти, как удаляемое устройство я видел в последний раз на андройде 2.2, где встроенная память была около 2Гб, и подключаемая память становилась внешней (Using the External Storage).

  3. Удаляемая (removable) память — все хранилища, которые могут быть удалены из устройства без «хирургических» вмешательств.

До версии KitKat 4.4 API не предоставляло функционала для получения путей к внешней памяти.

Начиная с этой версии (API 19) появилась функция public abstract File[] getExternalFilesDirs (String type), которая возвращает массив строк с путями к внутренней и внешней памяти. Но как же быть с нашей SD Card, которая вставлена в слот? Путь к ней мы опять не можем получить.

Результаты поиска

Чтобы ответить на поставленный вопрос я обратился к всезнающему гуглу. Но и он мне не дал четкого ответа.

Было рассмотрено множество вариантов определения от использования стандартных функций, которые ведут к внешней памяти, но ничего общего с удаляемыми устройствами хранения данных они не имеют, до обработки правил монтирования устройств (Android же на ядре Linux работает).

В последних случаях были использованы «зашитые» пути к папке с примонтироваными устройствами (в различных версиях эта директория разная). Не стоит забывать, что от версии к версии правила монтирования меняются. В конечном итоге я решил объединить все полученные знания и написал свой класс, который может нам вернуть пути к внешним и удаляемым устройствам.

Описание кода

Был создан класс MountDevice, который содержит в себе путь к устройству, тип устройства и некий хэш. Типов устройств выделено два (внутреннюю память я не стал трогать, так как к ней доступ можно получить через API системы).

public enum MountDeviceType { EXTERNAL_SD_CARD, REMOVABLE_SD_CARD
}

И был создан класс StorageHelper, который и осуществляет поиск доступных карт памяти.

В классе StorageHelper реализовано два способа поиска — через системное окружение (Environment) и с использованием утилиты Linux mount, а точнее результата ее выполнения.

Способ первый — Environment

При работе с окружением я использую стандартную функцию getExternalStorageDirectory() для получения информации о внешней памяти. Чтобы получить информацию о удаляемой памяти, я использую переменную окружения “SECONDARY_STORAGE“.

Внешняя память всегда одна и обычно всегда есть, поэтому проверяем ее на читаемость, вычисляем хэш и запоминаем. Удаляемой памяти может быть много, поэтому необходимо полученную строку разбить по разделителю и проверять каждое значение.Функция fillDevicesEnvirementString path = android.os.Environment.

getExternalStorageDirectory() .getAbsolutePath();
if (!path.trim().isEmpty() && android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { testAndAdd(path, MountDeviceType.EXTERNAL_SD_CARD);
} // Получаем ремувабл
String rawSecondaryStoragesStr = System.

getenv(“SECONDARY_STORAGE”);
if (rawSecondaryStoragesStr != null && !rawSecondaryStoragesStr.isEmpty()) { // All Secondary SD-CARDs splited into array final String[] rawSecondaryStorages = rawSecondaryStoragesStr .split(File.

pathSeparator); for (String rawSecondaryStorage : rawSecondaryStorages) { testAndAdd(rawSecondaryStorage, MountDeviceType.REMOVABLE_SD_CARD); }
}

Вариант решения взят со stackoverflow. Ответ где-то там внизу.

Способ второй — mount

Так как у меня долго не получалось заставить систему мне сказать путь к удаляемой памяти, я решил искать в сторону примонтированных устройств. В системе есть файлы конфигурации, в которых описаны правила монтирования внешних устройств. Все бы хорошо, но на Android версии 4.

* к этому файлу простым смертным доступа нет, поэтому рассматривать этот способ не буду.

Вернемся к утилите mount. При запуске без параметров команда возвращает список смонтированных файловых систем. Удаляемые устройства имеют обычно формат файловой системы FAT, то будем выделять строки, в которых есть характеристика “fat“.

Внешняя память будет характеризоваться параметром “fuse“.

Примечание: при использовании такого способа не всегда корректно (скорее всего я что-то не учел) определяются типы смотнтированных устройств. Разницу замечал на разных версиях Android. Поэтому этот способ можно использовать как дополнительный.Функция fillDevicesProcesstry { Runtime runtime = Runtime.getRuntime(); proc = runtime.exec(“mount”); try { is = proc.

getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); while ((line = br.readLine()) != null) { if (line.contains(“secure”)) continue; if (line.contains(“asec”)) continue; if (line.contains(“fat”)) {// TF card String columns[] = line.split(” “); if (columns != null && columns.length > 1) { testAndAdd(columns[1], MountDeviceType.

REMOVABLE_SD_CARD); } } else if (line.contains(“fuse”)) {// internal(External) // storage String columns[] = line.split(” “); if (columns != null && columns.length > 1) { // mount = mount.concat(columns[1] + ”
“); testAndAdd(columns[1], MountDeviceType.EXTERNAL_SD_CARD); } } } } finally { … }
} catch (Exception e) { …
}

Вариант решения взят со stackoverflow.

Ответов там несколько примерно одинаковых.

Про дублирование

Многие замечали в директории монтирования устройств такую картину:/storage/sdcard0/
/storage/emulated/0/
/storage/emulated/legacy/

И что самое интересно, все это одна и та же внешняя карта памяти.

Такое дробление начинается с версии Jelly Bean и сделано это для поддержки многопользовательского режима работы системы. Более подробно тут. И вот, чтобы не получать одну и туже карту памяти как различные устройства, необходим способ определения идентичности.

Если бы был доступ к конфигурации монтирования, то и вопросов не было. Но доступа нет.

Поэтому я тут подсмотрел решение с расчетом хэша для каждого устройства:

  1. создаем StringBuilder
  2. записываем в него общий размер устройства и размер используемого пространства устройства
  3. обходим содержимое корня устройства
  4. записываем имя каталога
  5. записываем имя файла и размер
  6. вычисляем hash

Своя функция расчета хэша calcHashprivate int calcHash(File dir) { StringBuilder tmpHash = new StringBuilder(); tmpHash.append(dir.getTotalSpace()); tmpHash.append(dir.getUsableSpace()); File[] list = dir.listFiles(); for (File file : list) { tmpHash.append(file.getName()); if (file.isFile()) { tmpHash.append(file.length()); } } return tmpHash.toString().hashCode(); }

Пример использования

/* Получаем базовый путь */
if (!mPreferences.contains(PREFS_BASEBATH)) { // Если еще не сохранялся в настройках, то пытаемся найти карты // памяти ArrayList storages = StorageHelper.getInstance() .getRemovableMountedDevices(); // проверяем съемные карты памяти if (storages.size() != 0) { setBasePath(storages.get(0).

getPath() + mAppPath); } else if ((storages = StorageHelper.getInstance() // Проверяем // внутреннюю // память .getExternalMountedDevices()).size() != 0) { setBasePath(storages.get(0).getPath() + mAppPath); }
} else { // Вытаскиваем из сохранненых настроек mBasePath = mPreferences.getString(PREFS_BASEBATH, context .getFilesDir().

getParent());
}

Заключение

Подробные рассуждения по этому вопросу понимания памяти в Android, некоторые советы можно прочитать тут.

Исходный код всего класса расположен еще нигде не расположен. На днях постараюсь разместить на gitHub.

Кто еще какими способами пользуется?

UPD1: Исходный код класса на bitbucket

Источник: https://habr.com/post/254813/

Вопрос: Android: отображение изображения с SD CARD

Это сводит меня с ума! Вот мой код (я знаю, что этот файл существует):

File imageFile = new File(“/sdcard/gallery_photo_4.jpg”);
ImageView jpgView = (ImageView)findViewById(R.id.imageView);
BitmapDrawable d = new BitmapDrawable(getResources(), imageFile.getAbsolutePath());
jpgView.setImageDrawable(d);

Ошибка на этой последней строке (строка 28, приведенная ниже).

Выход ошибки:

W/dalvikvm( 865): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime( 865): FATAL EXCEPTION: main
E/AndroidRuntime( 865): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.camera/org.example.camera.Imgview}: java.lang.NullPointerException
E/AndroidRuntime( 865): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime( 865): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 865): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime( 865): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime( 865): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 865): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 865): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 865): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 865): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 865): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 865): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 865): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 865): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 865): at org.example.camera.Imgview.onCreate(Imgview.java:28)
E/AndroidRuntime( 865): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 865): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime( 865): … 11 more
W/ActivityManager( 59): Force finishing activity org.example.camera/.Imgview

Мой макет выглядит (возможно, не обязательно):

Большое спасибо за любую помощь.

15

2017-07-17 18:04

источник

Ответы:

Я предпочел бы использовать BitmapFactory для декодирования изображения из файла-пути:

Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
jpgView.setImageBitmap(bitmap);

Документы говорят:

Можете ли вы проверить, работает ли код с другим изображением, и если вы можете открыть свое изображение на ПК, подумайте. Возможно, файл поврежден.

31

2017-07-17 18:19

Этот код работал для меня наконец:

setContentView(R.layout.main); ImageView jpgView = (ImageView)findViewById(R.id.imageView); Bitmap bitmap = BitmapFactory.decodeFile(“/sdcard/sample-1.jpg”); jpgView.setImageBitmap(bitmap);

Сбой произошел, потому что setContentView () не выполнялся перед присоединением jpgview:

код, который сбой:

ImageView jpgView = (ImageView)findViewById(R.id.imageView); Bitmap bitmap = BitmapFactory.decodeFile(“/sdcard/sample-1.jpg”); jpgView.setImageBitmap(bitmap); setContentView(R.layout.main);

9

2018-03-01 02:50

String imagePath = Environment.getExternalStorageDirectory().toString() + PATH_TO_IMAGE;
return Drawable.createFromPath(imagePath)

7

2017-07-17 18:15

ИСПОЛЬЗУЙТЕ ЭТУ ЛИНИЮ КОДА ДЛЯ ПОЛУЧЕНИЯ ИЗОБРАЖЕНИЯ ИЗ SDCARD. И ТОГДА ОКАЗЫВАЙТЕ ЭТО В ВАШЕМ ИЗОБРАЖЕНИИ

где «FileInputOutput» – это папка на вашей SD-карте

String path = Environment.getExternalStorageDirectory()+ “/FileInputOutput/img1.jpg”; File imgFile = new File(path); if(imgFile.exists()) { Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); ImageView myImage = (ImageView) findViewById(R.id.imageView1); myImage.setImageBitmap(myBitmap); } else Toast.makeText(v.getContext(),”no IMAGE IS PRESENT'”,Toast.LENGTH_SHORT).show(); }

3

2017-10-08 14:06

Источник: http://www.programmerz.ru/questions/28310/android-display-image-from-sd-card-question

Как восстановить файлы на поврежденной карте памяти? [Восстановление фото и видео]

На данный момент, существует уже множество различных моделей — как телефонов, так и камер, поддерживаемых SD-карты. И эти самые карты памяти являются основным хранилищем данных и средством записи видео и фото документов.

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

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

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

Таким образом, на поврежденной карте памяти может находиться куча непонятных и нечитаемых файлов, которые, если судить по названию статьи, можно восстановить.

Что нужно для восстановления данных с карты памяти?

(восстанавливать мы будем фото и видео)

Для того, чтобы восстановить все файлы, или хотя бы частично, мы воспользуемся простым и быстрым способом. В интернете можно найти множество различных инструкций по поводу восстановления файлов, но в данной статье, мы разберем метод, который подойдет новичкам.

Воспользуемся мы интересной программой под названием ZAR X Systems recovery software. Полная версия этой программы является платной, но для нас подойдет и бесплатная версия, то есть, инструмент для восстановления данных находиться в демонстрационной версии и им можно воспользовался совершенно бесплатно.

Для начала, конечно, скачайте программу, по ссылке выше. Потом установите. Теперь следует убедится, что у Вас достаточно свободного места на жестком диске. Нужно это, как раз, для восстановления данных.

Если у Вас карта памяти на 8 Гб, то и на жестком диске у Вас должно быть свободно 8 Гб. Также, Вам нужно иметь при себе карт-ридер (считыватель карты памяти), чтобы мы могли подключить ее к компьютеру.

В ноутбуке обычно уже есть специальный встроенный слот.

Процесс восстановления

Кстати, все, что находится на карте памяти лучше не трогать и не переименовывать, чтобы восстановление прошло более успешно.

Теперь, подключите карту памяти к компьютеру, откройте ZAR X и выбираете восстановление изображений «Image Recovery».

Появится список дисков, в котором Вы выбираете повреждённую карту памяти, потом нажимаете кнопку Next.

Теперь нам нужно просто подождать пока программа просканирует флешку и приступит к восстановлению.

После того, как карта памяти про сканируется, можно будет выбрать, как восстанавливать – полно или частично.

Чтобы полностью восстановить все файлы, нужно отметить пункты – RAW и FAT, теперь нажмем Next.

Теперь указываем папку назначения и нажимаем Start copying. Начинается процесс восстановления.

Скорее всего не все файлы будут восстановлены, хотя процент восстановления довольно высокий 80-90%.
Теперь можно отформатировать карту памяти и использовать ее снова, перенеся туда восстановленные файлы.

https://computerinfo.ru/kak-vosstanovit-fajly-na-povrezhdennoj-karte-pamyati/https://i1.wp.com/computerinfo.ru/wp-content/uploads/2015/11/kak-vosstanovit-fajly-na-povrezhdennoj-karte-pamyati.jpg?fit=344%2C287&ssl=1https://i1.wp.com/computerinfo.ru/wp-content/uploads/2015/11/kak-vosstanovit-fajly-na-povrezhdennoj-karte-pamyati.jpg?fit=150%2C150&ssl=12015-11-16T18:05:48+00:00EvilSin225Восстановление и форматированиеZAR X Systems recovery software,восстановить microSD,восстановить карту памяти,восстановление SD-карты,как восстановить карту памятиНа данный момент, существует уже множество различных моделей – как телефонов, так и камер, поддерживаемых SD-карты. И эти самые карты памяти являются основным хранилищем данных и средством записи видео и фото документов. Практически любое устройство, в том числе и microSD не застрахованы от всевозможных сбоев и ошибок. Поэтому, большинство…EvilSin225Андрей Тереховandrei1445@yandex.ruAdministratorКомпьютерные технологии

Источник: https://computerinfo.ru/kak-vosstanovit-fajly-na-povrezhdennoj-karte-pamyati/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}