2011-03-07 14 views
8

no pude encontrar ningún puesto relacionado aquí (pero otros pequeños mensajes en Internet), así que aquí está:setMicrophoneMute (booleano) no funciona en algunos dispositivos

AudioManager.setMicrophoneMute (booleano) doesn' Hago algo en algunos dispositivos en particular con los que probé: Google Nexus S, Samsung Galaxy S y Motorola Milestone. En cualquier otro dispositivo, funciona bien.

Incluso mantiene su "estado" y devuelve un valor booleano como si fuera silenciado \ no silenciado, pero no se silencia - el micrófono continúa grabando - tanto en la llamada GSM como en la grabación programática AudioRecord. No hay un mensaje de registro indicativo.

También cometí un error con los permisos (android.permission.MODIFY_AUDIO_SETTINGS, android.permission.RECORD_AUDIO), nada nuevo aquí.

¿Alguien más se encontró con eso? ¿Alguien tiene una solución alternativa o mágica? Si utilizo AudioRecord, simplemente implemento mi propio "silencio" para estos dispositivos; no transfiero los búferes grabados. Pero no me puede ayudar a silenciar el micrófono en una llamada GSM, que necesito.

Gracias

actualización ---------------- ----------------

Véase más adelante.

+0

llegaste a algún lado con esto? – Bear

Respuesta

5

Hola tuve el mismo problema que quería simular la pantalla de llamadas entrantes. y dentro de esa pantalla un botón que funciona en silencio, y el AudioManager.setMicrophoneMute (booleano) funcionó en la mayoría de los teléfonos, pero no en todos. Encontré una manera de evitarlo. simulo una prensa en el botón de silencio en el kit de manos libres. que trabajó para mí esperan que ayude a ti también aquí está el código:

Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON); 
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT,new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK)); 
getBaseContext().sendOrderedBroadcast(buttonUp,"android.permission.CALL_PRIVILEGED"); 
3

No se encontraron soluciones. Si el audio grabado se usa como un búfer de datos, utilice datos PCM silenciosos (llene con ceros). Si necesita silenciar una llamada telefónica de forma programática, informe al usuario que este dispositivo requiere enmudecimiento manual desde la pantalla de llamadas.

Considero que esta es la respuesta final, pero por favor, sorpresa.

2

se puede tratar con esto:

AudioManager audioManager = ((AudioManager)context.getSystemService(Context.AUDIO_SERVICE)); 
    audioManager.setMode(AudioManager.MODE_NORMAL); 
    if(state) //state-boolean 
    { 
     audioManager.setMicrophoneMute(false); 
     audioManager.setMode(AudioManager.MODE_IN_CALL); 
     state= false; 
    } 
    else 
    { 
     audioManager.setMicrophoneMute(true); 
     state = true; 
    } 
5

he tenido este problema porque quería editar archivos M4A que contienen audio AAC datos. Quería poder fusionarlos y agregar silencio como relleno. Debido a la diferencia en el número de milisegundos por cuadro en diferentes dispositivos, decidí silenciar el micrófono y grabar un segundo de silencio, y luego repetirlo una y otra vez cada vez que necesitaba silencio. (El silencio M4A + AAC es MUCHO más complicado que el PCM en bruto).

Lamentablemente, me encontré con muchas diferencias de exclusión entre dispositivos Android. Esto es lo que aprendí:

  • Muting fallará silenciosamente a menos que use el permiso MODIFY_AUDIO_SETTINGS. No hay mensaje de error, simplemente no silenciará
  • El Samsung Galaxy Tab 10.1 y Motorola Xoom funcionan como era de esperar. Llame a audioManager.setMicrophoneMute (true) para silenciar y audioManager.setMicrophoneMute (falso) para dejar de silenciar
  • El HTC Inspire (con CyanogenMod 7) y Motorola Droid X incorrectamente devolverá como verdadero a audioManager.isMicrophoneMute, pero en realidad no se silenciará. Para solucionar esto, antes de silenciar, llame a audioManager.setMode (AudioManager.MODE_IN_CALL). Asegúrese de cambiar el modo de nuevo a lo que era originalmente una vez que haya terminado de silenciar: no estoy seguro, pero parecía que podría haber problemas en otras aplicaciones si lo deja configurado en el modo incorrecto.
  • La HP Touchpad, hackeada a dualboot a CyanogenMod 7, no le gusta el silenciamiento en absoluto. Produce archivos de grabación inútiles, y las llamadas a audioManager.setMode() tardan cinco segundos en regresar.
  • El HTC MyTouch 4G dice que está silenciado, pero no se silenciará bajo ninguna condición que yo pueda encontrar.
  • HTC Flyer se silenciará, pero tan pronto como llame a mediaRecorder.start() o mediaRecorder.stop() se desconectará solo. Puede silenciarlo de nuevo, pero puede captar una fracción de segundo de sonido primero.
  • Los dispositivos de pan de jengibre, lo quieras o no, tendrán entre medio segundo y un segundo de silencio al comienzo de cualquier grabación de MediaRecorder. La grabación general es la correcta, esta primera parte se silencia en lugar de capturar lo que el micrófono estaba recibiendo en ese momento.

En mi caso, para generar un archivo de silencio con el número apropiado de Millis por marcos de los usos dispositivo dado (lo que es compatible cuando la fusión con otros archivos de audio), que utilizan un código similar a este:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
int oldAudioMode = audioManager.getMode(); 
audioManager.setMode(AudioManager.MODE_IN_CALL); 
audioManager.setMicrophoneMute(true); 
MediaRecorder mediaRecorder = new MediaRecorder(); 
int bitRate = 1000 * 160; 
mediaRecorder.setAudioEncodingBitRate(bitRate); 
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
mediaRecorder.setOutputFile(silenceFile.getAbsolutePath()); 
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
mediaRecorder.setAudioSamplingRate(44100); 
try { 
    mediaRecorder.prepare(); 
} catch (IOException ioe) { 
    throw new RuntimeException("could not prepare mediarecorder to create silence file",ioe); 
} 
mediaRecorder.start(); 
audioManager.setMicrophoneMute(true); //re-mute for devices like HTC Flyer that unmute 
try { 
    Thread.sleep(SILENCE_LENGTH_MILLIS); 
} catch (InterruptedException ie) { 
    throw new RuntimeException("could not record silence file", ie); 
} 
mediaRecorder.stop(); 
audioManager.setMicrophoneMute(false); 
audioManager.setMode(oldAudioMode); 
int currentVersion = android.os.Build.VERSION.SDK_INT; 
if (currentVersion <= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) { 
    //cut out beginning half second and use that, since it's always silent on Gingerbread 
} else { 
    //Honeycomb and up 
    //Take end of audio and use that--if the device unmuted itself there may be a little noise at the beginning 
} 

¿Es esta una solución completa? No. Algunos dispositivos NO se silenciarán. Otros dispositivos, como el Panel táctil HP mencionado anteriormente, causan todos los problemas nuevos si intenta silenciarlos. Esperemos que estos consejos al menos ayuden a las personas a silenciar la mayoría de los dispositivos con Android.

Cuestiones relacionadas