Android链接耳机音量到主音量

前端之家收集整理的这篇文章主要介绍了Android链接耳机音量到主音量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一台安卓电视(飞利浦49PUS6401)
我想连接一个环绕声系统,它比内置扬声器质量好得多,即使只用于立体声.

然而,这台电视分离主输出和耳机输出的音量控制,结果是即使关闭电视扬声器,遥控器上的音量键也不会调整耳机音量(我用作线路出)

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

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

作为参考,电视正在运行最新的固件,这是Android 5.1.1

解决方法

据我所知,这是飞利浦Android TV用户的常见问题(例如 this篇中的第22页,或 that讨论).
一般来说,您的任务的模板是跟踪插入/拔出事件和“系统/音乐”音频流(或媒体按钮按下)的音量的服务,而不是对“有线耳机”音频“流”进行相应的更改(没有这样的流在“标准”Android中,但显然
类似于 “Android Philips”级别的东西.问题是,似乎不可能只使用没有“飞利浦Android TV API”的Android SDK来改变音量“有线耳机”音频流级别(可能它不是公共的).

“VolumeTrackingService”的模板源代码可能是这样的:

  1. public class VolumeTrackingService extends Service {
  2.  
  3. private static final String TAG = VolumeTrackingService.class.getSimpleName();
  4.  
  5. public static final String ACTION_START = "VolumeTrackingService.ACTION_START";
  6. public static final String ACTION_STOP = "VolumeTrackingService.ACTION_STOP";
  7.  
  8. HeadsetPlugIntentReceiver mHeadsetPlugReceiver;
  9. private static boolean mHeadsetPlugged = false;
  10.  
  11. private SettingsContentObserver mSettingsContentObserver;
  12.  
  13. @Nullable
  14. @Override
  15. public IBinder onBind(Intent intent) {
  16. return null;
  17. }
  18.  
  19. @Override
  20. public void onCreate() {
  21. super.onCreate();
  22. mHeadsetPlugReceiver = new HeadsetPlugIntentReceiver();
  23. registerReceiver(mHeadsetPlugReceiver,new IntentFilter(Intent.ACTION_HEADSET_PLUG));
  24. mSettingsContentObserver = new SettingsContentObserver(new Handler());
  25. getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI,true,mSettingsContentObserver);
  26. }
  27.  
  28. @Override
  29. public void onDestroy() {
  30. getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver);
  31. unregisterReceiver(mHeadsetPlugReceiver);
  32. super.onDestroy();
  33. }
  34.  
  35. @Override
  36. public int onStartCommand(Intent intent,int flags,int startId) {
  37. if (intent != null) {
  38. String actionRequested = intent.getAction();
  39. if (ACTION_START.equals(actionRequested)) {
  40. } else if (ACTION_STOP.equals(actionRequested)) {
  41. stopSelf();
  42. }
  43. }
  44. return START_STICKY;
  45. }
  46.  
  47. private int getSystemVolumeInPercentage() {
  48. AudioManager audioManager = (AudioManager) getSystemService(Context.AUdio_SERVICE);
  49. final int streamVolumeMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
  50. final int streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
  51. return 100 * streamVolume / streamVolumeMax;
  52. }
  53.  
  54. private void setHeadphonesVolume(int volumeInPercentage) {
  55. // there should be magic of wired headphones volume level changing
  56. }
  57.  
  58. private void processVolumeChanges() {
  59. if (mHeadsetPlugged) {
  60. int systemVolumeInPercentage = getSystemVolumeInPercentage();
  61. setHeadphonesVolume(systemVolumeInPercentage);
  62. }
  63. }
  64.  
  65.  
  66. public class SettingsContentObserver extends ContentObserver {
  67.  
  68. public SettingsContentObserver(Handler handler) {
  69. super(handler);
  70. }
  71.  
  72. @Override
  73. public boolean deliverSelfNotifications() {
  74. return super.deliverSelfNotifications();
  75. }
  76.  
  77. @Override
  78. public void onChange(boolean selfChange) {
  79. super.onChange(selfChange);
  80. if (mHeadsetPlugged ) {
  81. processVolumeChanges();
  82. }
  83. }
  84. }
  85.  
  86. public class HeadsetPlugIntentReceiver extends android.content.BroadcastReceiver {
  87. @Override
  88. public void onReceive(Context ctx,Intent intent) {
  89. if (intent.getAction().equals(android.media.AudioManager.ACTION_HEADSET_PLUG)) {
  90. mHeadsetPlugged = intent.getIntExtra("state",0) == 1;
  91. }
  92. }
  93. }
  94. }

不幸的是,它没有解决主要问题:改变有线耳机的音量水平(如果没有“飞利浦Android TV API”,可能是不可能的).

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

猜你在找的Android相关文章