vez tiene tambien sonido solo samsung salidas salida porque pongo movil los escuchan escucha celular cambiar auriculares auricular audifonos altavoz altavoces android

android - tiene - porque mi celular no se escucha sin audifonos



Detectar la falta de auricular(solo altavoz) en un dispositivo Android (5)

Tengo una aplicación que muestra un botón de activación del altavoz cuando se usa en un teléfono. El conmutador cambia el enrutamiento de audio entre el auricular del teléfono y el altavoz. Sin embargo, cuando la aplicación se ejecuta en una tableta (o en cualquier dispositivo que carece de un auricular), me gustaría quitar la palanca, ya que todo el audio se enruta a través del altavoz.

Idealmente, me gustaría usar algún tipo de llamada isEarpiecePresent() , o tal vez marcar una isEarpiecePresent() en algún objeto de configuración para encontrar esta información, pero no puedo encontrar nada de eso en la API.

AudioManager.setSpeakerphoneOn(false) el problema llamando a AudioManager.setSpeakerphoneOn(false) , luego verificando AudioManager.isSpeakerphoneOn() , con la esperanza de que aún fuera cierto y podría descartarlo. El sistema devolvió el valor false , aunque el audio todavía se está enrutando a través del altavoz.

Actualmente estoy pensando en verificar la capacidad de telefonía, aunque eso no encaja exactamente. ¿Alguna otra idea?


Así que la parte fea es que Google está ignorando el problema. La parte bonita es que logré hacer la verificación del auricular, y en 5/5 dispositivos funcionó bien (probado en 5.0, 5.1, 6.0). Y de nuevo, la parte fea es que esto es simplemente un código malo e inestable y que es intrépido, pero hasta que publiquen una API mejor, no pude hacer mucho ...

Aquí está el hack :

private Boolean mHasEarpiece = null; // intentionally ''B'' instead of ''b'' public boolean hasEarpiece() { if (mHasEarpiece != null) { return mHasEarpiece; } // not calculated yet, do it now try { Method method = AudioManager.class.getMethod("getDevicesForStream", Integer.TYPE); Field field = AudioManager.class.getField("DEVICE_OUT_EARPIECE"); int earpieceFlag = field.getInt(null); int bitmaskResult = (int) method.invoke(mAudioManager, AudioManager.STREAM_VOICE_CALL); // check if masked by the earpiece flag if ((bitmaskResult & earpieceFlag) == earpieceFlag) { mHasEarpiece = Boolean.TRUE; } else { mHasEarpiece = Boolean.FALSE; } } catch (Throwable error) { Log.e(TAG, "Error while checking earpiece! ", error); mHasEarpiece = Boolean.FALSE; } return mHasEarpiece; }

Estoy abierto para ediciones de mejora si tienes algo mejor :)


Como puede que ahora sepa, esto no se puede hacer usando la API actual de Android.

La interfaz del hardware de audio es propietaria, es decir, escrita por los fabricantes para su hardware y tiene que admitir ciertas llamadas del sistema Android para que sea compatible con las aplicaciones desarrolladas con el SDK de Android.

Incluso si encuentra una forma de evitar la falta de soporte de API para un dispositivo, es posible que no funcione en todos los dispositivos. El ejemplo de AudioManager.setSpeakerphoneOn(false) puede funcionar muy bien para dispositivos, ya que todo depende de cómo se haya escrito la interfaz del Hardware de audio. Supongo que la mayoría de las tabletas tratarán el enrutamiento de audio para el auricular y el altavoz de la misma manera si no hay un auricular.

Si desea consultar el código de la interfaz de hardware de audio para el Nexus 7, está aquí


He investigado esto y, lamentablemente, no puedo encontrar ningún soporte de API para detectar si existe un auricular.

Ahora he planteado esto con Google como una solicitud de función:
http://code.google.com/p/android/issues/detail?id=37623

Si está de acuerdo con la función, haga clic en la estrella en la parte inferior de la página de problemas de Google para votar por ella.

Muchos usuarios han planteado el problema de que Google Talk no ofrece la opción de alternar entre el altavoz y el auricular, lo que quizás sugiere la ausencia de una API adecuada ...
http://code.google.com/p/android/issues/detail?id=19221

Como solución alternativa, es posible que desee ocultar la función en dispositivos aproximados por (todos estos enfoques tienen inconvenientes):

  • aquellos con pantallas extra grandes (es decir, tabletas)
  • Aquellos que no tienen soporte telefónico
  • use una lista blanca / negra configurable de los dispositivos principales que no tienen un auricular.

FTR, si usa esta respuesta para enrutar el audio al auricular, parece que no hay ningún lado negativo que afecte la ejecución de ese código en el Xoom (OS 3.1) o el Samsung Galaxy Tab (OS 2.2); el audio simplemente continúa jugar a través del altavoz externo. No he tenido la oportunidad de probar si hay interacciones con los auriculares Bluetooth todavía.



public boolean isEarPieceConnected() { AudioManager audio = (AudioManager) this .getSystemService(Context.AUDIO_SERVICE); if (audio.isWiredHeadsetOn()) { Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); return true; } else { Toast.makeText(this, "Not Connected", Toast.LENGTH_SHORT).show(); return false; } }

También puede verificar si hay audio.isSpeakerphoneOn ()

Espero que esto funcione si estoy solucionando tu problema.