2011-08-04 17 views
17

Tengo una aplicación que muestra un botón de alternar el altavoz cuando se usa en un teléfono. La palanca alterna 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 no tenga un auricular), me gustaría quitar la palanca, ya que todo el audio se enruta a través del altavoz.Detecta falta de auricular (solo altavoz) en un dispositivo Android

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

Intenté solucionar el problema llamando al AudioManager.setSpeakerphoneOn(false), luego revisando AudioManager.isSpeakerphoneOn(), con la esperanza de que seguiría siendo cierto y podría desactivarlo. El sistema devolvió false, aunque el audio sigue enrutando a través del altavoz.

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

+1

FYI, no creo que la capacidad de la telefonía será fiable, por ejemplo, el Samsung Galaxy Tab que tengo admite telefonía, pero no tiene un altavoz de auricular. http://en.wikipedia.org/wiki/Samsung_Galaxy_Tab –

+1

¿Has verificado esto? http://developer.android.com/training/managing-audio/audio-output.html – Dusko

+0

Gracias stetocina, pero desafortunadamente no hay nada en esos documentos con respecto a la detección de hardware de salida de audio. – Josh

Respuesta

2

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

ahora he criado 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 edición de Google para votar por ella!

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

Como solución puede que desee para ocultar la característica en dispositivos aproximada por (todos estos enfoques tienen inconvenientes):

  • aquellos con grandes pantallas adicionales (es decir, tabletas)
  • los que no tienen soporte de telefonía
  • use una lista blanca/negra configurable de los dispositivos principales que no tienen un auricular.

FTR, si utiliza this answer para dirigir audio al auricular, allí no parece haber ningún lado negativo afecta a ejecutar ese código en el Xoom (OS 3.1) o el Samsung Galaxy Tab (OS 2.2) - el audio simplemente continúa reproduciéndose a través del altavoz externo. No he tenido oportunidad de probar si todavía hay interacciones con los auriculares Bluetooth.

+0

Logré hackearlo, funcionó bien en Lollipop donde acabo de probar ... Ver mi respuesta para más detalles – milosmns

-3

Esto se puede comprobar mediante el Administrador de audio

Audio Manager

y también buscar

Head Set Plugged

+3

Lo siento, esta pregunta no es sobre auriculares con cable. La pregunta original hace referencia a los métodos en AudioManager, por lo que ya lo sabemos. –

1

Como usted puede ser consciente, esto no se puede hacer usando la corriente de la API de Android.

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

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

Si desea ver el código de la interfaz de hardware de audio para el Nexus 7, it's here

-2
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 se puede comprobar por audio.isSpeakerphoneOn()

Espero que esto funcione si recibo tu problema es correcto

+2

Lo sentimos, no, la pregunta es sobre el auricular incorporado, no los auriculares con cable. Además, isWiredHeadsetOn() está en desuso, y sus documentos dicen "Esta no es una indicación válida de que la reproducción de audio se realice realmente a través de los auriculares con cable, ya que el enrutamiento de audio depende de otras condiciones". –

3

Así que la parte fea es que Google está ignorando el problema. La parte bonita es que me las arreglé para hacer el chequeo para el auricular, y en 5 de 5 dispositivos funcionó bien (probado en 5.0, 5.1, 6.0). Y de nuevo, la parte fea es que esto es sólo mala, código inestable y que es hacky, pero hasta que publican una mejor API, no podía hacer mucho ..

Aquí está la piratear:

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 a mejoras edita si tiene algo mejor :)

+0

Caveat emptor: No lo he depurado demasiado, pero he visto este método devolver "verdadero" y "falso" en un teléfono BLU Advance (Android 5.1) que definitivamente tiene un auricular. De acuerdo, estaba usando este método junto con algún código heredado que no funciona con el AudioManager, pero creo que campos como DEVICE_OUT_EARPIECE serían estáticos e independientes de los errores. –

+0

Sí, es un poco hacky, no estoy seguro de por qué sucede eso. – milosmns

Cuestiones relacionadas