Jam*_*ent 11 android android-audiomanager android-tv
我有一个Android电视(飞利浦49PUS6401)我想连接一个环绕声系统,它比内置扬声器质量好得多,即使只用于立体声.
然而,这台电视分离主输出和耳机输出的音量控制,结果是即使关闭电视扬声器,遥控器上的音量键也不会调整耳机音量(我用作一条线路)出)
我打算写一个简单的应用程序,以便在桅杆音量改变时调整耳机音量,但我似乎无法弄清楚如何获取或设置耳机音量,因为音频管理器处理流而不是输出,所以我能从中得到的唯一价值就是主人.
我如何找到获取/设置耳机音量的方法?我通过adb获得了shell访问权限,但我无法获得root权限.
作为参考,电视正在运行最新的固件,这是Android 5.1.1
据我了解,这是飞利浦 Android TV 用户的常见问题(例如本线程或该讨论中的第 22 页)。一般来说,您的任务模板是Service跟踪“系统/音乐”音频流(或媒体按钮按下)的插入/拔出事件和音量,而不是对“有线耳机”音频“流”进行相应的更改(在“标准”Android,但显然类似于“Android Philips”中的内容级别。问题是,仅使用 Android SDK 而不使用“Philips Android TV API”(可能不是公开的)似乎不可能更改“有线耳机”音频流的音量级别。
“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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它没有解决主要问题:改变有线耳机的音量(如果没有“Philips Android TV API”,这可能是不可能的)。
但如果您的环绕音响系统具有远程控制功能,您可以采取一些解决方法:模拟Service上述音响系统远程控制命令,并通过连接到飞利浦 49PUS6401 Android 电视 USB 主机的红外适配器发送。
| 归档时间: |
|
| 查看次数: |
2877 次 |
| 最近记录: |