Android链接耳机音量到主音量

时间:2016-10-31 20:28:22

标签: android android-audiomanager android-tv

我有一台安卓电视(飞利浦49PUS6401) 我想连接一个环绕声系统,它比内置扬声器质量好得多,即使只用于立体声。

然而,这个电视分离了主输出和耳机输出的音量控制,结果是即使关闭电视扬声器,遥控器上的音量键也不会调节耳机音量(我对此进行了调节)。 m用作线路)

我计划编写一个简单的应用程序,以便在更改桅杆音量时调整耳机音量,但我似乎无法弄清楚如何获取或设置耳机音量,因为音频管理器处理流而不是输出,所以我可以从中得到的唯一价值就是主人。

如何找到获取/设置耳机音量的方法? 我通过adb获得了shell访问权限,但我无法获得root权限。

供参考,电视正在运行最新的固件,即android 5.1.1

1 个答案:

答案 0 :(得分:1)

据我所知,这是飞利浦Android TV用户的常见问题(例如this主题中的第22页,或that讨论)。 通常,您的任务的模板是Service跟踪插入/拔出事件和“系统/音乐”音频流(或媒体按钮按下)的音量,而不是对“有线耳机”音频“流”进行相应的更改(那里)在“标准”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”,可能就不可能了)。

但是如果你的环绕声系统有遥控器你可以做一些解决方法:在上面描述的Service中模拟音响系统遥控器命令,并通过连接到飞利浦49PUS6401 Android TV的USB主机的IR加密狗发送。< / p>