Как некоторые приложения преодолевают ограничения записи на телефон?

Фон

Запись на телефоне на Android не поддерживается, но некоторые устройства поддерживают ее в некоторой степени.

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

Некоторые даже предлагают корневые решения.

Одним из таких примеров является приложение boldbeast Call Recorder, которое предлагает множество различных конфигураций для изменения:

enter image description here

  • "режим записи". Показывает 14 режимов для ненагруженных устройств и до 34 для корневых. Также показывает "Режим Alsa" в качестве опции для него, для корневых устройств.

  • Имеет "Tune Audio Effect (" Автоматическая настройка группы параметров ").

  • Имеет "Tune Audio Route", с возможными значениями "Disabled", "Group1", "Group2", "Group3",

  • Для корневых устройств:

    • "изменить аудио-элементы управления" ("автоматическое изменение элементов управления аудио")

    • "изменить аудио-драйвер" (изменить настройки аудиопривода, чтобы включить режим записи 21,22,23,24,31,32,33,34 ")

    • Для корневых устройств: "начать входной поток"

Эта проблема

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

Например, я не могу найти ни одного из приложений, о которых я упоминал.

Что я нашел

Помимо тонны вопросов о том, как записывать звонки на Android, показывая, что он не работает на всех устройствах, я мог бы найти интересные вещи. Вот мои попытки и идеи:

  • Есть некоторые аудиоисточники, которые мы можем использовать при подготовке записи (документы здесь), но, к сожалению, в каждом устройстве это может быть иначе. Для некоторых VOICE_CALL работает, а для некоторых - другие. Но по крайней мере мы можем попробовать...

  • На OnePlus 2 с Android 6.0.1 входящие звонки могут быть записаны с использованием VOICE_CALL, но я не могу сделать там, где я буду записывать исходящие звонки, если я не использую MIC в качестве источника звука вместе с включенным динамиком. Почему-то приложение, о котором я говорил, успешно записывает его без каких-либо проблем. Я уверен, что у меня появятся другие проблемы с другими устройствами Android, так как я пытался решить эту тему в прошлом. Обновление: я нашел этот примерный проект (также здесь), который по какой-то причине спит в течение 2 секунд в потоке пользовательского интерфейса между вызовами prepare и start mediaRecorder. Он отлично работает, и когда я сделал что-то подобное (подождите, используя Handler.postDelayed в течение 1 секунды), он тоже отлично справился. Комментарий, который был там написан: "Иногда подготовка занимает некоторое время, чтобы закончить".

  • На Galaxy S7 с Android 8 у меня не получилось слышать другую сторону для исходящих звонков и входящих вызовов (даже с MIC и динамиком), независимо от того, что я сделал, но приложение, о котором я говорил, отлично работает.

  • Чтобы вы могли попробовать мой POC записи звонка, я опубликовал здесь репозиторий github с открытым исходным кодом, имеющий образец, который будет записывать один вызов, и позволит вам прослушивать самый последний, если все работает хорошо.

  • Этот SDK "ViktorDegtyarev - CallRecLib", который, похоже, не работает вообще, и сбой на разных версиях Android

  • Эти два старых примера проектов: rvoix, esnyder-callrecorder, оба не могут фактически записываться. Второй, похоже, даже не работает на устройстве Android 6.0.1, которое оно должно поддерживать.

  • aykuttasil - образец выборки и акселератора CallRecorder - андроид-call-recorder - оба, как и на моей POC, не имеют никаких настроек, кроме AudioSource, и из-за этого они не могут записывать в некоторых случаях, например, OnePlus 2 output- аудио исходящих вызовов.

  • Большинство сторонних приложений предлагают только настройку AudioSource, но некоторые (например, "boldbeast") предлагают больше. Одним из примеров является " Автоматический рекордер звонков ", который имеет "конфигурацию" (10 значений на выбор, сначала "по умолчанию") и "метод" (5 значений на выбор, сначала "по умолчанию"). Эти приложения, вероятно, не хотят, чтобы другие понимали, что означают эти конфигурации, поэтому они накладывают общие имена. Или это слишком сложно для всех (особенно для пользователей), поэтому они обобщают имена.

  • Существует АНИ из "SetMode" здесь, но это, кажется, не изменяется при вызове его. Я думал, что, возможно, изменит "канал" того, где используется этот вызов, но он не работает. Он остается на значении "2" во время вызова, который является MODE_IN_CALL.

  • Существуют настраиваемые параметры, доступные для различных устройств (каждый OEM и его собственные параметры), которые могут быть установлены здесь и, возможно, даже через JNI ( здесь и здесь), но я не понимаю, откуда получить эту информацию (что означает, что пары ключа-значения). Я искал во многих местах, но не мог найти ни одного веб-сайта, который говорит о том, какие возможные параметры доступны, и для каких устройств.

  • Я думал об использовании AudioRecord вместо класса MediaRecorder для записи, считая, что он немного низкий, поэтому он может дать мне больше возможностей и доступ к настраиваемым возможностям, но, похоже, он очень похож на MediaRecorder и даже использует тот же звук источники (пример здесь).

  • Еще одна попытка, с которой я столкнулся с API низкого уровня, - еще больше, использования JNI (OpenSL ES для Android). Для этого, я не мог найти много информации ( за исключением здесь и здесь), и только нашел 2 образца Google здесь ( так называемый "аудио эха" и "родную аудио"), которые не о записи звука, или, по крайней мере, я не вижу их.

  • Android P может иметь официальный способ записи вызовов (читайте здесь и здесь). Тестирование на моем устройстве Android P DP3 (Pixel 2), я мог записывать обе стороны в порядке как входящих, так и исходящих вызовов, используя "DEFAULT" в качестве источника звука, поэтому, возможно, API, наконец, станет официальным и будет работать на всех версиях Android. Я писал об этом здесь и здесь.

  • Я думал, что, возможно, класс Visualizer может быть обходным путем для записи, но, согласно некоторым сообщениям StackOverflow ( здесь), качество его чрезвычайно низкое, поэтому я решил, что, возможно, я не должен его пробовать. Плюс я не мог найти образец того, как записывать его.

  • Я нашел некоторые параметры, которые могут быть доступны на некоторых устройствах, здесь ( здесь и здесь), все начинаются с "AUDIO_PARAMETER_", но при тестировании на Galaxy S7 все возвращают пустую строку. Я также нашел этот сайт, который дал мне идею использования audioManager.setParameters("noise_suppression=off") вместе с источником аудиосигнала MIC, но это, похоже, ничего не делало в случае Galaxy S7.

Вопросы

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

Я хочу спросить больше о настройках и обходных решениях:

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

  2. Помимо источника звука, какую другую конфигурацию можно использовать?

  3. Какие параметры возможны для разных устройств и версий Android? Существуют ли какие-либо веб-сайты OEM-производителей, описывающих их?

  4. Каковы различные термины в приложении, о котором я упоминал? Где я могу найти информацию о том, как их изменить?

  5. Какие инструменты доступны для корневых устройств?

  6. Возможно ли узнать, какое устройство поддерживает запись звонков, а какие нет, используя API?

  7. Об обходном пути OnePlus 2, чтобы подождать, пока мы не начнем запись, зачем это нужно? Это необходимо для всех версий Android? Это известная проблема? Достаточно ли 1 секунды?

  8. Как на Galaxy S7 мне не удалось записать другую сторону, даже когда вы используете MIC & speaker?

Ответ 1

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

Я всегда разрабатывал одну и ту же Galaxy Note 5 с использованием стандартного ПЗУ (без Root), но обнаружил, что на одном и том же устройстве поведение менялось от одного выпуска Android к другому без объяснения причин. Например, с Nougat 7.0 до 7.1.2 мне не удалось записать голосовой звонок, используя тот же код, что и раньше.

Google ввел ограничения на запись голосовых вызовов много раз. В начале было достаточно использовать VOICE_CALL AudioSource. Затем производители начали интерпретировать это значение так, как они хотели, и в результате одна реализация работала хорошо, а другая - нет. Затем Reflection был необходим для запуска недокументированных/скрытых методов, чтобы начать запись голосовых вызовов. Затем Google добавил проверку времени выполнения, поэтому вызывать их напрямую было невозможно, даже используя Reflection. Однако этот метод недостаточно стабилен, поскольку он не гарантировал, что метод использовал одно и то же имя на всех устройствах.

Затем я начал реинжиниринг работающих в настоящее время приложений, работающих на более новой версии Android, и обнаружил, что в них используется совершенно другой и более безопасный подход. Это занимает у меня много недель, потому что все эти приложения используют библиотеки JNI, пытающиеся скрыть этот метод между кодом ассемблера. Когда я успешно создал тестовое приложение, которое хорошо записывалось, я попробовал ЖЕ код на разных устройствах и в ПЗУ/версиях, и неожиданно он работал хорошо. Это означает, что все эти различные методы, которые вы можете видеть в этих настройках приложения (я уверен на 98%), являются просто "фальшивыми" или просто ссылаются на старые методы, которые более не используются.

Для устройств с корнями нужно сделать немного другое: эти устройства могут изменять AudioRoutes, поэтому в этом случае можно использовать другой подход.

[1] Нет списка или веб-сайта, где перечислены все поддерживаемые устройства или лучший метод для успешной записи голосовых вызовов.

[6] Невозможно узнать, какое устройство поддерживает запись голосовых вызовов, просто используя вызов API. Вы должны попытаться поймать Excepions...

[8] Запись с помощью микрофона MIC + страдает многими проблемами: (1) вызывающий абонент услышит весь ваш окружающий звук, поэтому проблема с конфиденциальностью - большая проблема (2) эхо - большая проблема (3) громкость записи очень высокая низкое качество записанного голоса