「这是我参加2022首次更文应战的第26天,活动概况检查:2022首次更文应战」

Android异显注意事项

大部分的手机实际上不支持异显的,所以目前来说异显是个小众的运用场景。大部分需求的是同屏运用,即屏幕投影到大屏上,但这样的话需求显现器有软件支持,比方苹果的AirPlay。这篇文章的意图是为了记录一些奇葩的注意事项。

监听HDMI衔接事情

坑:先说坑,在华为某机型上监听不到,也无法判别HDMI衔接状况.
导致的问题: 理想状况是在HDMI衔接之后,显现副屏,因为我们无法知道HDMI衔接状况,所以每次显现副屏,就需求在保证衔接HDMI之后手动经过按钮翻开。

我目前还不知道怎样解决这个问题,有知道的麻烦指引一下。

在RK某系列的主板上测试可用。

  • 办法: 播送监听

经过注册动态播送监听HDMI的衔接和断开事情。

播送代码:

public class HdmiListener extends BroadcastReceiver {
   private final String TAG = "HdmiListener";
   private final static String HDMI_ACTION = "android.intent.action.HDMI_PLUGGED";
   private final HdmiStateCallback mHdmiStateCallback;
   public HdmiListener(HdmiStateCallback callback) {
       this.mHdmiStateCallback = callback;
   }
   @Override
   public void onReceive(Context context, Intent intent) {
       if (intent.getAction() != null) {
           String action = intent.getAction();
           if (TextUtils.equals(HDMI_ACTION, action)) {
               //HDMI插拔的播送事情
               boolean state = intent.getBooleanExtra("state", false);
               //事情返回一个Boolean类型的state值,依据state值能够判别其状况,true表已衔接,false表断开。
               Log.e("HdmiListener", "state:" + state);
               if (mHdmiStateCallback != null)
                   mHdmiStateCallback.hdmiState(state);
           }
       }
   }
   public interface HdmiStateCallback {
       void hdmiState(boolean isConnected);
   }
}

Activity 代码

       // 动态注册播送
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(HDMI_ACTION);
        mHdmiListener = new HdmiListener(this);
        registerReceiver(mHdmiListener, intentFilter);
 @Override
    public void hdmiState(boolean isConnected) {
        Log.d(TAG, "isConnected:" + isConnected);
        if (isConnected) {
            try {
                Thread.sleep(2000);
                showPresentation();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

值得注意的是,在链接HDMI之后,不能立刻去操作副屏,需求增加2秒的延时,之后才能够显现副屏。

判别是否衔接HDMI

上诉代码是监听HDMI衔接和断开的事情。还有一种办法能够经过读取本地文件判别HDMI是否衔接。

/**
     * 播送只能监听HDMI的插拔 第一次进入程序时不知道HDMI的衔接状况
     * 此刻需求去读系统文件去判别HDMI的衔接状况
     *
     * @return true 衔接 false 未衔接
     */
    public static boolean isHdmiSwitchSet() {
        // The file '/sys/devices/virtual/switch/hdmi/state' holds an int -- if it's 1 then an HDMI device is connected.
        // An alternative file to check is '/sys/class/switch/hdmi/state' which exists instead on certain devices.
        File switchFile = new File("/sys/devices/virtual/switch/hdmi/state");
        if (!switchFile.exists()) {
            switchFile = new File("/sys/class/switch/hdmi/state");
        }
        try {
            Scanner switchFileScanner = new Scanner(switchFile);
            int switchValue = switchFileScanner.nextInt();
            switchFileScanner.close();
            return switchValue > 0;
        } catch (Exception e) {
            return false;
        }
    }

相同的这个办法在华为某平板上仍旧不起作用,在RK系列的主板上有用。
网上有一种说法是,第一次不会呼应HDMI播送事情,我自己试下来,是能监听到了。
这两种办法配合着一起运用,就能完全判别HDMI衔接状况了。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。