我有一台安卓电视(飞利浦49PUS6401)
我想连接一个环绕声系统,它比内置扬声器质量好得多,即使只用于立体声.
我想连接一个环绕声系统,它比内置扬声器质量好得多,即使只用于立体声.
然而,这台电视分离主输出和耳机输出的音量控制,结果是即使关闭电视扬声器,遥控器上的音量键也不会调整耳机音量(我用作线路出)
我打算写一个简单的应用程序,以便在桅杆音量改变时调整耳机音量,但我似乎无法弄清楚如何获取或设置耳机音量,因为音频管理器处理流而不是输出,所以我能从中得到的唯一价值就是主人.
如何找到获取/设置耳机音量的方法?
我通过adb获得了shell访问权限,但我无法获得root权限.
作为参考,电视正在运行最新的固件,这是Android 5.1.1
解决方法
据我所知,这是飞利浦Android TV用户的常见问题(例如
this篇中的第22页,或
that讨论).
一般来说,您的任务的模板是跟踪插入/拔出事件和“系统/音乐”音频流(或媒体按钮按下)的音量的服务,而不是对“有线耳机”音频“流”进行相应的更改(没有这样的流在“标准”Android中,但显然
类似于 “Android Philips”级别的东西.问题是,似乎不可能只使用没有“飞利浦Android TV API”的Android SDK来改变音量“有线耳机”音频流级别(可能它不是公共的).
一般来说,您的任务的模板是跟踪插入/拔出事件和“系统/音乐”音频流(或媒体按钮按下)的音量的服务,而不是对“有线耳机”音频“流”进行相应的更改(没有这样的流在“标准”Android中,但显然
类似于 “Android Philips”级别的东西.问题是,似乎不可能只使用没有“飞利浦Android TV API”的Android SDK来改变音量“有线耳机”音频流级别(可能它不是公共的).
“VolumeTrackingService”的模板源代码可能是这样的:
- 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;
- }
- }
- }
- }
不幸的是,它没有解决主要问题:改变有线耳机的音量水平(如果没有“飞利浦Android TV API”,可能是不可能的).
但是如果你的环绕声系统有遥控器你可以做一些解决方法:在上述服务中模拟音响系统遥控器命令,并通过连接到飞利浦49PUS6401 Android TV的USB主机的红外加密狗发送.