Android: скриншот с помощью adb

На девайсе под управлением Android сделать скриншот статического (!) изображения можно скопировав информацию из фреймбуфера:

adb pull /dev/graphics/fb0 fb.bgra

Расширение bgra нужно для convert из набора ImageMagick, что бы он мог понять каков порядок ARGB. Я пробовал снимать скриншоты на девайсе от Sony, там порядок был BGRA. Возможно он таков на всех устройствах.

В цикле снимать скриншоты можно так:

while [ 1 ] ; do adb pull /dev/graphics/fb0 fb-`date +"%H-%M-%S"`.bgra ; sleep 1 ; done

Конвертация:

convert -size 480x854 -depth 8 fb-*.bgra screenshot-%05d.png

iOS: Invalid Image Path

Вот с такой “CFBundleIcons: AppIcon 120×120 not found” ошибкой столкнулся сегодня при попытке выгрузить новую версию игры в AppStore. Проблема была в “а возьму-ка я этот iconset-темплейт и с его помощью нагенерю иконки”. Темплейт хороший, умеет все нужные иконки. И даже на одну больше, чем мне нужно. Вот из-за нее и была проблема.

Решается просто. В Project navigator кликаем на ресурс Images.xcassets, выбираем AppIcon, удаляем иконку из слота CarPlay iOS 8 120pt. Все, проблема решена.

Android: завершение приложения

Для “завершения” приложения на Android я раньше делал finish() из Activity и exit() из NDK.
Это далеко не лучший, хотя и кардинально чистящий вариант.

После некоторых раздумий решил завершать apploop и дергать из Activity “хоум скрин”:

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startMain);

iOS: определение версии ОС

Эти макросы позволяют без усилий и лишнего кода определять версию iOS:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Использовать можно так:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    // iOS 7.0+ specific code
}

Этот способ лучше способа с float, поскольку с его помощью можно детектить и вот такой формат 6.1.3.

if([[[UIDevice currentDevice] systemVersion] floatValue] > 6.13)
{
    // iOS 6.13
}

Перезагрузка iOS-устройства

Если во время отладки зависнет “ай”-девайс и перестанет реагировать на любые внешние воздействия, то перерзагрузить устройство можно удерживая кнопки Home и Power.

Симптомы такие: черный экран, горит подсветка, девайс не реагирует на нажатия кнопок, но iTunes его видит. Xcode ругается “process launch failed: launch or suspend in progress”.

Сортировка изображений по их EXIF

Простой способ сортировки свалки изображений по EXIF:

exiftool '-Directory<CreateDate' -d sorted/%Y-%m-%d -r unsorted/

Наверняка такая утилита есть в репозитории всех дистрибутивов. Обитает она тут – http://www.sno.phy.queensu.ca/~phil/exiftool/

Samsung Galaxy Nexus и Android 4.2.x

Samsung Galaxy Nexus Под этой маркой идет много разных смартфонов, которые отличаются id и, соответственно, поставщиком обновления. Больше никаких различий нет. Определить по стране приобретения или по надписям на коробке поставщика обновлений нельзя. Более того, этот id нельзя посмотреть штатными средствами – нужна сторонняя утилита (тысячи их в маркете).

Мне не повезло и достался мне девайс с поставщиком от Samsung (id девайса yakjuxw), который позволил мне обновиться аж до android 4.1.1. Все, на этом Samsung свою задачу посчитал выполненной.
На днях вышло обновление до 4.2.2 и мне ну очень захотелось получить его тоже. Всяческие танцы с бубном, которые якобы позволяют уговорить Samsung прислать мне обновление не прокатывают.
Под руку попалась документация и ссылки на оригинальные образы от Google. Почитал, решился, обновился.

Итак, документация и ссылка на нужный образ – https://developers.google.com/android/nexus/images
Для установки оригинальной прошивки нужно разлочить бутлоадер (как два пальца обос-ть) – https://source.android.com/source/building-devices.html
После этого из того же фастбута заливается оригинальная прошивка (я залил 4.1.2, но можно было и сразу залить 4.2.2) и уже по воздуху ставится обновление.

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

Все действия делал из-под Linux.

Android video capture

Для снятия скриншотов купил Screencast Video Recorder. Дополнительно к $3.99 USD с меня сняли $1.00 USD. Хз, почему и за что.
Странно работает удаление сделанных видео – файл удаляется, но в списке тут же появляется запись об этом файле. В демо-версии такого глюка не было.
Пишет видео в контейнер mp4, какой кодек используется я еще не смотрел.

p.s. Для работы приложения нужны права root.

Next POT

Вычисление следующего Power of Two без использования цикла.

unsigned int nextPOT(unsigned int x)
{
    x = x - 1;
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >> 16);
    return x + 1;
}
1 2 3 4 5 21