2016-10-31 4 views
8

나는 안드로이드 TV (Philips 49PUS6401) 스테레오에서만 사용되는 경우에도 내장 스피커보다 훨씬 우수한 품질의 서라운드 사운드 시스템을 연결하고 싶습니다.안드로이드 링크 헤드폰 볼륨 대 마스터 볼륨

그러나이 TV는 마스터 출력과 헤드폰 출력의 볼륨 컨트롤을 분리하므로 TV 스피커가 꺼져 있어도 리모컨의 볼륨 키가 헤드폰 볼륨을 조정하지 않습니다.

마스트 볼륨이 변경 될 때마다 헤드폰 볼륨을 조정하는 간단한 앱을 작성할 계획이지만 헤드폰 볼륨을 가져 오거나 설정하는 방법을 알 수없는 것처럼 보입니다. 오디오 관리자는 출력이 아닌 스트림을 처리하므로 마스터에서 얻을 수있는 유일한 가치가 있습니다.

헤드폰 볼륨을 가져 오거나 설정하는 방법을 찾는 방법은 무엇입니까? adb를 통해 셸 액세스 권한이 있지만 루트 권한을 얻을 수 없습니다.

는 참조 용 TV가 최신 나는 그것이 필립스 안드로이드 TV 사용자의 일반적인 문제입니다 알고있는 것처럼 5.1.1

+1

android는 마스터와 헤드폰 출력을 구별하지 않습니다. 스트림을 조정할 수 있습니다. https://developer.android.com/reference/android/media/AudioManager.html#adjustStreamVolume(int,%20int,%20int) – njzk2

+0

정상적으로는 알 수 없지만 이 TV는 헤드폰이 항상 활성화되어 있고 볼륨이 별도로 제어되도록 출력을 트윈 조절할 수 있습니다. 이것은 지원 포럼에 널리 언급되어 있으며 일부 Sony TV에도이 문제가 있습니다. http://www.supportforum.philips.com /en/archive/index.php/t-1361.html –

+0

TV 헤드폰 출력은 HDMI 입력의 오디오만을위한 것이라고 생각하십니까? 맞습니까? –

답변

1

안드로이드입니다 펌웨어 (this 스레드에서 예를 피합니다. (22), 또는 that 토론)를 실행 . 일반적으로 작업 템플릿은 Service이며 "유선 헤드폰"오디오 "스트림"에서 해당 변경 사항을 수행하는 것보다 "시스템/음악"오디오 스트림 (또는 미디어 버튼 누름)의 플러그/플러그 이벤트 및 볼륨을 추적합니다 (이러한 스트림은 "표준"안드로이드이지만, 분명히 같은 것을 "Android Philips"에 표시) 수준입니다. 문제는 "필립스 Android TV API"가 없어도 Android SDK 만 사용하여 볼륨 "유선 헤드폰"오디오 스트림 수준을 변경할 수없는 것 같습니다 (아마 공개적으로 아닐 것입니다). (아마 "필립스 안드로이드 TV의 API '없이 불가능) 유선 헤드폰의 변화 볼륨 레벨 :

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; 
      } 
     } 
    } 
} 

불행하게도이 주요 문제를 해결하지 :"VolumeTrackingService "에 대한

템플릿 소스 코드는 다음과 같이 할 수있다.

서라운드 사운드 시스템에 리모콘이있는 경우 위에 설명 된 Service의 사운드 시스템 리모컨 명령을 에뮬레이트하고 필립스 49PUS6401 Android TV의 USB 호스트에 연결된 IR 동글을 통해 전송할 수 있습니다.

+0

나는 당신이 나를 도울 수있는 간단한 프레임 워크를 쓸 시간을내어 주셔서 감사합니다. 그 음원의 볼륨 레벨이 바뀌는 마법의 마술이되어야합니다. . –

+0

나는 이해한다). 사실, 나는 생각한다. "그러나 서라운드 사운드 시스템에 원격 제어가있는 경우 위의 서비스에서 사운드 시스템 원격 제어 명령을 에뮬레이트하고 필립스 49PUS6401 Android TV의 USB 호스트에 연결된 IR 동글을 통해 보내면 해결할 수 있습니다." - 대답, 서비스 템플릿의 주요 부분 - 그냥 소개합니다. 일반적인 Android SDK 만 있으면 원하는 작업을 수행 할 수있는 방법이 없다고 생각합니다. –

+0

어떤 경우에도 원격 제어 신호를 시뮬레이트하여 서라운드 사운드 시스템의 볼륨을 조절할 수 있습니다. 그리고 IR 동글은 [this] (http://www.huitsing.nl/irftdi/)와 같이 간단하고 저렴 할 수 있습니다. 100 % 솔루션입니다. Philips Android TV에서 문제가 발생했기 때문에 (예 : SONY BRAVIA의 모든 기능이 원하는대로 작동 함). –