android - suenan - soundabout como usar
¿Hay alguna forma de forzar el audio a través de los altavoces cuando los auriculares están conectados? (4)
Gracias a algunos comentarios aquí, y después de algunas búsquedas, finalmente descubrí cómo hacer esto.
Mi código de abajo se llama cuando presiono un botón. Configura el audio para activar los altavoces mientras llama, luego llama al número.
Preste atención a los comentarios en mi código con respecto a los permisos.
buttonRep.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//1) we need to detect once the call has been established
//Note : this requires READ_PHONE_STATE permission in your manifest
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(new PhoneStateListener()
{
@SuppressWarnings("unused")
@Override
public void onCallStateChanged (int state, String incomingNumber)
{
if(state == TelephonyManager.CALL_STATE_OFFHOOK) //Here we are
{
//2) we switch sound to speakers
//Note : this requires MODIFY_AUDIO_SETTINGS permission in your manifest
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_CALL);
am.setSpeakerphoneOn(true);
int i = state;
//3) we don''t need this call listener anymore so we "destroy it"
tm.listen(this, PhoneStateListener.LISTEN_NONE);
}
}
}
, PhoneStateListener.LISTEN_CALL_STATE);
//4) we are ready to place our call now
//Note : this requires CALL_PHONE permission in your manifest
Intent action = new Intent();
action.setAction(Intent.ACTION_CALL);
action.setData(Uri.parse("tel:660")); //660 is my answering-machine number :)
MainActivity.this.startActivity(action);
}
});
He probado lo recomendado
setSpeakerphoneOn(true)
y el no recomendado
AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_SPEAKER);
pero ninguno ha funcionado.
He intentado
setWiredHeadsetOn(false)
pero eso tampoco funciona, y está en desuso.
Curiosamente,
isSpeakerphoneOn()
informes de verdad, al igual que
isWiredHeadsetOn()
Además, se establece el siguiente permiso
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Intenta hacer esto:
AudioManager manager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(manager.isWiredHeadsetOn())
{
manager.setWiredHeadsetOn(false);
manager.setSpeakerphoneOn(true);
manager.setRouting(AudioManager.MODE_CURRENT, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
manager.setMode(AudioManager.MODE_CURRENT);
}
Necesitará este permiso:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
La respuesta resultó ser la siguiente, con consejos de Android: conseguir que el audio se reproduzca a través del auricular
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
Ignore setRouting, no hace nada en APK> 10. Ignore los comentarios sobre setMode. Ignora los comentarios sobre setWiredHeadsetOn. Asegúrate de tener permisos MODIFY_AUDIO.
Prueba esto:
AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
IntentFilter iFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
Intent iStatus = getApplicationContext().registerReceiver(null, iFilter);
boolean isHeadsetOn = false;
if (iStatus != null) {
isHeadsetOn = iStatus.getIntExtra("state", 0) == 1;
}
if(mAudioManager.isWiredHeadsetOn() || isHeadsetOn)
{
//When headphones are plugged
mAudioManager.setMode(AudioManager.MODE_CURRENT);
mAudioManager.setSpeakerphoneOn(true);
}else {
//When headphones are not plugged
mAudioManager.setMode(AudioManager.MODE_IN_CALL);
mAudioManager.setSpeakerphoneOn(true);
}