Comment setMicrophoneMute() de travail?
J'ai essayé d'utiliser Android AudioManager.setMicrophoneMute()
sans beaucoup de succès. C'est, il refuse tout simplement de mettre le microphone en sourdine, peu importe ce que je fais.
J'ai cherché sur le web pour avoir des indices et j'ai trouvé plusieurs références de déclaration expérience similaire:
- AudioManger.setMicrophoneMute fonctionnalité ne fonctionne pas??
- setMicrophoneMute(boolean) ne fonctionne pas sur certains appareils
- Impossible de mettre le microphone en sourdine dans Android
Qui pose la question: est-ce AudioManager.setMicrophoneMute()
travail? Est-il seulement un talon de méthode, en attente d'être mis en œuvre dans certaines future version d'Android? Si non, comment ça fonctionne? De quoi ai-je besoin pour le faire fonctionner? Quelles sont les conditions de travail comme son nom l'indique?
EDIT: j'ai remarqué que la documentation de cette méthode dit:
Cette méthode ne doit être utilisée par des applications remplacer l'
la plate-forme de gestion de l'ensemble des paramètres audio ou la téléphonie
application.
Qu'est-ce que cela signifie? Pourquoi voudrais-je remplacer la plate-forme de gestion de l'ensemble? Ai-je vraiment besoin de faire cela? Si oui, comment dois-je faire?
EDIT: La réponse ci-dessous est grande, mais je ne comprends toujours pas:
- Comment est-ce drapeau (SET_MIC_MUTE dans la base de données) utilisé?
- Quand ce drapeau fait déconnecter le signal du microphone de
le pré-amplificateur circuit à l'intérieur du téléphone? - Si elle ne le fait pas, qui le fait?
- Si de rien n', comment est-ce que "mute" prévu pour travailler?
Veuillez expliquer. Merci.
- Je suis sûr que vous devez avoir - mais avez-vous activé les autorisations testé par
checkAudioSettingsPermission
? - J'ai vérifié la "documentation" pour checkAudioSettingsPermission et à l'exception de retourner un booléen, il n'y a pas la moindre idée de ce qu'il fait et ce qu'il s'attend à recevoir dans le paramètre de la Chaîne. Je ne veux vraiment pas changer la question de
setMicrophoneMute()
àcheckAudioSettingsPermission
, mais avez-vous une idée de ce quecheckAudioSettingsPermission
fait et quel est le sens de cetteString
paramètre? +1 - Vous pouvez décrire ce que tu voulais faire au départ. Il semble que vous en avez un peu de cours. Vous ne voulez probablement pas à remplacer la téléphonie apllication et vous non plus (et vous ne pouvez pas, par la manière, sans avoir une plate-forme cert).
- Je ne veux vraiment pas de remplacer quoi que ce soit. 🙂 Tout ce que je cherche à faire est de désactiver le microphone. Android dispose d'une fonction (en fait, 4 d'entre eux, comme illustré ci-dessous par le seul qui a eu le courage de répondre) que prétend le faire, , mais ça ne fonctionne pas. Que dois-je faire? +1 pour essayer d'aider.
- vérifier simplement: avez-vous le MODIFY_AUDIO_SETTINGS ou RECORD_AUDIO autorisation dans le manifeste?
- Bien sûr, j'ai MODIFY_AUDIO_SETTINGS et RECORD_AUDIO autorisations dans le manifeste. Je pensais que c'était implicite en fournissant le 1er lien qui fait référence à ces paramètres.
Vous devez vous connecter pour publier un commentaire.
D'élaborer sur an00b:s la réponse ci-dessus et la version éditée de la question que nous devons creuser plus profondément dans le code source. IAudioflinger est l'interface de l'AudioFlinger service et l'appel à
est en fait le Liant de la transaction pour mettre le microphone en sourdine. Du côté de réception de la Reliure d'appel ressemble:
et appelle à la mise en œuvre effective de setMicMute dans le AudioFlinger. La prochaine étape est de regarder cette fonction:
Ici, nous pouvons noter deux choses. La première est qu'il y a une vérification des permissions pour être en mesure de mettre le microphone en sourdine. L'autorisation en cours de vérification dans settingsAllowed est android.la permission.MODIFY_AUDIO_SETTINGS donc, comme mentionné dans un des commentaires ci-dessus la première exigence pour la mise en sourdine du microphone est que votre candidature a déclaré qu'il a besoin de cette autorisation. La prochaine chose à noter est que l'on appelle maintenant dans le matériel spécifique à la version de setMicMute à l'aide de mAudioHardware->setMicMute(état).
Pour plus d'informations sur la façon dont le matériel est branché étudier le dossier AudioHardwareInterface.cpp. Fondamentalement, il se retrouve dans une libhardware avec une extern C appel à createAudioHardware qui se branche dans le bon AudioHardWare pour la plate-forme. Il y a aussi des interrupteurs à l'aide d'un A2DP matériel, un générique pour l'émulateur et cogner l'audio. Supposé que vous travaillez sur un périphérique réel de la mise en œuvre est alors beaucoup de matériel en fonction. Pour obtenir une sensation pour elle, nous pouvons utiliser les audiohardware de Crespo (Nexus S) comme un exemple.
Basé sur cet exemple, nous pouvons conclure avec une discussion de la mise en œuvre de routage audio dans les smartphones. Comme vous pouvez le voir dans le Crespo mise en œuvre de la mic mute appel ne seront respectés si vous n'êtes pas dans un appel. La raison pour cela est que le son est envoyé par le biais de l'analogique en bande de base qui gère la régulation de puissance, d'amplification et d'autres choses. Quand, dans un appel de la voix de l'audio est souvent traitée par l'analogique en bande de base et modem CPU ensemble et ne passent pas à travers l'application de l'UC. Dans ce cas, vous pouvez avoir besoin de passer par le modem du PROCESSEUR par le biais de la RIL pour mettre le microphone en sourdine. Mais depuis ce comportement est dépendant du matériel il n'y a pas de solution générale.
Pour donner la version courte pour votre 4 questions supplémentaires:
Le drapeau est transmis par le biais de plusieurs couches de code jusqu'à ce qu'il se retrouve dans le matériel spécifique désactiver le microphone.
Le micro est débranché lorsque le matériel spécifique code a exécuter, sauf en cas d'un appel, au moins sur certains appareils.
Quand setMicrophoneMute ne pas couper le son du microphone, c'est à dire pendant un appel, il peut être possible de le faire en utilisant l'un de l'API de téléphonie:s, je vous suggère d'étudier l'application téléphone.
Basée sur la mise en œuvre muet semble fonctionner lorsqu'il n'est pas un appel, mais il peut y avoir des problèmes spécifiques de matériel sur les plates-formes nous n'avons pas étudié ici.
EDIT:
Fait un peu plus creuser et à la manière d'envoyer un mute de commande pour le modem CPU est par l'intermédiaire de la ligne Téléphonique interne de l'interface qui fait partie de la com.android.interne.téléphonie package n'est pas disponible pour les développeurs du SDK. Basé sur le commentaire que vous avez vu que cette fonction ne doit être utilisée par des applications de remplacer l'audio de la gestion ou de l'original de l'application de téléphonie, je suppose que AudioManager.setMicrophoneMute() a été censé toujours mettre le microphone en sourdine, peu importe. Mais depuis d'autres applications utilisent probablement cela, ils ont ajouté un chèque dans la mise en œuvre du matériel afin de ne pas gâcher l'état de l'application téléphone qui garde la trace de coupé les connexions ainsi que le microphone. La fonction est probablement pas censé faire maintenant, à cause du matériel de détails de mise en œuvre et le fait que le silence est une opération beaucoup plus complexe que l'on pourrait d'abord penser lors de l'examen d'appel états.
RecognitionListener
est à l'écoute. C'est, si j'essaie d'appelermAudioManager.setMicrophoneMute(true)
à l'intérieur deRecognitionListener.onReadyForSpeech()
, rien ne se passe: Le microphone continue à accepter des discours, comme si la Sourdine n'ont jamais été appelés. Et il n'y a pas d'appel en cours! est-ce à dire que GoogleRecognitionListener
ensembles de système de Sonorisation::MODE_IN_CALL?onReadyForSpeech()
... Est-il un moyen pour accomplir ce tout? Ce n'remplacement de l'audio de gestion implique?Essayer de regarder les AudioManager code source:
La tâche de la mise en sourdine du microphone est déléguée à un service nommé IAudioService:
Qui, à son tour, délègue à Système de sonorisation qui semble être mis en œuvre dans code natif:
Qui, à son tour, délègue à IAudioFlinger que l'on trouve dans IAudioFlinger.cpp:
J'ai trouvé les mêmes questions sur le samsung Galaxy et je l'ai résolu en utilisant
MODE_IN_COMMUNICATION
mode.Dans le AudioManager.java source codeit dit :
MODE_IN_CALL
- Dans l'appel en mode audio. Un appel téléphonique est établie.MODE_IN_COMMUNICATION
De communication en mode audio. Une audio/vidéo de chat ou de VoIP appel est établi.Parce que j'utilise la troisième VOIP bibliothèque, j'utilise le
MODE_IN_COMMUNICATION
et il a résolu le problème.MODE_IN_COMMUNICATION
a fait le tour, j'ai essayé de désactiver/activer le micro à l'aide deMODE_IN_CALL
. Merci pour l'aide