客户要求系统实现动态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, "fan switch 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 static void 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();
+ }
+
+ }@Overridepublic 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;}