- Android studio call recorder
- Создание собственного Android-диктофона с помощью Kotlin
- Создание пользовательского интерфейса
- Запрос требуемых разрешений
- Запись и сохранение аудио
- Добавление OnClickListeners
- Настройка MediaRecorder
- Запись и сохранение аудио
- Исходный код
- Заключение
- Запись разговоров на Android
- Закон
- Телефон
- Танцы с бубном
- Запись через ядро
- Запись через стандартные API Android’a
- Полный список
- Пишем свой Dialer для Android и работаем со звонками на низком уровне
- Содержание статьи
- Linux для хакера
- А где у него кнопочки?
- Принимаем первый звонок
- Принимаем второй звонок
- Положи трубку!
- Липкий список Google
- Перезваниваем
- Ода манифесту
- Заключение
Android studio call recorder
Полный текст статьи и исходники программы доступны только зарегистрированным участникам сайта.
Прочитайте внимательно условия! В начале каждой статьи указывается, к какому курсу относится данная статья. Например, если статья из 4 курса, значит нужно заплатить за все курсы по четвёртый включительно.
Стоимость регистрации — символические 350 рублей. После регистрации у вас будет доступ ко второму курсу.
Для регистрации сначала необходимо пополнить ЮMoney(бывший Яндекс.Кошелек) 410011383280263 на указанную сумму (или Webmoney-кошелек P894989790291 (старый R390884954122) или QIWI (перевод по никнейму), а затем прислать письмо на адрес alexander.klimoff@gmail.com с указанием, на какой кошелёк вы делали оплату и реквизиты, по которым можно вас определить (не прикрепляйте к письму картинки или файлы). Учитывайте комиссию при переводах.
Не присылайте в письме мои номера кошельков — поверьте, я их знаю и без вас.
В ответном письме вы получите учётные данные для чтения статей из закрытой зоны за второй курс.
Доступ к третьему курсу обучения доступен только после оплаты второго курса и составляет 350 руб.
Доступ к четвёртому курсу обучения доступен после оплаты третьего курса и составляет 350 руб. и т.д.
При оплате сразу всех курсов одновременно (2-9) цена составит 2800 руб.
Доступ даётся как минимум на один год. Для тех, кто оплатил третий и другие курсы, сроки доступа увеличиваются.
Также возможен приём на PayPal (только для зарубежных пользователей). Обратите внимание, что в этом случае стоимость одного курса составляет 7$.
Источник
Создание собственного Android-диктофона с помощью Kotlin
Мультимедийный фреймворк Android поддерживает запись и воспроизведение аудио. В этой статье я покажу, как разработать простое приложение для звукозаписи, которое будет записывать аудио и сохранять его в локальном хранилище Android-устройства с помощью MediaRecorder из Android SDK.
Вы также узнаете, как запросить разрешения у пользователя в режиме реального времени и как работать с локальным хранилищем Android-устройства.
Создание пользовательского интерфейса
Сперва нам нужно создать интерфейс для звукозаписи. Это простой layout с тремя кнопками, которые будут использоваться для запуска, приостановки/возобновления и остановки записи.
Запрос требуемых разрешений
После создания пользовательского интерфейса мы можем начать использовать MediaRecorder для реализации основной функциональности нашего приложения. Но сначала нам нужно запросить необходимые разрешения для записи аудио и доступа к локальному хранилищу. Cделаем мы это это с помощью нескольких простых строк кода в нашем файле AndroidManifest.xml :
Также нужно проверить, одобрил ли пользователь разрешения, прежде чем мы сможем использовать наш MediaRecorder . Сделаем это в Activity MainActivity.kt :
Примечание: позже эти строки кода будут перемещены в OnClickListener кнопки начала записи аудио, чтобы мы могли убедиться, что MediaRecorder не будет запущен без необходимых разрешений.
Запись и сохранение аудио
Добавление OnClickListeners
Добавим слушатели к кнопкам, чтобы они реагировали на пользовательские события. Как я упоминал ранее, проверка на наличие необходимых разрешений будет добавлена в OnClickListener кнопки начала записи аудио:
Настройка MediaRecorder
Далее нам нужно указать путь для сохранения аудио и настроить MediaRecorder.
Мы берём путь к корню нашего внешнего хранилища и добавляем в него имя нашей записи и тип файла. После этого мы создаём объект MediaRecorder и определяем источник звука, аудиокодер, формат и файл для записи.
Запись и сохранение аудио
Код, используемый для запуска MediaRecorder , определяется в OnClickListener кнопки начала записи аудио:
Как видите, нужно вызвать функцию prepare , прежде чем мы сможем начать запись. Мы также встраиваем вызов в блок try-catch, чтобы приложение не сломалось при сбое функции prepare .
OnClickListeners кнопки остановки записи очень похож на код выше.
Здесь мы проверяем, работает ли в данный момент MediaRecorder , прежде чем мы остановим запись, потому что наше приложение сломается, если метод stop будет вызван, в то время как MediaRecorder не будет запущен. После этого мы меняем переменную состояния на false , чтобы пользователь не мог снова нажать кнопку остановки.
Нам осталось определить OnClickListener для кнопки приостановки/возобновления.
В этих двух методах мы проверяем, работает ли MediaRecorder . Если работает, мы приостановим запись и изменим текст кнопки для возобновления. При повторном нажатии запись возобновится.
Наконец, мы можем записать аудио и прослушать его, открыв файл recording.mp3 , который будет сохранён в нашем локальном хранилище. Просто откройте проводник файлов и сделайте поиск по имени файла recording.mp3 .
Исходный код
Вот полный исходный код нашего приложения:
Заключение
Теперь вы знаете, как работает MediaRecorder , как запрашивать разрешения в режиме реального времени и почему это важно делать. Вы также узнали о локальном хранилище вашего устройства Android и о том, как хранить в нём данные.
Более сложная версия этого приложения, в которой есть некоторые дополнительные функции, такие как воспроизведение ваших записей с помощью MediaPlayer , доступна на Github.
Источник
Запись разговоров на Android
Я думаю, довольно многим хочется иметь возможность записывать собственные телефонные разговоры на своём смартфоне за 20 тысяч рублей. Задача вроде бы банальная, и вроде бы API Android’а позволяют это делать. Но почему запись не работает почти на всех устройствах без всяких шаманств и танцев с бубном?
Закон
Всё дело в том, что в некоторых странах запись является нелегальной и производители не тратят время на добавление такой возможности. Но как же быть тем, кто живёт в странах, где записывать разговоры не запрещено. Например, в России нет запрета на запись собственных телефонных разговоров, даже не нужно предупреждать собеседника о записи. Только прослушивать записи ваших разговоров имеете право только вы, т.е. если вы дадите прослушать запись третьему лицу, то это будет расцениваться, как нарушение 23-й статьи Конституции РФ.
Телефон
В некоторых устройствах ядро не содержит нужного драйвера, в некоторых устройствах запись отключена в системных библиотеках. Поэтому на этих телефонах запись не работает ни в одной из десятков программ в Market’e. Оно и не удивительно, ибо все они пишут разговоры одним и тем же способом. Но на некоторых телефонах запись работает без всяких танцев с бубном, например, на Samsung Galaxy S II. Но не на каждой прошивке, например, на Android 4 ICS запись уже не работает, видимо, Samsung посчитал, что пользователям она не нужна и убрал её.
Танцы с бубном
Однако, не всё так плохо. Существует способ записывать разговоры с помощью root-прав и специального кастомного ядра, которое содержит необходимый драйвер для записи разговоров. На некоторых устройствах данный драйвер уже содержится в стоковом ядре, поэтому нет надобности устанавливать кастомное ядро. Таким способом, на данный момент, можно добиться записи на устройствах, которые построены на таких чипсетах от Qualcomm, как QSD8250 (HTC Desire, Nexus One, HTC HD2 и др.), QSD8255 (HTC Desire HD, HTC Incredible S, SE Xperia Ray и др.) и QSD8260 (HTC Sensation, Samsung SGH-T989 Galaxy S II, HTC EVO 3D и др.). Так же запись возможна на некоторых старых чипсетах Qualcomm MSM72xx.
Запись через ядро
Первое, что необходимо сделать — это узнать на каком чипсете построен телефон. Затем необходимо найти специальное ядро с поддержкой записи с линии, это можно сделать на xda-developers.com или 4pda.ru. Если вы нашли ядро для вашего телефона, где заявлена поддержка записи (иногда обозначается 2wcr или CallRec), тогда можете приступить к разблокировке загрузчика/получению S-OFF, установке recovery, получению root-прав и прошивке найденного ядра. Если ядро с поддержкой записи вы не нашли для вашего телефона, но чипсет телефона точно должен её поддерживать, то напишите разработчику или разработчикам ядер для вашего телефона, просьбу добавить данный патч в своё ядро или ядра.
Запись через стандартные API Android’a
Если же запись через ядро невозможна на вашем телефоне, то есть шанс, что существуют специальные либы с поддержкой записи. Как правило, это три файла: libaudio.so, libaudioflinger.so и libaudiopolicy.so запакованные в .zip для прошивки через recovery. Также хочу подчеркнуть, что данный патч может работать только на определённых прошивках. Например, на Samsung Galaxy S записи можно добиться только на Android 2.2 Froyo, на других прошивках запись не работает. Как правило эти библиотеки вытащены из китайской прошивки. Как правило запись через Bluetooth-гарнитуру работает плохо.
Запись через ядро поддерживают несколько программ, одна из них rVoix, бесплатная программа с открытым исходным кодом. Автор этой программы является так же и автором патчей для ядер и благодаря нему запись стала возможной на многих устройствах.
Есть и другая программа с поддержкой записи через ядро — CallRecorder, автором которой я и являюсь.
Если проблема была не в ядре, а в системных библиотеках, то запись должна заработать во всех остальных программах для записи разговоров, коих довольно много в Market’e.
Источник
Полный список
— пишем звук с помощью MediaRecorder
Воспроизводить звук мы научились, теперь попробуем его записать. Для этого можно использовать MediaRecorder. Этот же класс используется и для записи видео, но об этом поговорим в следующих уроках. Пока нас интересует звук.
Чтобы MediaRecorder записал для вас звук, он должен знать:
— источник звука
— формат записи
— аудио-кодек
— имя файла
Если вкратце, то кодек – это способ сжатия данных. А под форматом, я так понимаю, здесь подразумевается контейнер, т.е. способ хранения. Я не буду углубляться в эти вопросы, т.к. не являюсь специалистом. В инете сейчас очень много статей на эту тему.
В хелпе есть пример, в котором используется кодек AMR-NB и формат 3GPP. Их я и буду использовать в своем примере.
Напишем простое приложение, которое будет записывать звук с микрофона и даст возможность прослушать то, что записали.
Project name: P1291_MediaRecorderAudio
Build Target: Android 2.3.3
Application name: MediaRecorderAudio
Package name: ru.startandroid.develop.p1291mediarecorderaudio
Create Activity: MainActivity
Добавим строки в strings.xml:
Рисуем экран main.xml:
Две верхние кнопки стартуют и останавливают запись, две нижние – воспроизведение записанного.
В onCreate задаем имя файла, куда будет записываться звук.
Так же, как и для MediaPlayer, в хелпе есть подробная схема состояний и действий для MediaRecorder. Советую ознакомиться.
В recordStart мы избавляемся от старого рекордера. Затем удаляем файл для записи, если он уже существует. Далее создаем и настраиваем рекордер используя ряд методов.
setAudioSource. Указываем источник звука – микрофон (MIC). Кроме микрофона есть еще несколько источников:
VOICE_CALL — звук при голосовом разговоре по телефону
VOICE_DOWNLINK — только входящая часть VOICE_CALL
VOICE_UPLINK — только исходящая часть VOICE_CALL
CAMCORDER — микрофон, связанный с веб-камерой
VOICE_RECOGNITION — с микрофона будет записываться исходный аудио поток без преобразований, чтобы получить максимальное качество. Используется для распознавания речи
VOICE_COMMUNICATION – аудио поток с микрофона будет «заточен» под VoIP
Если три последних варианта не поддерживаются текущим устройством, то будет использован микрофон по умолчанию.
setOutputFormat. Указываем формат – 3GPP (THREE_GPP). Остальные форматы можно посмотреть здесь.
setAudioEncoder. Указываем кодек для сжатия аудио — AMR_NB. Остальные кодеки можно посмотреть здесь.
setOutputFile. Указываем имя файла, в который будет вести запись.
После всех настроек вызываем метод prepare, который подготовит рекордер к записи и стартуем запись методом start.
В recordStop останавливаем запись методом stop. После этого метода необходимо заново настроить рекордер, если вы снова хотите его использовать. Просто снова вызвать start не получится. На схеме это показано. Кстати, метод reset также сбрасывает все настройки рекордера и после него необходимо заново указывать источник. формат, кодек, файл. Но объект новый создавать необязательно.
В playStart и playStop стартуем и останавливаем воспроизведение записанного файла. Тут ничего нового для нас, все это обсуждалось в Уроке 126.
В методе releaseRecorder мы освобождаем все ресурсы рекордера методом release. После этого объект уже нельзя использовать и необходимо создавать и настраивать новый.
В манифесте необходимо прописать права на запись звука и работу с SD:
После запуска приложения вы сможете записать звук с микрофона и прослушать его.
Распишу еще несколько интересных методов.
setAudioChannels – можно задать режим записи 1 (моно) или 2 (стерео)
setAudioEncodingBitRate и setAudioSamplingRate задают соответственно битрейт и сэмплрейт. Если опять же вкратце, то битрейт – это насколько качественно пишется звук, сэмплрейт – как часто считываются данные с микрофона. Подробности можно узнать у гугла.
setMaxDuration позволяет указать максимальную длительность записи. По достижении этого времени (в мсек), запись остановится, а слушатель, указанный в MediaRecorder.OnInfoListener, получит код what = MEDIA_RECORDER_INFO_MAX_DURATION_REACHED.
setMaxFileSize позволяет указать максимальный размер файла. По достижении указанного размера (в байтах), запись остановится, а слушатель, указанный в MediaRecorder.OnInfoListener, получит код what = MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED.
Разумеется, эти методы надо вызывать перед вызовом prepare
На следующем уроке:
— пишем звук с помощью AudioRecorder
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Пишем свой Dialer для Android и работаем со звонками на низком уровне
Содержание статьи
В юбилейном выпуске «Хакера» за номером 200 мы рассматривали скрытые и не очень аспекты работы с СМС. Сегодня мы продолжаем тему, обратив внимание на голосовые звонки.
Одной из самых популярных программ времен Symbian и «Нокии» был так называемый черный список звонков, позволяющий оградить тонкую натуру владельца телефона от нежелательных абонентов. И хотя сегодня подобная функциональность интегрирована в некоторые прошивки смартфонов, зачастую такие возможности сводятся лишь к банальному перманентному «бану» контакта в адресной книге. В исследовательских целях рассмотрим, как подобный механизм реализуется на практике. Будем считать, что ты давно читаешь рубрику «Кодинг», живешь в Android Studio и ругаешься исключительно на Java.
Типичный черный список
Linux для хакера
А где у него кнопочки?
Каким бы ни было приложение, официальным или негласным (только для личного пользования в целях исследования, естественно), одинаково плохо, если оно будет падать из-за отсутствия на устройстве телефонных функций (Wi-Fi-планшет). Поэтому первое, что стоит сделать, — проверить таковые:
Как видишь, мы воспользовались методом hasSystemFeature из объекта PackageManager, указав константу FEATURE_TELEPHONY в качестве параметра. Кроме того, имеет смысл дополнительно проверить поддержку GSM-модуля константой FEATURE_TELEPHONY_GSM .
Если обе константы лживы, то мы ошиблись устройством, ничего не поделаешь. В этом случае стоит завершить работу приложения, а на выходе попросить пользователя сменить девайс ;).
Принимаем первый звонок
С помощью класса PhoneStateListener в Android’е отслеживается состояние телефона, но лишь в том случае, если приложение запросило полномочие READ_PHONE_STATE в своем манифесте:
Далее необходимо переопределить и зарегистрировать метод onCallStateChanged в реализации PhoneStateListener , чтобы получать уведомления об изменении состояния телефонного вызова. Готовая реализация представлена ниже:
Когда поступает звонок, целочисленный параметр state принимает значение CALL_STATE_RINGING , что приводит к вызову нашей боевой (или мирной) нагрузки в виде функции doMagicWork .
Входящий звонок
В природе данный вариант приема телефонного звонка используется чуть реже, чем никогда. Дело в том, что в момент звонка приложение должно работать на переднем плане, — такое своеобразное использование придумать сложновато (разве только в отладочных целях), поэтому двигаемся дальше.
Принимаем второй звонок
Когда состояние телефона изменяется (например, в результате приема звонка), объект TelephonyManager начинает транслировать намерение (Intent) с действием ACTION_PHONE_STATE_CHANGED .
Намерения — межпрограммный фреймворк для обмена сообщениями. Намерения широко используются в Android для запуска/остановки активностей и сервисов, трансляции сообщений по всей системе, неявного вызова активностей, сервисов и широковещательных приемников.
Широковещательные приемники — компоненты, с помощью которых приложение может отслеживать намерения и реагировать на любые полученные действия. Приемники реализуют событийную модель взаимодействия приложений и системы. Более подробно тема создания широковещательного приемника рассмотрена в статье «Хакерский Cron на Android».
Как и в предыдущем случае, приложение должно получить разрешение READ_PHONE_STATE в манифесте:
Там же регистрируется и широковещательный приемник, способный отслеживать трансляцию намерения:
При таком подходе мы всегда можем получать информацию о входящих звонках, даже если приложение в данный момент не запущено.
Намерение, сообщающее об изменении состояния телефона, будет содержать два параметра: EXTRA_STATE_RINGING — признак входящего звонка и EXTRA_INCOMING_NUMBER — телефонный номер звонящего.
Такой подход и следует использовать на практике.
Положи трубку!
Итак, телефон весело звонит, номер входящего определен, наш широковещательный приемник сработал. Что дальше?
Если рассматривать вариант черного списка или же бота, выполняющего команды извне, то неплохо бы научиться вешать трубку, не привлекая внимания пользователя. Аппаратный стек телефона очень похож на нулевое кольцо (ring 0) в Windows, в том смысле, что тоже представляет собой низкоуровневый системный компонент. Поэтому не существует стандартного способа до него добраться (особенно если у тебя нерутованный аппарат).
Как вариант, можно попытаться использовать язык описания интерфейсов (Android Interface Definition Language, AIDL) для обеспечения межпроцессного взаимодействия между компонентами системы.
Для этого необходимо добавить в проект файл-интерфейс ITelephony.aidl следующего вида:
Следующий код подхватит интерфейс и, используя рефлексию, «положит» трубку:
Чтобы это хозяйство заработало, приложение должно получить еще одно разрешение в манифесте:
Из-за этого применить подобный способ на устройствах с Android 2.3 и выше не выйдет, так как начиная с Gingerbread данное разрешение считается системным и попытка его использовать приведет к падению приложения:
Но ведь в Google Play полно приложений, реализующих черный список! Как же они работают? Условно их можно разделить на две группы (кроме тех, кто честно юзает AIDL): фальшивки и. костыли. Первые всего лишь имитируют работу, периодически показывая в шторке статистику «заблокированных» звонков (и СМС). Взамен они требуют доступ в интернет, скачивают килотонны рекламы, которую крутят по поводу и без. Расчет здесь строится на том, что пользователь не сразу обнаружит обман и свою порцию баннеров гарантированно получит (гомеопатия в чистом виде). Такие программы вряд ли соответствуют рубрике «Кодинг», поэтому мы их пропускаем.
Приложения второй группы пытаются оборвать звонок нетривиальными способами — например, прикидываясь пользователем и нажимая кнопки:
Оригинальным, но вполне рабочим может быть метод уменьшения громкости нежелательного звонка до нуля:
Используя объект AudioManager , мы сначала получаем текущий звуковой профиль getRingerMode() , а потом устанавливаем бесшумный режим AudioManager.RINGER_MODE_SILENT .
После того как звонок прекратится (текущее состояние сменится на EXTRA_STATE_IDLE ), восстанавливаем исходный режим:
Но даже в этом случае не обойтись без специальных разрешений:
Здесь мы не блокируем номер как таковой, скорее просто не поднимаем трубку, однако такой подход не требует никаких «выкрутасов».
Встречаются приложения, которые с переменным успехом пытаются получить доступ к кнопкам на экране входящего звонка, как, например, здесь.
К рассматриваемому вопросу можно отнести задачу вывода информации поверх активности входящего звонка (как вариант — полная визуальная замена окна для маскировки), но из соображений безопасности Android не позволяет создавать собственные активности для этих целей. Тем не менее это не распространяется на системные окна. Любопытная статья по теме.
Как показывает практика, многие «хаки», неплохо функционирующие на одних устройствах, на других в лучшем случае не работают, а в худшем — рушат приложение во время входящего звонка. Соответственно, оценки подобных приложений скачут от единицы («Ничего не работает, верните деньги!») до пяти («Пользуюсь уже двадцать лет, все устраивает!»).
Так работает или нет?
На этом можно было бы поставить жирную точку, если бы внезапно «корпорация добра» не сделала ход слоном.
Липкий список Google
В Android 7.0 Nougat (API 24) появился класс BlockedNumberContract — тот самый черный список, но уже не в виде компонента прошивки смартфона, а в качестве полноценного объекта ОС. Все звонки (а также СМС и электронные письма) от отправителей из этого списка будут автоматически отклонены системой.
BlockedNumberContract представляет собой стандартный контент-провайдер, работать с которым могут, во-первых, системные приложения, во-вторых, приложения для СМС и телефонии, заданные как приложения по умолчанию (Default App). Свойство «по умолчанию» должен установить сам пользователь — это одна из парадигм безопасности Android начиная с версии 4.4. Для телефонии указанное свойство наделяет код правом не только обрабатывать входящие и исходящие звонки, но и изменять базу данных (например, удалять отдельные звонки из логов). Поэтому, кстати, стоит очень настороженно относиться к тем приложениям, даже из Google Play, которые пытаются получить флаг «по умолчанию» и при этом имеют неограниченный доступ в интернет, — вероятность слива информации весьма высока.
Более подробную информацию о приложениях «по умолчанию» можно почерпнуть из этой статьи.
Работа с BlockedNumberContract напоминает взаимодействие с базой данных: используются узнаваемые методы вставки, удаления и, разумеется, выборки записей.
Контент-провайдер — разделяемое постоянное хранилище (как правило, база данных SQLite), которое содержит информацию, относящуюся к приложению, и управляет ею. Предпочтительный способ обмена данными между различными программами.
Чтобы забанить номер телефона, вызываем стандартный метод getContentResolver().insert :
Несмотря на название, столбик COLUMN_ORIGINAL_NUMBER может содержать не только номер телефона, но и электронный адрес:
Удалить номер из бана так же просто:
Для проверки, не внесен ли номер в черный список, предусмотрен метод isBlocked(Context, String) .
Наконец, чтобы получить всех отвергнутых одним махом:
Таким образом, рассмотренные в предыдущем разделе трюки постепенно сойдут на нет. Другой вопрос, как быстро это случится. Доля Android 7 пока не превышает даже инженерной погрешности.
Фрагментация Android (март 2017 года)
Перезваниваем
Позвонить в Android’е можно двумя принципиально разными способами. Первый, и самый простой, — вызвать стандартную активность, передав ей в качестве параметра номер для набора:
Здесь используется инициирующее звонок намерение Intent.ACTION_DIAL , а номер передается в виде пути URI с обязательным указанием протокола tel. На экране смартфона пользователь увидит привычное окно с заведенным номером.
Стандартная «звонилка»
Стандартная активность для дозвона разрешает изменить номер непосредственно перед выполнением звонка, поэтому никаких разрешений в манифесте приложения не требуется.
Второй вариант — перехват намерений, которые обслуживаются стандартным приложением, и вызов своей активности. В этом случае отрисовка экранных цифровых кнопок и поиск по контактам (и это далеко не полный перечень) ложится на плечи программиста.
Кроме того, поскольку в этом случае требуется разрешение:
начиная с Android 4.4 приложение откажется работать, если оно не будет выбрано по умолчанию, а пользователь вряд ли просто так сменит знакомую «звонилку».
Skype ненавязчиво пытается стать телефоном
Как видишь, Google неплохо защитила свой телефонный компонент, и вредоносов, скрытно звонящих на короткие платные номера, в природе (пока еще?) не наблюдается.
Ода манифесту
Если ты внимательно читаешь рубрику «Кодинг», то наверняка заметил, что то или иное потенциально опасное действие в Android требует однозначного разрешения. Несмотря на имеющиеся уязвимости (когда в последний раз к тебе прилетали патчи?) в разных компонентах системы, в целом основным рассадником проблем оказывается сам пользователь. Разумеется, если ты заинтересуешь ЦРУ, никакой запрет разрешений приложений тебя не спасет, но в обычной жизни необходимо крайне настороженно относиться ко всему устанавливаемому ПО, даже если оно родом из Google Play. Как думаешь, стоит ли ставить себе калькулятор, если он требует доступа в интернет и возможности отправлять СМС?
Заключение
Сегодня мы познакомились с одним из главных компонентов современного смартфона — телефонией (хотя, возможно, у интернет-мессенджеров другое мнение на этот счет). Как обычно, не все работает так, как хотелось бы, и свет в велосипедной мастерской еще долго не погаснет, но такая уж у программистов судьба. В любом случае «Хакер» будет держать тебя в курсе.
Источник