Volumen de auriculares de enlace de Android al volumen principal
Tengo un androide TV (Philips 49PUS6401) Quiero conectar un sistema de sonido envolvente a él que es mucho mejor calidad que los altavoces incorporados, incluso cuando sólo se utiliza en estéreo.
Sin embargo, este televisor separa el control de volumen de la salida master y la salida de los auriculares, y el resultado es que incluso con los altavoces de TV desconectados, las teclas de volumen del mando a distancia no ajustan el volumen de los auriculares fuera)
- Emulador de Android TV con API de Google
- Cómo cambiar el color de fondo del área de información en un ImageCardView?
- Utilizar la API de Youtube en Android TV
- Hacer que la aplicación AndroidTV funcione en FireTV
- Aplicación para enviar el comando hdmi cec
Estoy planeando escribir una aplicación sencilla para ajustar el volumen de los auriculares cada vez que se cambia el volumen del mástil, pero no puedo encontrar la forma de obtener o ajustar el volumen de los auriculares, ya que el administrador de audio se ocupa de los flujos en lugar de las salidas. El único valor que puedo obtener de él es el maestro.
¿Cómo puedo encontrar una forma de obtener / configurar el volumen de los auriculares? Tengo acceso de shell a través de adb, pero no puedo obtener root.
Para la referencia el tv está funcionando el último firmware, que es androide 5.1.1
- ¿Cómo aumentar el tamaño de un elemento centrado en un recyvlerview?
- Cómo implementar más de 2 niveles de navegación en com.android.support:leanback-v17
- El emulador de Android TV está en blanco. ¿Cómo puedo ver aplicaciones como Google Play Store y otras aplicaciones?
- Establecer márgenes entre elementos en BrowseFragment
- API de llamada en el proveedor de contenido para la búsqueda global
- Android TV RecyclerView interacción con el foco
- Aplicación de Android TV
- Multiple ListRows para cada encabezado en BrowseFragment - Biblioteca de Leanback
Según entiendo, es un problema común de los usuarios de Philips para Android TV (por ejemplo, página 22 en este hilo o en esa discusión). En general, la plantilla para su tarea es el Service
que el seguimiento de enchufe / desenchufar el evento y el volumen de "sistema / música" corriente de audio (o presionar el botón de medios) que hacer los cambios correspondientes en "auriculares con cable" de audio "stream" (no hay tal flujo En "estándar" de Android, pero obviamente algo así como el presente en "Android Philips" ) de nivel. El problema es que parece ser imposible cambiar el volumen de "wiredheadphones" nivel de flujo de audio con sólo Android SDK sin "Philips Android TV API" (probablemente no es un público).
El código fuente de la plantilla para "VolumeTrackingService" puede ser algo como esto:
public class VolumeTrackingService extends Service { private static final String TAG = VolumeTrackingService.class.getSimpleName(); public static final String ACTION_START = "VolumeTrackingService.ACTION_START"; public static final String ACTION_STOP = "VolumeTrackingService.ACTION_STOP"; HeadsetPlugIntentReceiver mHeadsetPlugReceiver; private static boolean mHeadsetPlugged = false; private SettingsContentObserver mSettingsContentObserver; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mHeadsetPlugReceiver = new HeadsetPlugIntentReceiver(); registerReceiver(mHeadsetPlugReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); mSettingsContentObserver = new SettingsContentObserver(new Handler()); getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver); } @Override public void onDestroy() { getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver); unregisterReceiver(mHeadsetPlugReceiver); super.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { String actionRequested = intent.getAction(); if (ACTION_START.equals(actionRequested)) { } else if (ACTION_STOP.equals(actionRequested)) { stopSelf(); } } return START_STICKY; } private int getSystemVolumeInPercentage() { AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); final int streamVolumeMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); final int streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); return 100 * streamVolume / streamVolumeMax; } private void setHeadphonesVolume(int volumeInPercentage) { // there should be magic of wired headphones volume level changing } private void processVolumeChanges() { if (mHeadsetPlugged) { int systemVolumeInPercentage = getSystemVolumeInPercentage(); setHeadphonesVolume(systemVolumeInPercentage); } } public class SettingsContentObserver extends ContentObserver { public SettingsContentObserver(Handler handler) { super(handler); } @Override public boolean deliverSelfNotifications() { return super.deliverSelfNotifications(); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); if (mHeadsetPlugged ) { processVolumeChanges(); } } } public class HeadsetPlugIntentReceiver extends android.content.BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { if (intent.getAction().equals(android.media.AudioManager.ACTION_HEADSET_PLUG)) { mHeadsetPlugged = intent.getIntExtra("state", 0) == 1; } } } }
Lamentablemente no resuelve el problema principal: cambiar el nivel de volumen de los auriculares con cable (probablemente es imposible sin "Philips Android TV API").
Pero si su sistema de sonido envolvente tiene control remoto Usted puede hacer alguna solución: emular los comandos de control remoto del sistema de sonido en el Service
descrito anteriormente y enviarlo a través de un dongle de infrarrojos conectado a USB Host de su Philips 49PUS6401 Android TV.