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

Фон

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

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

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

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

введите описание изображения здесь

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

  • Имеет звуковой эффект настройки (автоматическая настройка группы параметров).

  • Имеет настройку аудиомаршрута с возможными значениями Disabled, Group1, Group2, Group3

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

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

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

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

Эта проблема

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

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

Что я нашел

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

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

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

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

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

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

  • Эти два старых примера проекта: rvoix, < a href = "https://github.com/esnyder/callrecorder" rel = "nofollow noreferrer"> esnyder-callrecorder, оба не могут записывать. Второй, похоже, даже не работает на устройстве Android 6.0.1, которое он должен поддерживать.

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

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

  • Существует API setMode здесь, но, похоже, он не изменится после его вызова. Я думал, может быть, изменить канал, на котором используется вызов, таким образом, но это не сработало. Он остается на значении 2 во время вызова, что составляет MODE_IN_CALL.

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

  • Я подумывал использовать AudioRecord вместо < класс href = "https://developer.android.com/reference/android/media/MediaRecorder" rel = "nofollow noreferrer"> MediaRecorder для записи, думая, что это немного низкий уровень, поэтому он может дать мне больше возможностей и доступа к настраиваемым возможностям, но, похоже, он очень похож на MediaRecorder и даже использует те же источники звука (пример здесь).

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

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

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

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

Вопросы

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

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

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

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

  3. Какие параметры доступны для различных устройств и версий Android? Есть ли какие-либо веб-сайты OEM-производителей с их описанием?

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

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

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

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

  8. Почему на Galaxy S7 мне не удалось записать другую сторону даже при использовании микрофона и динамика?


РЕДАКТИРОВАТЬ: Я обнаружил, что эта служба доступности может помочь с записью разговоров:

https://developer.android.com/guide/topics/media/sharing-audio-input#voice_call_normal_app

Не знаю, как его использовать. Кажется, Телефонный номеронабиратель ACR использует это. Если кто-нибудь знает, как это сделать, дайте мне знать.


