4 votes

Erreur Android sdk - AudioManager.isMicrophoneMute() toujours faux

Comme le titre l'indique AudioManager.isMicrophoneMute() renvoie toujours false, quoi qu'il arrive.

La mise en place :

Le manifeste inclut cette permission à cause d'un ancien bogue qui pourrait être lié à ceci. L'ancien bogue concernait la vérification de l'utilisation des écouteurs. Cela n'aide pas, mais ne fait pas de mal non plus.

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

  1. Initier un appel dans l'émulateur à partir de telnet.
  2. Décroche le téléphone
  3. Vérifier l'état de l'application audioManager.getMode() == audioManager.MODE_IN_CALL est true . Ok, nous sommes bons
  4. Vérification du statut audioManager.isMicrophoneMute() est false - ok, on est toujours bon
  5. Revenez au téléphone et appuyez sur le bouton Mute.
  6. Passez à l'application, vérifiez audioManager.isMicrophoneMute() et c'est toujours false - Pas bon. Ça devrait être vrai.

S'agit-il d'une API cassée ? Ou ai-je besoin d'autres autorisations ? Ou est-ce que cela ne fonctionne pas sur l'émulateur ?

Merci.

5voto

Yury Points 10837

J'ai fait une petite recherche et vérifié les sources d'Android. En fait, le problème se situe dans l'application Téléphone par défaut dans le fichier packages/apps/Phone/src/com/android/phone/PhoneUtils.java . Voici la fonction :

 /**
 * Internally used muting function.
 */
private static void setMuteInternal(Phone phone, boolean muted) {
    final PhoneGlobals app = PhoneGlobals.getInstance();
    Context context = phone.getContext();
    boolean routeToAudioManager =
        context.getResources().getBoolean(R.bool.send_mic_mute_to_AudioManager);
    if (routeToAudioManager) {
        AudioManager audioManager =
            (AudioManager) phone.getContext().getSystemService(Context.AUDIO_SERVICE);
        if (DBG) log("setMuteInternal: using setMicrophoneMute(" + muted + ")...");
        audioManager.setMicrophoneMute(muted);
    } else {
        if (DBG) log("setMuteInternal: using phone.setMute(" + muted + ")...");
        phone.setMute(muted);
    }
    app.notificationMgr.updateMuteNotification();
}

Vous pouvez voir que si vous cliquez sur le bouton Mute l'application téléphonique vérifie le paramètre R.bool.send_mic_mute_to_AudioManager qui est installé à false (J'ai vérifié dans les sources). Ainsi, dans ce cas l'état est au téléphone, qui est une instance de la classe GSMPhone. Cette classe communique avec le socket RIL et y envoie la requête appropriée pour setMute ( RIL_REQUEST_SET_MUTE ). Ainsi, nulle part sur le chemin de la commande l'état de AudioManager n'est mis à jour. De même, je ne vois pas que AudioManager notifie au RIL quand il change l'état du microphone.

Ainsi, si vous demandez à AudioManager l'état du microphone, il renvoie la valeur par défaut (qui est false). Je ne sais pas si ce comportement est attendu ou si c'est un bug. Vous pouvez poser la question dans le groupe Android-platform et faire un lien vers cette question et ce bug.

0voto

Vadim Points 95

Cela fonctionne maintenant dans 5.x Lollipop. Cela ne fonctionne toujours pas avec la version 4.x. Peut-être que Google ne veut pas corriger le problème pour les anciens systèmes d'exploitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X