客户要求系统实现动态hdmi-4K与普通分辨率直接热切换,先在菜单中做个试验,设置中加个切换开关,点击开关就可以直接切到hdmi-4K,这个功能实现后可以通过插拔hdmi那个状态(sys/class/drm/card0-HDMI-A-1/status)直接实现切换,测试代码也很简单,方法如下:
Index: packages/apps/Settings/src/com/android/settings/display/HdmiSettings.java===================================================================--- packages/apps/Settings/src/com/android/settings/display/HdmiSettings.java(revision 907)+++ packages/apps/Settings/src/com/android/settings/display/HdmiSettings.java(working copy)@@ -27,6 +27,7 @@ import androidx.preference.SwitchPreference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen;+import androidx.preference.SwitchPreference;import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.HdmiListPreference;@@ -39,6 +40,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map;+import android.os.SystemProperties;+import java.io.*;import static com.android.settings.display.DrmDisplaySetting.DPY_STATUS_CONNECTED; @@ -53,6 +56,7 @@ private static final String KEY_PRE_CATE = "Display"; private static final String KEY_PRE_RESOLUTION = "Resolution"; private static final String KEY_PRE_SCREEN_SCALE = "ScreenScale";+private static final String KEY_PRE_HDMI_4K = "HDMIswitch4K"; private static final String KEY_AUX_CATEGORY = "aux_category"; private static final String KEY_AUX_SCREEN_VH = "aux_screen_vh"; private static final String KEY_AUX_SCREEN_VH_LIST = "aux_screen_vhlist";@@ -87,6 +91,7 @@ private PreferenceCategory mAuxCategory; private CheckBoxPreference mAuxScreenVH; private ListPreference mAuxScreenVHList;+private SwitchPreference hdmi4kPreference; private Context mContext; private DisplayInfo mSelectDisplayInfo; private DisplayManager mDisplayManager;@@ -114,6 +119,10 @@ if (mDestory && MSG_SWITCH_DEVICE_STATUS != msg.what) { return; }++Log.d(TAG, "fan msg.what ="+msg.what);++Log.d(TAG, "fanswitch control ="+(ITEM_CONTROL) msg.obj); if (MSG_UPDATE_STATUS == msg.what) { final ITEM_CONTROL control = (ITEM_CONTROL) msg.obj; new Thread() {@@ -177,6 +186,7 @@ if (SWITCH_STATUS_OFF_ON == msg.arg1) { sendSwitchDeviceOffOnMsg(control, SWITCH_STATUS_ON); } else {+Log.d(TAG, "fan control ="+control); sendUpdateStateMsg(control, 2000); } }@@ -379,6 +389,7 @@ scalePreference.setOnPreferenceClickListener(this); category.addPreference(scalePreference); category.setEnabled(false);+ DisplayInfo displayInfo = new DisplayInfo(); displayInfo.setDisplayNo(display); mDisplayInfoList.put(display, displayInfo);@@ -394,6 +405,13 @@ mAuxScreenVHList.setOnPreferenceChangeListener(this); mAuxScreenVHList.setOnPreferenceClickListener(this); mAuxCategory.removePreference(mAuxScreenVHList);+ //add hdmi4kPreference ++hdmi4kPreference = (SwitchPreference) findPreference(KEY_PRE_HDMI_4K);+ hdmi4kPreference.setChecked(SystemProperties.getBoolean("persist.sys.hdmi4k", false));+ hdmi4kPreference.setOnPreferenceChangeListener(this);++ }private void sendSwitchDeviceOffOnMsg(ITEM_CONTROL control, int status) {@@ -583,6 +601,7 @@ cate.setEnabled(false); } } else if (key.startsWith(KEY_PRE_RESOLUTION)) {+Log.i("fan","key.replace="+key.replace(KEY_PRE_SCREEN_SCALE, "")); for (Map.Entry<Integer, DisplayInfo> entry : mDisplayInfoList.entrySet()) { int display = Integer.parseInt(key.replace(KEY_PRE_RESOLUTION, "")); if (display == entry.getKey()) {@@ -597,6 +616,23 @@ } return true; }+ public staticvoid exe_cmd(String cmd){++ Process process2 = null;+ DataOutputStream dos = null;+ try{+ process2 = Runtime.getRuntime().exec("su");+ dos = new DataOutputStream(process2.getOutputStream());+ dos.writeBytes(cmd);+ dos.flush();+ dos.close();+ }+ catch (Exception e) { + +e.printStackTrace(); +}++ }@Override public boolean onPreferenceChange(Preference preference, Object obj) {@@ -662,6 +698,30 @@ //mDisplayManager.forceScheduleTraversalLocked(); sendSwitchDeviceOffOnMsg(ITEM_CONTROL.REFRESH_DISPLAY_STATUS_INFO, SWITCH_STATUS_OFF_ON); }++else if(preference == hdmi4kPreference){+for (Map.Entry<Integer, DisplayInfo> entry : mDisplayInfoList.entrySet()) {+// int display = Integer.parseInt(key.replace(KEY_PRE_RESOLUTION, ""));+ if (0 == entry.getKey()) {+ mSelectDisplayInfo = entry.getValue();+ }+ }+if (obj == Boolean.TRUE) +{+Log.d(TAG, "hdmi 4k is select") ;+exe_cmd("setprop persist.vendor.resolution.aux 3840x2160@60");+ // exe_cmd("setprop persist.vendor.resolution.aux 1920x1080@60");+exe_cmd("setprop vendor.display.timeline 1");+ exe_cmd("setprop persist.sys.hdmi4k true");+}+else{++Log.d(TAG, "hdmi 4k is close" );+ exe_cmd("setprop persist.vendor.resolution.aux 720x480@59.94-736-798-858-489-495-525-a");+ exe_cmd("setprop vendor.display.timeline 1");+ exe_cmd("setprop persist.sys.hdmi4k false");+}+} return true; }