Alternativa para AudioManger.setStreamMute obsoleto?

AudioManger.setStreamMute ahora está obsoleto con api 23 y se prefiere usar AudioManager.adjustStreamVolume con AudioManager.ADJUST_MUTE.

Mi problema es que este tipo de bandera sólo es compatible con api 23, mientras que mi aplicación es api mínimo 16.

¿Existe otra forma de silenciar el sistema en su totalidad?

Si no es así, ¿por qué Google desaprueba este método?

2 Solutions collect form web for “Alternativa para AudioManger.setStreamMute obsoleto?”

La forma en que lo haría sería utilizar un bloque if / else para usar las llamadas adecuadas dependiendo de la versión de Android en la que se esté ejecutando la aplicación.

 // Change the stream to your stream of choice. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0); } else { am.setStreamMute(AudioManager.STREAM_MUSIC, true); } 

La respuesta aceptada funciona bien para silenciar el sistema, pero si necesita restaurar el estado (por ejemplo, cuando los usuarios hacen una pausa / salir de la aplicación), tenga en cuenta que la semántica de los métodos adjustStreamVolume y setStreamMute es diferente:

Para setStreamMute , de la documentación:

Las solicitudes de silencio para una emisión determinada son acumulativas: el AudioManager puede recibir varias solicitudes de silencio de uno o más clientes y la transmisión se desactiva sólo cuando se recibe el mismo número de solicitudes de silencio.

Esto no parece ser el caso de adjustStreamVolume con AudioManager.ADJUST_MUTE . En otras palabras, si el estado del flujo ya está silenciado antes de silenciarlo con setStreamMute (stream, true) , un setStreamMute (stream, false) inmediato setStreamMute (stream, false) lo dejará en estado silenciado, mientras que adjustStreamVolume con AudioManager.ADJUST_UNMUTE puede silenciar el flujo .

Dependiendo del caso de uso, para emular la semántica antigua, una forma es comprobar el estado de silencio antes de silenciar, algo como lo siguiente –

Silenciar:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!audioManager.isStreamMute(stream)) { savedStreamMuted = true; audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0); } } else { audioManager.setStreamMute(stream, true); } 

Para activar el sonido:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (savedStreamMuted) { audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0); savedStreamMuted = false; } } else { // Note that this must be the same instance of audioManager that mutes // http://stackoverflow.com/questions/7908962/setstreammute-never-unmutes?rq=1 audioManager.setStreamMute(stream, false); } 

Esto supone que es poco probable que los usuarios invoquen otra aplicación para silenciar el flujo intermedio y esperan que el flujo permanezca silenciado después de que su aplicación se silencie (de todos modos, no parece que haya manera de comprobarlo).

Incidentalmente, el método isStreamMute estaba previamente oculto, y sólo se mostró en la API 23, permitiendo su uso para este propósito.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.