美文网首页
Android-HDMI监听,支持开机也能监听到

Android-HDMI监听,支持开机也能监听到

作者: 小马要加油 | 来源:发表于2019-10-11 14:37 被阅读0次

    前言

    有个需求要监听HDMI,然后把应用放到第二屏的操作。第一步:百度,Google看看有没有实现好的,按照百度的监听广播,在AndroidManifest.xml注册,然后插着HDMI开机的话要知道是否连着就要去读一个sys的文件。我按照操作来一遍,无卵用!!
    所以下面是我的实现方法:

    插拔HDMI

    广播监听,肯定是要的

    V/ActivityManager(  947): Broadcast sticky: Intent { act=android.intent.action.HDMI_PLUGGED flg=0x4000010 (has extras) } ordered=false userid=-1
    

    但是我们监听即可

        private static final String ACTION_HDMI_PLUGGED = "android.intent.action.HDMI_PLUGGED";
        private static final String EXTRA_HDMI_PLUGGED_STATE = "state";
    
        private BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (ACTION_HDMI_PLUGGED.equals(action)) {
                    mIsHDMIPlugged = intent.getBooleanExtra(EXTRA_HDMI_PLUGGED_STATE, false);
                    Log.d(TAG, "onReceive:mIsHDMIPlugged =  " + mIsHDMIPlugged);
                }
            }
        };
    

    注意事项

    1、需要在代码注册广播,在AndroidManifest.xml中注册无效,要在代码中注册
    2、从log中可以得出,该广播为粘性广播,连接hdmi之后开机也可以收到广播的。

    知其然

    为什么只能在代码中注册呢?看下发广播的代码吧。
    ps:源码为Android 7.1

       void initializeHdmiState() {
            boolean plugged = false;
            // watch for HDMI plug messages if the hdmi switch exists
            if (new File("/sys/devices/virtual/switch/hdmi/state").exists()) {
                mHDMIObserver.startObserving("DEVPATH=/devices/virtual/switch/hdmi");
                //也是去读文件的数据
                final String filename = "/sys/class/switch/hdmi/state";
                FileReader reader = null;
                try {
                    reader = new FileReader(filename);
                    char[] buf = new char[15];
                    int n = reader.read(buf);
                    if (n > 1) {
                        plugged = 0 != Integer.parseInt(new String(buf, 0, n-1));
                    }
                } catch (IOException ex) {
                    Slog.w(TAG, "Couldn't read hdmi state from " + filename + ": " + ex);
                } catch (NumberFormatException ex) {
                    Slog.w(TAG, "Couldn't read hdmi state from " + filename + ": " + ex);
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException ex) {
                        }
                    }
                }
            }
            // This dance forces the code in setHdmiPlugged to run.
            // Always do this so the sticky intent is stuck (to false) if there is no hdmi.
            mHdmiPlugged = !plugged;
            setHdmiPlugged(!mHdmiPlugged);
        }
      //由kernel上报的监听事件
        private UEventObserver mHDMIObserver = new UEventObserver() {
            @Override
            public void onUEvent(UEventObserver.UEvent event) {
                setHdmiPlugged("1".equals(event.get("SWITCH_STATE")));
            }
        };
    
    //发广播出来
        void setHdmiPlugged(boolean plugged) {
            if (mHdmiPlugged != plugged) {
                mHdmiPlugged = plugged;
                updateRotation(true, true);
                Intent intent = new Intent(ACTION_HDMI_PLUGGED);
                //这个flags:启动检查时只能接受在代码中注册的Receiver
                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
                intent.putExtra(EXTRA_HDMI_PLUGGED_STATE, plugged);
                //粘性广播没有限制,即便后来注册的intent也可以收到这个广播
                mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
            }
        }
    

    相关文章

      网友评论

          本文标题:Android-HDMI监听,支持开机也能监听到

          本文链接:https://www.haomeiwen.com/subject/qeiquctx.html