Можно ли получить доступ к микрофону
Содержание статьи
Как настроить доступ к микрофону и веб-камере
1. Настройка микрофона
2. Настройка веб-камеры
Сбой в проверке подключения микрофона может быть связан с разными причинами:
- Звук микрофона отключён или слишком тихий, нужно повысить громкость.
- Микрофон отключён в настройках компьютера (операционной системы), нужно подключить микрофон.
- Микрофон не работает — попробуйте подключить другой микрофон.
- У браузера нет разрешения на доступ к микрофону и камере. Обновите страницу тестирования и нажмите «Разрешаю», когда система запросит доступ к веб-камере и микрофону. Если обновление страницы не помогает, возможно, запрет доступа сохранён в настройках браузера. На этот случай мы подготовили короткие подсказки — выберите свой браузер и следуйте инструкциям:
Что делать, если запрет доступа к микрофону сохранился в настройках Яндекс.Браузера
- Откройте меню в правом верхнем углу и выберите пункт «Настройки»:
- На открывшейся вкладке с настройками выберите пункт «Сайты»:
- Кликните на «Расширенные настройки сайтов»:
- Прокрутите меню до пункта «Доступ к микрофону» и кликните «Настройки сайтов»:
- В открывшемся окне «Доступ к микрофону» выберите вкладку «Запрещен» и в списке сайтов кликните на строчку с адресом proctoring.expert.yandex.net, а затем на «Удалить». Таким же образом удалите из этого списка адрес yandex.ru:
- Закройте вкладку с настройками и вернитесь на страницу теста. Обновите её и начните авторизацию заново.
Что делать, если запрет доступа к микрофону сохранился в настройках Chrome
- Откройте меню в правом верхнем углу и выберите пункт «Настройки»:
- Прокрутите открывшуюся страницу с настройками до кнопки «Дополнительные» и кликните на него:
- Кликните «Настройки сайта»:
- В списке «Разрешения» зайдите в раздел «Микрофон»:
- На открывшейся странице в списке заблокированных сайтов выберите адрес yandex.ru и кликните на значок корзины, чтобы удалить его из списка:
- Если в списке запрещённых сайтов помимо yandex.ru вы видите адрес proctoring.expert.yandex.net, удалите оба этих сайта из списка:
- Закройте вкладку с настройками и вернитесь на страницу теста. Обновите её и начните авторизацию заново.
Если во время проверки оборудования системе не удаётся получить доступ к веб-камере, это может быть связано с одной из следующих причин:
- Камера отключена в настройках компьютера (операционной системы), нужно подключить камеру.
- В настройках компьютера выбрана другая камера. Проверьте настройки компьютера.
- Камеру используют другие приложения. Нужно проверить приложения, которые могут использовать веб-камеру, и отключить их на время тестирования.
- У браузера нет разрешения на доступ к веб-камере. Обновите страницу тестирования и нажмите «Разрешаю», когда система запросит доступ к веб-камере и микрофону. Если обновление страницы не помогает, возможно, запрет доступа сохранён в настройках браузера. На этот случай мы подготовили короткие подсказки — выберите свой браузер и следуйте инструкциям:
Что делать, если запрет доступа к камере сохранился в настройках Яндекс.Браузера
- Откройте меню в правом верхнем углу и выберите пункт «Настройки»:
- На открывшейся вкладке с настройками выберите раздел «Сайты»:
- Войдите в «Расширенные настройки сайтов»:
- В пункте «Доступ к камере» кликните на «Настройки сайтов»:
- В открывшемся окне «Доступ к микрофону» выберите вкладку «Запрещен» и в списке сайтов кликните на строчку с адресом proctoring.expert.yandex.net, а затем на «Удалить». Таким же образом удалите из этого списка адрес yandex.ru:
- Закройте вкладку с настройками и вернитесь на страницу теста. Обновите её и начните авторизацию заново.
Что делать, если запрет доступа к камере сохранился в настройках Chrome
- Откройте меню в правом верхнем углу и выберите пункт «Настройки»:
- Прокрутите открывшуюся страницу с настройками до кнопки «Дополнительные» и кликните на него:
- Кликните «Настройки сайта»:
- В списке «Разрешения» зайдите в раздел «Камера»:
- На открывшейся странице в списке заблокированных сайтов выберите адрес yandex.ru и кликните на значок корзины, чтобы удалить его из списка:
- Если в списке запрещённых сайтов помимо yandex.ru вы видите адрес proctoring.expert.yandex.net, удалите оба этих сайта из списка:
- Закройте вкладку с настройками и вернитесь на страницу теста. Обновите её и начните авторизацию заново.
Источник
Камера, микрофон и конфиденциальность в Windows 10
При наличии в вашем устройстве камеры и микрофона Windows 10 позволяет вам совершать видеовызовы Skype, снимать фотографии, записывать видео и многое другое. Многие приложения и службы требуют наличия камеры или микрофона и используют ее, а параметры Windows позволяют управлять списком приложений, которые могут использовать камеру или микрофон.
Некоторые пользователи опасаются, что незнакомые приложения, компании или вредоносные программы могут использовать камеру или микрофон их устройств. Использование камеры или микрофона должны контролировать вы. Чтобы помочь вам понять, когда камера включена, предоставляются следующие индикаторы.
Если устройство оснащено камерой с подсветкой, то во время использования камеры загорается подсветка.
Если устройство не оснащено подсветкой камеры, то при включении или отключении камеры отображается соответствующее уведомление.
Чтобы помочь вам понять, когда микрофон используется, предоставляются следующие индикаторы.
В области уведомлений на панели задач будет отображаться значок микрофона. Этот индикатор можно включить или отключить, перейдя кпараметрам > параметры > Персонализация > панели задач и выбрав команду выбрать значки, которые будут отображаться на панели задач.
Вы также можете узнать, какие приложения в настоящее время используют камеру или микрофон или недавно обращались к камере или микрофону, перейдя > Параметры > Конфиденциальность > Камера или Пуск > Settings > Конфиденциальность > микрофон.
Примечание: Эта функция не существует в Windows 10 версии 1809 и более ранних версиях.
Ниже описываются параметры, которые позволяют контролировать использование камеры.
Элементы управления параметрами камеры или микрофона могут быть уже отключены, если вы используете устройство, выданное вам на работе, или если вы добавили рабочую учетную запись в собственное устройство. В этом случае в верхней части страницы параметров камеры или микрофона появится заголовок Некоторые параметры управляются организацией.
Три типа камер
В зависимости от того, какими камерами оснащено устройство, существует три типа камер, к которым могут получить доступ приложения и службы.
Цветная камера используется для съемки стандартных цветных фотографий и видео.
Инфракрасная камера позволяет снимать фото и видео в оттенках серого (черно-белые фотографии и видео) на основе интенсивности инфракрасного излучения.
Камера глубины распознает контуры объектов перед ней и расстояние от них до устройства. Например, камеру глубины можно использовать для определения того, когда человек находится перед устройством.
Управление списком приложений Microsoft Store, имеющих доступ к камере
Перейдите в раздел пуск > Параметры > Конфиденциальность > камерой.
Укажите необходимое значение для параметра Разрешить приложениям доступ к камере.
В разделе Выберите приложения, которые могут получать доступ к камеревключите или отключите отдельные параметры для приложений.
Дополнительные сведения о том, как управлять параметрами конфиденциальности камеры, можно найти в этом видеоролике.
Примечание: Даже если вы отключите камеру для каждого приложения в разделе Выберите приложения, которые могут получать доступ к камере, некоторые из перечисленных приложений все равно смогут открывать камеру для съемки фото или видео. Однако камера не будет производить запись изображений и видео, пока вы не нажмете кнопку Фото или Видео.
Управление списком приложений Microsoft Store, имеющих доступ к микрофону
Перейдите в раздел пуск > Параметры > Конфиденциальность > микрофона.
Укажите необходимое значение для параметра Разрешить приложениям доступ к микрофону.
В разделе Выберите приложения, которые могут получать доступ к микрофонувключите или отключите отдельные параметры для приложений.
Как разрешить веб-сайту использовать камеру или микрофон при просмотре веб-страниц в Microsoft Edge?
При просмотре веб-сайтов в Microsoft Edge можно использовать камеру и микрофон. Однако, даже когда камера и микрофон включены для Microsoft Edge, будет необходимо по-прежнему предоставлять разрешение отдельным веб-сайтам на использование камеры и микрофона. Вот как это сделать.
Перейдите на веб-сайт, который хочет использовать микрофон и (или) камеру.
Если отобразится диалоговое окно с запросом на предоставление разрешения веб-сайту использовать вашу камеру или микрофон, выберите Разрешить однократно или Всегда разрешать или закройте диалоговое окно, чтобы блокировать доступ.
Как запретить веб-сайту использовать камеру или микрофон при просмотре веб-страниц в Microsoft Edge?
В Microsoft Edge выберите Параметры и другие , а затем нажмите кнопку Параметры.
Выберите Дополнительные параметры, а затем в разделе Разрешения для веб-сайта выберите пункт Управление разрешениями.
Выберите веб-сайт, которым требуется управлять.
В разделе Камера или Микрофон установите переключатель в положение Выкл, чтобы отключить доступ для этого веб-сайта.
Примечание: Некоторые веб-сайты могут не работать, если вы заблокируете для них доступ к камере и микрофону. Например, у вас может не получиться присоединяться к видеоконференции.
Исключения для параметров конфиденциальности камеры и микрофона
Если вы включите функцию Windows Hello, она будет использовать камеру для вашей идентификации, даже если параметр Разрешить приложениям доступ к камеревыключен. Если функция Windows Hello отключена, у нее нет доступа к камере. (Функция Windows Hello в Windows 10 — это новый способ входа в ваши устройства, приложения, веб-службы и сети.)
Начиная с Windows 10 версии 1903 на страницах параметров камеры и микрофона можно получить доступ к дополнительным параметрам, предоставляющим ограниченный контроль над классическими приложениями, которые обращаются к камере и микрофону с помощью поддерживаемых методов. Этот параметр можно найти в разделе Разрешить классическим приложениям доступ к камере или Разрешить приложениям доступ к микрофону. Здесь вы найдете список классических приложений, обнаруженных Windows, которые взаимодействовали с камерой или микрофоном. При включении или отключении параметра будут затронуты все приложения, указанные в этом разделе.
Примечания:
Вы можете выбрать любое из приложений, чтобы получить подробные сведения о конкретном файле на устройстве, который обращался к камере или микрофону.
Если вы используете приложение или компонент Windows, который использует камеру или микрофон прямо через компонент Windows, вместо него вы увидите компонент Windows, указанный в списке. Например, если вы взаимодействуете с Кортаной с помощью микрофона, вы увидите сообщение «исполняемый файл речевой среды».
Если отключить параметр Разрешить классическим приложениям доступ к камере или Разрешить классическим приложениям доступ к микрофону, вы сможете запретить некоторым компонентам Windows использовать камеру или микрофон, например Кортане или компоненту диктовки Windows.
Классические приложения могут не всегда отображаться в списке доступных приложений на страницах параметров камеры и микрофона или могут по-прежнему иметь доступ к камере или микрофону, даже если эти параметры отключены. Узнать причину
Источник
Как получить доступ к камере и микрофону Android телефона.
Перехват информации всегда был в тренде и по множеству шпионких фильмов мы не раз видели как спец службы могут подключится к любому мобильному устройству. На самом деле это задача очень не простая и по просочившимся в прессу кейсам мы понимаем что это могут позволить себе далеко не рядовые полицейские. А если посмотреть с другой стороны? Могут ли хакеры сделать тоже самое? Как показывает практика иследования уязвимости StrandHogg в Android это вполне осуществимая задача. О том как получить доступ к камере и микрофону телефона сегодня и пойдет речь.
StrandHogg — уязвимость с «подменой» приложений
The StrandHogg vulnerability — подробности нашумевшей уязвимости всех версий Android (включая 10), позволяющей подменить экран (активность) одного приложения на экран другого.
Что произошло: специалисты норвежской компании n обнаружили в Android уязвимость, которая позволяет подменить экран (активность) легитимного приложения, подсунув вместо нее экран зловредного приложения. В результате у злоумышленников появляется возможность провести атаку с использованием фишинга или, например, запросить для зловредного приложения дополнительные полномочия якобы от лица другого приложения.
Что произошло на самом деле: в Android у активностей есть флаг taskAffinity. Он позволяет указать имя задачи (task), в стек активностей которой попадет указанное приложение. Это нужно для более тонкого управления стеками обратных переходов. Но есть одна проблема: по умолчанию значение taskAffinity равно имени пакета приложения, а это значит, что в ряде случаев можно незаметно всунуть активность своего приложения в стек активностей чужого. А если еще и указать флаг allowTaskReparenting=»true», эту активность можно передвинуть на самый верх и при следующем клике по иконке целевого приложения она появится на экране первой (то есть будет находиться на вершине стека).
Страшно? Конечно, но, как и обычно, стоит копнуть глубже — и страх пройдет.
Во-первых, об этой «уязвимости» известно уже много лет. Предыдущая ее вариация называлась Android Task Hijacking.
Во-вторых, эксплуатация уязвимости требует, чтобы и зловредное приложение, и приложение-жертва были уже запущены. Последовательность действий пользователя должна быть такой: он запускает приложение-жертву, возвращается на рабочий стол, затем запускает зловредное приложение, затем снова запускает приложение-жертву. В этот момент вместо холодного запуска Android просто показывает самую «верхнюю» активность в стеке, а ей оказывается активность зловредного приложения.
В-третьих, Google действительно отказывается исправлять уязвимость на протяжении нескольких лет. Просто потому, что это так называемый de flaw, то есть ошибка проектирования, исправление которой сломает существующий софт.
Наконец, в-четвертых, у проблемы уже давно есть решение. Достаточно указать taskAffinity=»» в элементе Application, и все активности твоего приложения станут неуязвимы к атаке.
Мораль: не читайте советских газет, читайте доки по безопасности.
Обход защиты на снятие скриншотов
Android Frida hooking: disabling FLAG_SECURE — статья о том, как с помощью Frida отключить защиту на снятие скриншота приложения.
Кратко: Android позволяет разработчику приложения запретить снимать скриншоты определенных активностей приложения. Для этого необходимо установить флаг FLAG_SECURE для окна:
public class FlagSecureTestActivity extends Activity { @Override public void onCreate(Bundle savedInstancee) { super.onCreate(savedInstancee); getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); setContentView(R.layout.main); … } }
Обойти эту защиту можно несколькими способами. Например, использовать модуль Xposed DisableFlagSecure, который перехватывает функцию setFlags и просто отфильтровывает флаг FLAG_SECURE:
@Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { XposedHelpers.findAndHookMethod(Window.class, «setFlags», int.class, int.class, mRemoveSecureFlagHook); } private final XC_MethodHook mRemoveSecureFlagHook = new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Integer flags = (Integer) param.args[0]; flags &= ~WindowManager.LayoutParams.FLAG_SECURE; param.args[0] = flags; } };
Однако Xposed требует права root на устройстве (есть проект VirtualXposed, не требующий root, но многие модули в нем не работают). Frida, с другой стороны, может работать на любом устройстве без необходимости получать права root.
Вот как выглядит тот же код отключения в варианте для Frida:
Java.perform( () { var FLAG_SECURE = 0x2000; var Window = Java.use(«android.view.Window»); var setFlags = Window.setFlags; setFlags.implementation = (flags, mask) { console.log(«Disabling FLAG_SECURE…»); flags &= ~FLAG_SECURE; setFlags.call(this, flags, mask); }; });
Использовать так:
$ frida -U -l наш_скрипт.js -f имя.пакета.приложения —no-pause
Обход ограничения на доступ к камере, микрофону и местоположению в фоне
Androids Invisible Foreground Services and How to (Ab)use Them — доклад с конференции Black Hat Europe 2019 с описанием очень простой техники обхода защиты на доступ к камере, микрофону и местоположению в Android 9 и 10.
Проблема: в Android 9 появилось ограничение на доступ к камере и микрофону, если в данный момент приложение находится в фоне. В Android 10 добавилось ограничение на доступ к местоположению с возможностью выбрать, хочет ли пользователь, чтобы приложение могло получать координаты, только пока видимо на экране, или в фоне тоже.
Исключение дается только приложениям, имеющим активный foreground-сервис, который, в свою очередь, обязан вывести видимое пользователю уведомление и иконку в строке состояния.
Если мы хотим создать гипотетическую малварь, лучше оставаться скрытными и никаких уведомлений не показывать. Но как это сделать?
Решение: начиная с пятой версии в Android есть механизм JobScheduler, который позволяет запускать код периодически или при наступлении определенных событий (например, подключение к зарядному устройству). Мы могли бы использовать его для периодического запуска наших шпионских функций, но задачи JobScheduler’а тоже выполняются в фоне.
Выход состоит в том, чтобы при наступлении события JobScheduler’а запустить сервис, затем сделать его foreground-сервисом с помощью startForeground, быстро получить доступ к камере, микрофону и местоположению и остановить сервис:
@Override public int onStartCommand(Intent intent, int flags, int startId){ Notification notification = createCustomNotification(); this.startForeground(1, notification) accessMicrophone(); stopForeground(true); return START_STICKY; }
Трюк состоит в том, что, если сделать работу достаточно быстро (по утверждению автора доклада — за пять секунд), система просто не покажет уведомление.
Proof of concept есть на GitHub. Баг уже исправлен, теперь уведомление будет показано в любом случае.
Разработчику
Хорошие и плохие приемы программирования на Kotlin
Good And Bad Practices Of Coding In Kotlin — статья о практиках программирования на Kotlin, хороших и плохих.
Первый пример
fun main { val file = File(«/my_file») val writer = file.Writer() try { writer.ln(«Hello World») } catch(__: Exception){ // Обработка исключения } finally { writer.close() } }
Это стандартный способ записи строки в файл: открываем файл и с помощью Writer записываем строку. В завершение закрываем Writer даже в том случае, если будет выброшено исключение.
Этот код можно переписать так:
fun main () { val file = File(«/my_file») file.Writer().use { it.ln(«Hello World») } }
В случае с объектами, реализующими интерфейс Closeable (здесь Writer), функция-расширение use автоматически вызывает метод close после выполнения кода лямбды.
Второй пример
val list = listOf(«Ahsen», «Bob», «Alex», «Jasmine») val anotherList = listOf(1, 2, 3, 4) fun main() { val size = list.size for(i in 0..size) ln(«Name -> ${list[i]} and number -> ${anotherList[i]}») }
Этот код проходит в цикле сразу по двум спискам. Но в нем есть одна проблема: если второй список будет длиннее первого, приложение упадет с исключением ArrayIndexOutOfBoundsException.
Kotlin позволяет решить эту проблему и заодно сделать код гораздо более элегантным:
val list = listOf(«Ahsen», «Bob», «Alex», «Jasmine») val anotherList = listOf(1, 2, 3, 4, 5, 6, 7) fun main() { for((name, number) in list.zip(anotherList)) ln(«Name -> $name and number -> $number») }
Метод zip создает набор пар (pair), где первый элемент пары — значение из первого списка, второй элемент — значение из второго с тем же индексом. В этом примере пара автоматически раскладывается на переменные name и number с помощью деструктивного оператора.
Третий пример
val firstList = listOf(«Ahsen», «Bob», «Alex», «Jasmine») val secondList = listOf(«Ahsen», «Jack», «Alen», «Jasmine») fun main() { val result = mutableListOf<String>().apply { addAll(secondList) } for(name in firstList) if(!secondList.contains(name)) result.add(name) ln(result) }
Данный код объединяет два однотипных списка так, чтобы их значения не повторялись. Но в Kotlin у списков есть метод union, предназначенный именно для этого:
val firstList = listOf(«Ahsen», «Bob», «Alex», «Jasmine») val secondList = listOf(«Ahsen», «Jack», «Alen», «Jasmine») fun main() { val result = firstList.union(secondList) ln(result) }
Четвертый пример
const val NAME = «Ahsen» val x = NAME as Int fun main() { ln(x) }
Данный код выбросит исключение ClassCastException, потому что константа NAME имеет тип не Int. Чтобы такого не происходило, можно использовать оператор as?:
const val NAME = «Ahsen» val x = NAME as? Int fun main() { ln(x) }
Если приведение типов будет невозможно, переменная x получит значение null.
Typealias в Kotlin
Maintaining crisp code with type aliases — заметка о ключевом слове typealias, которое можно использовать для назначения произвольных имен различным типам данных.
Представим, что у нас есть список юзеров List<User>. Использовать его в коде неудобно, автодополнение работает плохо. Поэтому мы хотели бы придумать для него более простое имя.
Традиционный способ сделать это — завернуть список в класс:
data class Users(val userList: List<User>)
Но в Kotlin есть более простой и лишенный оверхеда вариант:
typealias Users = List<User>
Typealias не вводит новый тип данных и не создает классов, это просто второе имя для определенного типа данных. Его можно использовать не только для сокращения записи, но и для разделения неймспейсов, если несколько пакетов содержат классы с одинаковыми именами.
Другие полезные примеры использования typealias:
Более наглядный способ объявления лямбд:
typealias Result<T> = (T) -> Unit fun fetchData(callback: Result<String>)
Маркировка nullable-типов:
typealias MaybeBook = Book?
Быстрый доступ к вложенным классам:
typealias DialogBuilder = AlertDialog.Builder val dialog = DialogBuilder().build()
Инлайновые классы в Kotlin
Low-over wrappers using inline classes — заметка, рассказывающая, как использовать инлайновые классы Kotlin, чтобы защититься от ошибок и улучшить читаемость кода.
Представим, что у нас есть такая функция:
fun renderLocation(latitude: Double, longitude: Double) { map.render(latitude, longitude) }
На первый взгляд все хорошо, но есть проблема: что, если ты случайно передашь ей долготу вместо широты и широту вместо долготы? Они обе имеют тип Double, поэтому у компилятора не будет возможности предупредить тебя об ошибке.
Помогут классы-врапперы:
class Latitude(val value: Double) class Longitude(val value: Double) fun renderLocation(latitude: Latitude, longitude: Longitude) { map.render(latitude, longitude) }
Но так ты получишь оверхед, компилятору придется создать, по сути, два лишних объекта и выделить для них память в хипе.
Для решения этой проблемы в Kotlin 1.3 появились так называемые инлайновые классы:
inline class Latitude(val value: Double) inline class Longitude(val value: Double) fun renderLocation(latitude: Latitude, longitude: Longitude) { map.render(latitude, longitude) }
Теперь компилятор сможет автоматически заменить все использования объектов классов Latitude и Longitude на Double. Вот так будет выглядеть функция renderLocation, декомпилированная в Java:
public ic final void renderLocation-vKZqJUM(double latitude, double longitude) { map.render-vKZqJUM(latitude, longitude); }
Обрати внимание на -vKZqJUM в конце имени функции. Это хеш, который добавляет компилятор ко всем функциям, принимающим инлайновые классы в качестве аргументов. Он нужен, чтобы в коде случайно не появились две одинаковые функции с одинаковыми аргументами (например, если ты создаешь еще одну функцию renderLocation с двумя аргументами типа Double).
Корректное выделение текста на фоне
Contrasting text and icons over background — статья о том, как сделать текст и иконки читаемыми на разном фоне. Автор предлагает алгоритм автоматического выбора темного или светлого цвета текста в зависимости от используемого фона.
Для начала создадим простую функцию-расширение для определения «уровня темности» фона:
fun @receiver:ColorInt Int.isDark(): Boolean = ColorUtils.calculateLuminance(this) < 0.5
Функция использует класс ColorUtils из библиотеки androidx.core и возвращает true, если фон достаточно темный, чтобы белый текст на нем читался хорошо.
Использовать эту функцию можно так:
val color = Color.parseColor(«#e91e63») if (color.isDark()) { colorHex.setTextColor(R.color.white) favIcon.setImageResource(R.drawable.ic_favorite_border_white_24dp) } else { colorHex.setTextColor(R.color.black) favIcon.setImageResource(R.drawable.ic_favorite_border_black_24dp) }
Здесь color — это цвет фона, а colorHex и favIcon — текстовый виджет и виджет иконки. Если цвет темный, текст и иконка окрашиваются в белый, иначе — в черный.
Но что, если в качестве фона используется картинка? В этом случае мы можем извлечь из картинки наиболее значимые цвета (палитру) с помощью класса Palette и проверить их яркость с помощью функции isDark:
Palette.from(bitmap) .maximumColorCount(3) .clearFilters() .setRegion(bitmap.width — iconSize , 0, bitmap.width, iconSize) .generate { palette -> val lightness = ColorUtils.isDark(palette) val isDark = if (lightness == ColorUtils.LIGHTNESS_UNKNOWN) { ColorUtils.isDark(bitmap, bitmap.width — iconSize / 2, iconSize / 2) } else { lightness == ColorUtils.IS_DARK } if (isDark) { // Make back icon dark on light images favIcon.setImageResource(R.drawable.ic_favorite_border_white_24dp) } else { favIcon.setImageResource(R.drawable.ic_favorite_border_black_24dp) } }
Предполагается, что мы размещаем нашу иконку в правом верхнем углу картинки, поэтому с помощью функции setRegion указываем правый верхний угол. Затем с помощью ColorUtils.isDark мы выясняем, темная ли это палитра. Если выяснить это не удалось, пробуем определить яркость отдельно взятого пикселя посередине интересующей нас области. Затем мы меняем цвет иконки в зависимости от полученных результатов.
Стоит отметить, что в стандартном классе ColorUtils из пакета androidx.core нет метода isDark. В данном примере используется класс ColorUtils из проекта Plaid.
Статистика распределения версий Android
В мае этого года Google перестала публиковать статистику по версиям Android. Однако PornHub исправил этот недочет, опубликовав собственную статистику.
Что следует иметь в виду при изучении этих данных:
- Статистика Google покрывает все устройства, которые так или иначе подключались к Google Play. Среди этих устройств есть множество «звонилок», старых смартфонов, которые люди продолжают использовать спустя много лет после релиза. Ведь звонить, писать и просматривать сводку погоды можно с комфортом и на устройстве десятилетней давности.
- Статистика PornHub, кроме устройств с сервисами Google, также покрывает несертифицированные устройства и устройства с кастомными прошивками, но без сервисов Google.
- Основная масса пользователей PornHub — люди в возрасте от 18 до 34 лет (данные из той же статистики). Другими словами, это те самые «активные» пользователи смартфонов, которые регулярно покупают новые устройства.
Инструменты
- Android Malware Sandbox — виртуальная машина для быстрого запуска малвари.
Библиотеки
- Keigen — быстрая библиотека линейной алгебры;
- Extensions-list — список всех функций-расширений, доступных в библиотеках Android-KTX;
- Store — библиотека для загрузки, кеширования и обновления данных из сети;
- Tinker — библиотека для обновления кода и ресурсов приложения без обновления всего пакета;
- FlowBinding — аналог RxBinding на основе Kotlin Flow;
- AestheticDialogs — различные виды диалогов;
- Flourish — библиотека для показа/скрытия лайотов с анимацией;
- MaterialDiadroid — библиотека для создания диалогов в стиле Material De;
- ParallaxingView — галерея с эффектом параллакса.
Click to rate this post!
[Total: 2 Average: 5]
Источник