Android rom开发:监听HDMI状态能实现控制盒子的网络?

新年好!本年度定一个小目标:笔耕不辍,每月至少更新一篇博客。

发车发车!
Android rom开发:监听HDMI状态能实现控制盒子的网络?_第1张图片

============================= 华丽丽的分割线 =============================

2019年第一篇博客,竟然是记录一个略微egg pain的需求…
Android rom开发:监听HDMI状态能实现控制盒子的网络?_第2张图片
问题场景:在上网流量有限的情况下,为了节省流量,电视机待机或者关机之后,盒子自动断网,电视机唤醒或者开机之后,盒子自动恢复网络。
(流量有限你还用什么盒子。。。。。。)

对于Android盒子来说,无论是电视机待机/唤醒、关机/开机,或者插拔HDMI线,都会触发广播"android.intent.action.HDMI_PLUGGED",并且这个广播会携带一个键为"state"的布尔值用来标志HDMI设备是否连接,true为连接,false为未连接。

盒子网络控制的逻辑可以放在framework层,也可以在apk层。

wifi的控制,直接调用WifiManager提供的setWifiEnabled接口。WifiManager不是隐藏类,在framework和apk层都可以直接调用。

有线网络的控制,需要用到ServiceManager和INetworkManagementService。这两个类都是隐藏类,在framework可以直接调用,在apk里面需要反射调用,相对来说会更麻烦。

最优的方式,放在framework层的service处理,比如PowerManagerService。

所以,有以下的代码:
Android rom开发:监听HDMI状态能实现控制盒子的网络?_第3张图片

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.intent.action.HDMI_PLUGGED");
    mContext.registerReceiver(new HdmiStateBroadcastReceiver(), intentFilter);
 
private final class HdmiStateBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "forlan debug action is " + intent.getAction() + " hdmi state is " + intent.getBooleanExtra("state", false));
        if (intent.getAction() != null) {
            IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
            INetworkManagementService nMService = INetworkManagementService.Stub.asInterface(b);
            WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
            try {
                nMService.setInterfaceDown("eth0");
                wifiManager.setWifiEnabled(intent.getBooleanExtra("state", false));
                if (intent.getBooleanExtra("state", false)) {
                    nMService.setInterfaceUp("eth0");
                }
            } catch (RemoteException e) {
                Log.e(TAG, "Error upping interface eth0: " + e);
            }
        }
    }
};

切忌采取定时器循环读取hdmi节点值的方式,耗性能。

=============== 2019.1.11更新 ====================
Android rom开发:监听HDMI状态能实现控制盒子的网络?_第4张图片
在使用了不同的电视机之后,发现支持hdmi cec与不支持hdmi cec的电视机,发送广播的次数会不一样,并且即便是同品牌不同型号的支持hdmi cec的电视机,发送的广播次数也是不一样的。别跟我说什么采取定时器循环读取hdmi节点值的方式,支持hdmi cec的电视机,关机之后读取hdmi节点值还是1。在这情况下不仅耗性能还不准确。

老夫多次尝试修改代码,仍旧无法统一用一个逻辑来判断不同的电视机是否关机/开机/待机/唤醒,因此实际上这个需求就是实现不了,原理上行不通!! 大声吼出来:原理上实现不了,不是老夫的能力问题!还有什么比这个更痛快的吗?!
Android rom开发:监听HDMI状态能实现控制盒子的网络?_第5张图片
又是一个坑。2019第一踩。

你可能感兴趣的:(android,rom开发,android盒子)