1818import android .app .Activity ;
1919import android .app .Dialog ;
2020import android .app .Fragment ;
21+ import android .content .res .Resources ;
2122import android .util .DisplayMetrics ;
2223import android .view .View ;
2324
25+ import java .lang .reflect .Field ;
2426import java .util .Locale ;
2527import java .util .Map ;
2628import java .util .concurrent .ConcurrentHashMap ;
@@ -191,7 +193,7 @@ public static void cancelAdapt(Activity activity) {
191193 }
192194
193195 /**
194- * 赋值
196+ * 给几大 {@link DisplayMetrics} 赋值
195197 *
196198 * @param activity {@link Activity}
197199 * @param density {@link DisplayMetrics#density}
@@ -202,12 +204,54 @@ private static void setDensity(Activity activity, float density, int densityDpi,
202204 final DisplayMetrics activityDisplayMetrics = activity .getResources ().getDisplayMetrics ();
203205 final DisplayMetrics appDisplayMetrics = AutoSizeConfig .getInstance ().getApplication ().getResources ().getDisplayMetrics ();
204206
205- activityDisplayMetrics .density = density ;
206- activityDisplayMetrics .densityDpi = densityDpi ;
207- activityDisplayMetrics .scaledDensity = scaledDensity ;
207+ setDensity (activityDisplayMetrics , density , densityDpi , scaledDensity );
208+
209+ setDensity (appDisplayMetrics , density , densityDpi , scaledDensity );
210+
211+ //兼容 MIUI
212+ DisplayMetrics activityDisplayMetricsOnMIUI = getMetricsOnMiui (activity .getResources ());
213+ DisplayMetrics appDisplayMetricsOnMIUI = getMetricsOnMiui (AutoSizeConfig .getInstance ().getApplication ().getResources ());
214+
215+ if (activityDisplayMetricsOnMIUI != null ) {
216+ setDensity (activityDisplayMetricsOnMIUI , density , densityDpi , scaledDensity );
217+ }
218+
219+ if (appDisplayMetricsOnMIUI != null ) {
220+ setDensity (appDisplayMetricsOnMIUI , density , densityDpi , scaledDensity );
221+ }
222+ }
208223
209- appDisplayMetrics .density = density ;
210- appDisplayMetrics .densityDpi = densityDpi ;
211- appDisplayMetrics .scaledDensity = scaledDensity ;
224+ /**
225+ * 赋值
226+ *
227+ * @param displayMetrics {@link DisplayMetrics}
228+ * @param density {@link DisplayMetrics#density}
229+ * @param densityDpi {@link DisplayMetrics#densityDpi}
230+ * @param scaledDensity {@link DisplayMetrics#scaledDensity}
231+ */
232+ private static void setDensity (DisplayMetrics displayMetrics , float density , int densityDpi , float scaledDensity ) {
233+ displayMetrics .density = density ;
234+ displayMetrics .densityDpi = densityDpi ;
235+ displayMetrics .scaledDensity = scaledDensity ;
236+ }
237+
238+ /**
239+ * 解决 MIUI 更改框架导致的 MIUI7 + Android5.1.1 上出现的失效问题 (以及极少数基于这部分 MIUI 去掉 ART 然后置入 XPosed 的手机)
240+ * 来源于: https://github.com/Firedamp/Rudeness/blob/master/rudeness-sdk/src/main/java/com/bulong/rudeness/RudenessScreenHelper.java#L61:5
241+ *
242+ * @param resources {@link Resources}
243+ * @return {@link DisplayMetrics}, 可能为 {@code null}
244+ */
245+ private static DisplayMetrics getMetricsOnMiui (Resources resources ) {
246+ if ("MiuiResources" .equals (resources .getClass ().getSimpleName ()) || "XResources" .equals (resources .getClass ().getSimpleName ())) {
247+ try {
248+ Field field = Resources .class .getDeclaredField ("mTmpMetrics" );
249+ field .setAccessible (true );
250+ return (DisplayMetrics ) field .get (resources );
251+ } catch (Exception e ) {
252+ return null ;
253+ }
254+ }
255+ return null ;
212256 }
213257}
0 commit comments