person android developer    schedule 21.06.2018    source источник
comment
Привет , есть ли в этом прогресс? Я решил проблему отклонения вызовов на Samsung 8.0. Возможно, мы сможем обменяться кодами   -  person EricZhao    schedule 05.07.2018
comment
@EricZhao Я уже поделился всем, включая полный код, на Github. Что значит, что вы решили отклонять звонки? Речь идет о записи телефонных разговоров ... И какое решение вы нашли?   -  person android developer    schedule 05.07.2018
comment
У меня нет ничего нового в записи, я заметил, что вы также изучаете функцию отклонения вызовов. TelecomManager и telphonyManager не работают на Samsung 8.0 и Huwei 8.0. TelecomManager просто хорошо работает на Android P.   -  person EricZhao    schedule 05.07.2018
comment
Вы, вероятно, имеете в виду, что обходные пути не работают, но официальный API работает хорошо, верно? А как и что решали на Самсунг 8.0? А какое устройство?   -  person android developer    schedule 05.07.2018
comment
@androiddeveloper Вы когда-нибудь пробовали отклонять вызовы на Samsung Galaxy S9? Я тестировал даже truecaller, который не отклонял вызовы на этом устройстве. Способ помощника просто не работал на многих устройствах 8.0, например Samsung и Huawei.   -  person EricZhao    schedule 06.07.2018
comment
@EricZhao Это вопрос о записи телефонных разговоров. К сожалению, для отклонения звонков есть официальный API только на Android P. Остальное могло потерпеть неудачу. Здесь: stackoverflow.com/a/51155265/878126   -  person android developer    schedule 06.07.2018
comment
Большой вопрос здесь в том, как запись с телефона будет интегрирована с телефонными звонками под управлением ИИ.   -  person arivero    schedule 10.07.2018
comment
ваше репо не работало в устройствах Motorola .. не записывает звук звонящего.   -  person Nikunj Paradva    schedule 06.10.2018
comment
@NikunjParadva Я знаю. Хорошо работает только на некоторых устройствах и версиях Android. Весь вопрос в том, что еще можно было сделать.   -  person android developer    schedule 07.10.2018
comment
Да .. именно .... Но. Просто дайте мне знать .. ведьма аудиоисточник работает хорошо на других телефонах ... Вы можете мне посоветовать ..?   -  person Nikunj Paradva    schedule 07.10.2018
comment
@NikunjParadva Иногда работает VOICE_CALL, иногда DEFAULT, а иногда MIC. Не думаю, что видел, как работают другие. Я считаю, что лучше всего иметь сервер для управления всеми рекомендуемыми конфигурациями. Было время, когда предварительная версия Android P отлично работала с DEFAULT, но когда она стала финальной версией, она совсем не работала.   -  person android developer    schedule 07.10.2018
comment
developer.android.com/ndk/guides/audio/opensl может быть альтернатива и может не сильно отличаться в зависимости от Java API конкретного поставщика; например: stackoverflow.com/questions/41615189/call-recording-with -opensl ... это даже драйвер с малой задержкой, как у ASIO.   -  person Martin Zeitler    schedule 05.12.2018
comment
1) Что касается вашего проекта POC для записи разговоров, у вас есть версия java? Можно ли записывать входящие звонки с помощью вашего проекта?   -  person user13267    schedule 12.06.2019
comment
@ user13267 1. Он находится на Kotlin, поэтому разработчик Android должен иметь возможность его прочитать. Google уже выбрал Kotlin в качестве языка по умолчанию. 2. Да, но, к сожалению, только в гораздо меньших случаях, чем то, что предлагают сторонние приложения. Они используют различные уловки, в том числе JNI и изменение настроек звука.   -  person android developer    schedule 12.06.2019
comment
Как я могу записывать входящие звонки из этого приложения? Можно ли читать необработанный звук и управлять им при входящем телефонном звонке? Мне было интересно, можно ли использовать AudioRecord для чтения входящего звука телефона вместо MediaRecorder   -  person user13267    schedule 12.06.2019
comment
@ user13267 Он делает это автоматически, но, как я уже писал, не работает на некоторых устройствах и версиях Android. Это также позволяет вам установить источник звука, который обычно должен быть VOICE_CALL или некоторыми другими основными. Что касается манипуляций, решать вам. Вместо этого вы можете использовать AudioRecord. Просто нужно сменить код. Если вы используете AudioRecord, рассмотрите возможность внесения вклада в репозиторий и сделайте его необязательным (что означает, что пользователь выбирает, что использовать: AudioRecord или MediaRecorder).   -  person android developer    schedule 12.06.2019
comment
хорошо, спасибо, я только что протестировал это несколько раз, и для Galaxy S6 Edge / Android 7 VOICE_CALL вызывает Error while recording, в то время как DEFAULT, MIC и VOICE_COMMUNICATION, похоже, работают, но и мой голос через микрофон, и входящий звук через сеть кажутся рассматриваться как один и тот же источник звука; оба записываются. Странно то, что я думаю, что даже когда я отключаю микрофон в приложении приемника телефона Android, кажется, что он продолжает запись с микрофона (мне придется снова проверить это позже)   -  person user13267    schedule 12.06.2019
comment
спасибо за помощь. Буду держать вас в курсе, если найду что-нибудь новое. Только один быстрый вопрос: как вы думаете, можно ли принять звук входящего телефонного звонка на аудиозаписи, выполнить с ним некоторые манипуляции (например, умножить на 1), а затем отправить результат в аудиотрек, чтобы моя модифицированная версия входящий звук можно услышать вместо фактического входящего звука? Как вы думаете, это возможно?   -  person user13267    schedule 12.06.2019
comment
@ user13267 Я никогда не делал этого сам, но, читая документацию, кажется, что это должно сработать. Интересно, можно ли для этого использовать MediaRecorder. Возможно нет. Это могло бы стать хорошим улучшением репозитория Github для увеличения объема. Возможно, в некоторых случаях при записи может помочь слишком низкий уровень громкости.   -  person android developer    schedule 12.06.2019
comment
@ user13267 Еще одна полезная функция, которая могла бы быть возможна с помощью AudioRecord, - это пропуск тишины в начале вызова. Возможно, это может помочь: stackoverflow.com/a/48264189/878126   -  person android developer    schedule 13.06.2019
comment
какое-нибудь решение для этого?   -  person Nagendra Hari Karthick    schedule 22.08.2019
comment
@NagendraHariKarthick Может быть, root, но даже тогда я понятия не имею, как это работает с корневыми устройствами ...   -  person android developer    schedule 22.08.2019
comment
BoldBeast также, похоже, не работает в пироге. Посетите их форум boldbeast.com/forum/topic1744-android -9-pie-call-recording.html   -  person Nagendra Hari Karthick    schedule 23.08.2019
comment
@NagendraHariKarthick Я не понимаю, что говорят, что это всегда невозможно. Просто требуется рут ...   -  person android developer    schedule 23.08.2019


Ответы (1)


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

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

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

Затем я начал перепроектировать работающие в настоящее время приложения, которые работали над более новой версией Android, и обнаружил, что они используют совершенно другой и более безопасный подход. Это занимает у меня много недель, потому что все эти приложения используют библиотеки JNI, пытаясь скрыть этот метод между кодом Assembler. Когда я успешно создал тестовое приложение, которое хорошо записывалось, я попробовал тот же код на многих разных устройствах и ПЗУ / версиях, и, к удивлению, он работал хорошо. Это означает, что все эти различные методы, которые вы можете увидеть в этих настройках приложения (я уверен на 98%), являются просто «фальшивыми» или просто относятся к СТАРЫМ методам, которые больше не используются.

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

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

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

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

person emandt    schedule 10.12.2018
comment
Не могли бы вы поделиться кодом каждого из найденных вами способов? Значение: отражение, код, который вы видели на JNI, и способы получения рутированных устройств? У приложения boldbeast просто, кажется, есть много режимов и конфигураций, которые, кажется, они придумали разными способами ... - person android developer; 10.12.2018
comment
Привет можешь поделится, как поменять AudioRoutes? Я долго разбирался в этом, но ничего не получил. - person EricZhao; 15.12.2018