Фон
Запись с телефона на самом деле не поддерживается на 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 с открытым исходным кодом здесь strong >, имея образец, который запишет один звонок и позволит вам прослушать самый последний, если все работает хорошо.
Этот 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) предлагают больше. Одним из примеров является Автоматический регистратор звонков strong > с конфигурацией (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 может быть официальный способ записи звонков (см. здесь strong > и здесь strong>). Тестируя на моем устройстве Android P DP3 (Pixel 2), я мог нормально записывать обе стороны как при входящих, так и исходящих вызовах, используя DEFAULT в качестве источника звука, так что, возможно, API, наконец, станет официальным и будет работать на всех версиях Android. Я писал об этом здесь и здесь.
Я подумал, что, возможно, Визуализатор класс может быть обходным путем записи, но, согласно некоторой публикации StackOverflow (здесь), качество его крайне низкое, поэтому я решил, что, может быть, мне не стоит его пробовать. К тому же я не смог найти образец того, как с него записывать.
Я нашел некоторые параметры, которые могут быть доступны на некоторых устройствах, здесь (найдено из здесь strong >), все начинаются с AUDIO_PARAMETER_, но при тестировании на Galaxy S7 все вернули пустую строку. Я также нашел этот веб-сайт strong>, что натолкнуло меня на идею использовать
audioManager.setParameters("noise_suppression=off")
вместе с источником звука MIC, но в случае с Galaxy S7 это, похоже, не помогло.
Вопросы
В отличие от других подобных вопросов по этой теме, я не спрашиваю, как записывать звонки. Я уже знаю, что это очень сложная и сложная проблема. Я уже знаю, что мне придется обратиться к различным конфигурациям, и что я, вероятно, буду использовать сервер, чтобы хранить их все и найти там наилучшее соответствие для каждой из них.
Я хочу спросить больше о настройках и обходных путях:
Есть ли список конфигураций для различных устройств, версий Android и что выбрать для каждого?
Какую другую конфигурацию можно использовать, кроме источника звука?
Какие параметры доступны для различных устройств и версий Android? Есть ли какие-либо веб-сайты OEM-производителей с их описанием?
Какие термины используются в упомянутом приложении? Где я могу найти информацию о том, как их изменить?
Какие инструменты доступны для устройств с root-доступом?
Можно ли узнать, какое устройство поддерживает запись разговоров, а какое нет, с помощью API?
Об обходном пути OnePlus 2: подождать, пока мы не начнем запись, зачем это нужно? Он нужен на всех версиях Android? Это известная проблема? Достаточно ли одной секунды?
Почему на Galaxy S7 мне не удалось записать другую сторону даже при использовании микрофона и динамика?
РЕДАКТИРОВАТЬ: Я обнаружил, что эта служба доступности может помочь с записью разговоров:
https://developer.android.com/guide/topics/media/sharing-audio-input#voice_call_normal_app
Не знаю, как его использовать. Кажется, Телефонный номеронабиратель ACR a> использует это. Если кто-нибудь знает, как это сделать, дайте мне знать.
Error while recording
, в то время как DEFAULT, MIC и VOICE_COMMUNICATION, похоже, работают, но и мой голос через микрофон, и входящий звук через сеть кажутся рассматриваться как один и тот же источник звука; оба записываются. Странно то, что я думаю, что даже когда я отключаю микрофон в приложении приемника телефона Android, кажется, что он продолжает запись с микрофона (мне придется снова проверить это позже) - person user13267   schedule 12.06.2019