web-dev-qa-db-fra.com

Comment certaines applications surmontent-elles les restrictions d'enregistrement du téléphone?

Contexte

L'enregistrement téléphonique n'est pas vraiment pris en charge sur Android, mais certains appareils le prennent en charge dans une certaine mesure.

Cela a amené diverses applications d'enregistrement d'appels à rassembler autant d'informations que possible sur les appareils et ce qui devrait leur être fait, et à décider quoi faire.

Certains proposent même des solutions racine.

Un tel exemple est boldbeast Call Recorder app , qui propose de nombreuses configurations différentes à modifier:

enter image description here

  • "mode d'enregistrement". Affiche 14 modes pour les appareils non rootés, et jusqu'à 34 pour les appareils rootés. Affiche également le "mode Alsa" en option pour les appareils enracinés.

  • Possède "Tune Audio Effect (" auto tune a groupd of parameters ").

  • A "Tune Audio Route", avec les valeurs possibles de "Disabled", "Group1", "Group2", "Group3"

  • Pour les appareils enracinés:

    • "changer les commandes audio" ("changer automatiquement les commandes audio")

    • "changer le pilote audio" (modifier les paramètres du lecteur audio pour activer le mode d'enregistrement 21,22,23,24,31,32,33,34 ")

    • Pour les appareils rootés: "démarrer le flux d'entrée"

Le problème

Si j'ai besoin de créer une application d'enregistrement d'appels, il n'y a pas d'autre moyen que de trouver les différentes solutions de contournement pour différents appareils, mais il semble que d'autres applications utilisent des termes qui n'apparaissent pas dans l'API.

Je ne trouve aucun de ceux de l'application que j'ai mentionnés, par exemple.

Ce que j'ai trouvé

À part des tonnes de questions sur la façon d'enregistrer des appels sur Android, montrant que cela ne fonctionne pas sur tous les appareils, je pourrais trouver des choses intéressantes. Voici mes essais et mes idées jusqu'à présent:

  • Il existe certaines sources d'enregistrement audio que nous pouvons utiliser lors de la préparation de l'enregistrement (docs ici ), mais malheureusement, dans chaque appareil, cela peut sois différent. Pour certains, VOICE_CALL fonctionne et pour certains, d'autres. Mais au moins on peut essayer ...

  • Sur OnePlus 2 avec Android 6.0.1, les appels entrants peuvent être enregistrés en utilisant VOICE_CALL , mais je ne peux pas y enregistrer d'appels sortants, sauf si j'utilise MIC comme source audio avec le haut-parleur allumé. D'une manière ou d'une autre, l'application que j'ai mentionnée réussit à l'enregistrer sans aucun problème. avec d'autres appareils Android, car j'ai essayé d'aborder ce sujet dans le passé. Mise à jour: j'ai trouvé cet échantillon projet (également ici ), qui pour une raison quelconque dort pendant 2 secondes sur le thread d'interface utilisateur entre les appels prepare et start du mediaRecorder. Cela fonctionne très bien, et quand j'ai fait quelque chose de similaire (attendez en utilisant Handler.postDelayed pendant 1 seconde), cela a bien fonctionné aussi. le commentaire qui a été écrit est "Parfois, la préparation prend du temps".

  • Sur Galaxy S7 avec Android 8, je n'ai pas réussi à obtenir le son de l'autre côté pour les appels sortants ET les appels entrants (même avec MIC et haut-parleur), peu importe ce que j'ai fait, mais l'application J'ai dit que ça fonctionnait bien.

  • Pour vous permettre d'essayer mon POC d'enregistrement d'appels, j'ai publié un référentiel github open source ici , avec un échantillon qui enregistrera un seul appel et vous permettra d'écouter le plus récent, si tout fonctionne bien.

  • Ce SDK "ViktorDegtyarev - CallRecLib" , qui ne semble pas fonctionner du tout, et se bloque sur divers Android

  • Ces 2 anciens exemples de projets: rvoix , esnyder-callrecorder , les deux ne parviennent pas à enregistrer réellement. Le second ne semble même pas fonctionner sur l'appareil Android 6.0.1, qu'il est censé prendre en charge.

  • aykuttasil - CallRecorder échantillon et axet - Enregistreur d'appels Android échantillon - les deux, tout comme sur mon POC, n'ont aucun réglage, sauf pour AudioSource, et à cause de cela, ils ne parviennent pas à enregistrer dans certains cas, tels que la sortie OnePlus 2 - audio des appels sortants.

  • La plupart des applications tierces n'offrent que le réglage AudioSource, mais certaines (comme "boldbeast") en proposent plus. Un exemple est " ( Enregistreur d'appel automatique " qui a "configuration" (10 valeurs à choisir, la première est "par défaut" ) et "méthode" (5 valeurs au choix, la première est "par défaut"). Ces applications ne veulent probablement pas que les autres comprennent ce que ces configurations signifient, elles mettent donc des noms généraux. Ou, c'est tout simplement trop compliqué pour tout le monde (en particulier pour les utilisateurs), donc ils généralisent les noms.

  • Il existe une API de "setMode" ici , mais elle ne semble pas changer lors de son appel. Je pensais peut-être changer le "canal" de l'endroit où l'appel est utilisé, de cette façon, mais cela ne fonctionne pas. Il reste sur la valeur de "2" pendant l'appel, qui est MODE_IN_CALL .

  • Il existe des paramètres personnalisés disponibles pour divers appareils (chaque OEM et ses propres paramètres), qui peuvent être définis ici et peut-être même via JNI ( ici et ici ), mais je ne sais pas d'où obtenir ces informations (ce qui signifie quelles paires de valeurs-clés sont disponibles). J'ai cherché dans de nombreux endroits, mais je n'ai trouvé aucun site Web qui parle des paramètres possibles disponibles et des appareils.

  • Je pensais utiliser AudioRecord au lieu de MediaRecorder classe pour l'enregistrement, pensant que c'est un peu bas niveau, donc cela pourrait me donner plus de puissance et d'accès à des capacités personnalisées, mais il semble être très similaire à MediaRecorder, et même utiliser le même audio sources (exemple ici ).

  • Un autre essai que j'ai eu avec l'API de bas niveau, était encore plus loin, d'utiliser JNI (OpenSL ES pour Android). Pour cela, je n'ai pas trouvé beaucoup d'informations (sauf ici et ici ), et n'a trouvé que les 2 échantillons de Google ici = (appelé "écho audio" et "audio natif"), qui ne concernent pas l'enregistrement du son, ou du moins je ne les vois pas se produire.

  • Android P peut avoir un moyen officiel d'enregistrer les appels (lire ici et ici ). En testant sur mon Android P DP3 (Pixel 2), je pouvais bien enregistrer les deux côtés dans les appels entrants et sortants, en utilisant "DEFAULT" comme source audio, donc peut-être que l'API sera enfin officielle et travailler sur toutes les versions Android. J'ai écrit à ce sujet ici et ici .

  • Je pensais que peut-être la classe Visualizer pourrait être une solution de contournement de l'enregistrement, mais selon certains articles de StackOverflow ( ici ), la qualité est extrêmement faible, j'ai donc décidé que je ne devrais pas l'essayer. De plus, je n'ai pas pu trouver d'échantillon sur la façon d'enregistrer.

  • J'ai trouvé quelques paramètres qui pourraient être disponibles sur certains appareils, ici (trouvé à partir de ici ), tous commencent par "AUDIO_PARAMETER_", mais en testant sur Galaxy S7, tous ont renvoyé une chaîne vide. J'ai également trouvé ce site Web , qui m'a donné l'idée d'utiliser audioManager.setParameters("noise_suppression=off") avec MIC source audio, mais cela ne semble rien faire dans le cas du Galaxy S7.

Questions

Contrairement à d'autres questions similaires sur ce sujet, je ne demande pas comment enregistrer les appels. Je sais déjà que c'est un problème très problématique et complexe. Je sais déjà que je devrai aborder différentes configurations, et que j'utiliserai probablement un serveur pour les stocker toutes et y trouver la meilleure correspondance pour chacune.

Ce que je veux demander, c'est plus sur les ajustements et les solutions:

  1. Existe-t-il une liste de configurations pour les différents appareils, Android, et quoi choisir pour chacun?

  2. Outre la source audio, quelle autre configuration peut-on utiliser?

  3. Quels paramètres sont possibles pour les différents appareils et Android versions? Y a-t-il des sites Web des OEM les décrivant?

  4. Quels sont les différents termes de l'application que j'ai mentionnés? Où puis-je trouver des informations sur la façon de les modifier?

  5. Quels outils sont disponibles pour les appareils rootés?

  6. Est-il possible de savoir quel appareil prend en charge l'enregistrement des appels et lequel ne l'est pas, en utilisant l'API?

  7. À propos de la solution de contournement de OnePlus 2, pour attendre un moment avant de commencer l'enregistrement, pourquoi est-ce nécessaire? Est-il nécessaire sur toutes les versions Android? Est-ce un problème connu? 1 seconde suffirait-elle?

  8. Comment se fait-il que sur le Galaxy S7, je n'ai pas réussi à enregistrer l'autre côté même lorsque j'utilise MIC et haut-parleur?

36
android developer

J'ai passé plusieurs semaines à travailler sur une application d'enregistrement Voicecall, j'ai donc fait face à tous vos problèmes/questions/problèmes. De plus: mon projet avait une faible priorité, donc je n'y ai pas passé beaucoup de temps tous les jours, donc j'ai travaillé sur cette application pendant plusieurs mois pendant que Android changeait sous le capot (mineur un versions majeures).

Je développais toujours sur le même Galaxy Note 5 en utilisant son stock ROM (sans Root) mais j'ai découvert que sur le même appareil le comportement changeait d'un Android = libération à un autre sans aucune explication Par exemple de Nougat 7.0 à 7.1.2 je n'ai pas pu enregistrer un appel vocal en utilisant le même code qu'auparavant.

Google a appliqué à plusieurs reprises des restrictions sur l'enregistrement des appels vocaux. Au début, il suffisait d'utiliser VOICE_CALL AudioSource. Ensuite, les fabricants ont commencé à interpréter cette valeur comme ils le voulaient, et le résultat a été qu'une mise en œuvre fonctionnait bien mais pas une autre. Ensuite, Reflection était nécessaire pour exécuter des méthodes non documentées/cachées pour démarrer l'enregistrement des appels vocaux. Ensuite, Google a ajouté un contrôle Runtime, donc les appeler directement n'était pas plus possible même en utilisant Reflection. Cependant cette méthode manque de stabilité car il n'est pas garanti qu'une méthode utilise le même nom sur tous les appareils.

Ensuite, j'ai commencé à faire de l'ingénierie inverse sur les applications qui fonctionnaient actuellement sur les nouvelles Android et j'ai découvert qu'elles utilisaient une approche complètement différente et plus sécurisée. Cela me prend plusieurs semaines car toutes ces applications utilise les bibliothèques JNI essayant de cacher cette méthode entre le code assembleur. Lorsque j'ai réussi à créer une application de test qui enregistrait bien, j'ai essayé le même code dans de nombreux appareils et ROM/versions différents et, étonnamment, cela fonctionnait bien. Cela signifie que toutes ces méthodes différentes vous pouvez voir dans ces paramètres d'application (je suis sûr à 98% à ce sujet) qu'ils sont simplement "faux" ou se réfèrent simplement à des méthodes ANCIENNES plus utilisées.

Une petite métion différente devrait être faite pour les appareils enracinés: ces appareils pourraient changer AudioRoutes afin qu'une approche différente puisse être utilisée dans ce cas.

[1] Il n'y a pas de liste ou de site Web répertoriant tous les appareils pris en charge ou la meilleure méthode pour effectuer un enregistrement d'appel vocal avec succès

[6] Il n'est pas possible de savoir quel appareil prend en charge l'enregistrement des appels vocaux simplement en utilisant un appel API. Vous devez essayer d'attraper les Excepions ...

[8] L'enregistrement par le haut-parleur MIC + souffre de nombreux problèmes: (1) l'appelant entendra tout votre son ambiant donc le bug de confidentialité est un gros problème (2) l'écho est un gros problème (3) le volume d'enregistrement est très aussi faible que la qualité de la voix enregistrée

2
emandt