Skip to content

Commit 3a00c9e

Browse files
committed
修复获取单数字的版本号时会出现角标越界异常的问题
1 parent 8d2f9b6 commit 3a00c9e

File tree

1 file changed

+49
-38
lines changed

1 file changed

+49
-38
lines changed

library/src/main/java/com/hjq/device/compat/DeviceOs.java

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public final class DeviceOs {
2020

2121
/* ---------------------------------------- 我是一条华丽的分割线 ---------------------------------------- */
2222

23-
static final String REGEX_VERSION_NAME = "(\\d+(?:\\.\\d+)+)";
23+
static final String REGEX_VERSION_NAME = "\\d+(?:\\.\\d+)+";
2424

2525
static final String REGEX_NUMBER = "\\d+";
2626

@@ -401,11 +401,11 @@ private DeviceOs() {
401401
if (SystemPropertyCompat.isSystemPropertyAnyOneExist(OS_CONDITIONS_HYPER_OS)) {
402402
sCurrentOsName = OS_NAME_HYPER_OS;
403403
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_HYPER_OS);
404-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
404+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
405405
} else if (SystemPropertyCompat.isSystemPropertyAnyOneExist(OS_CONDITIONS_MIUI)) {
406406
sCurrentOsName = OS_NAME_MIUI;
407407
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_MIUI);
408-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
408+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
409409
}
410410

411411
if (sCurrentOsName == null) {
@@ -414,13 +414,13 @@ private DeviceOs() {
414414
if (!TextUtils.isEmpty(realmeUiVersion)) {
415415
sCurrentOsName = OS_NAME_REALME_UI;
416416
sCurrentOriginalOsVersionName = realmeUiVersion;
417-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
417+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
418418
} else {
419419
String colorOsVersion = SystemPropertyCompat.getSystemPropertyAnyOneValue(OS_VERSION_NAME_COLOR_OS);
420420
if (!TextUtils.isEmpty(colorOsVersion)) {
421421
sCurrentOsName = OS_NAME_COLOR_OS;
422422
sCurrentOriginalOsVersionName = colorOsVersion;
423-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
423+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
424424
}
425425
}
426426
}
@@ -431,11 +431,11 @@ private DeviceOs() {
431431
if (vivoOsName.toLowerCase().contains("origin")) {
432432
sCurrentOsName = OS_NAME_ORIGIN_OS;
433433
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyAnyOneValue(OS_VERSION_NAME_ORIGIN_OS);
434-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
434+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
435435
} else if (vivoOsName.toLowerCase().contains("funtouch")) {
436436
sCurrentOsName = OS_NAME_FUNTOUCH_OS;
437437
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyAnyOneValue(OS_VERSION_NAME_FUNTOUCH_OS);
438-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
438+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
439439
}
440440
}
441441
}
@@ -445,7 +445,7 @@ private DeviceOs() {
445445
if (!TextUtils.isEmpty(magicOsVersion)) {
446446
sCurrentOsName = OS_NAME_MAGIC_OS;
447447
sCurrentOriginalOsVersionName = magicOsVersion;
448-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
448+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
449449
}
450450
}
451451

@@ -457,7 +457,7 @@ private DeviceOs() {
457457
if (osBrand != null && osBrand.toString().toLowerCase().contains("harmony")) {
458458
sCurrentOsName = OS_NAME_HARMONY_OS;
459459
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyAnyOneValue(OS_VERSION_NAME_HARMONY_OS);
460-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
460+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
461461
}
462462
} catch (Exception ignore) {
463463
// default implementation ignored
@@ -470,27 +470,27 @@ private DeviceOs() {
470470
if (!TextUtils.isEmpty(emuiVersion) && emuiVersion.toLowerCase().contains("emotionui")) {
471471
sCurrentOsName = OS_NAME_EMUI;
472472
sCurrentOriginalOsVersionName = emuiVersion;
473-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
473+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
474474
}
475475
}
476476

477477
if (sCurrentOsName == null) {
478478
String oneUiVersion = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_ONE_UI);
479479
if (!TextUtils.isEmpty(oneUiVersion)) {
480480
sCurrentOsName = OS_NAME_ONE_UI;
481-
if (oneUiVersion.matches("\\d+")) {
481+
if (oneUiVersion.matches(REGEX_NUMBER)) {
482482
try {
483483
// OneUI 5.1.1 获取到的值是 50101 再经过一通计算得出 5.1.1
484484
int oneUiVersionCode;
485485
oneUiVersionCode = Integer.parseInt(oneUiVersion);
486486
sCurrentOriginalOsVersionName = getOneUiVersionNameByVersionCode(oneUiVersionCode);
487-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
487+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
488488
} catch (Exception e) {
489489
// default implementation ignored
490490
}
491491
} else if (oneUiVersion.matches(REGEX_VERSION_NAME)) {
492492
sCurrentOriginalOsVersionName = oneUiVersion;
493-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
493+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
494494
}
495495
}
496496

@@ -508,7 +508,7 @@ private DeviceOs() {
508508
// OneUI 2.5 获取到的值是 110500,110500 - 90000 = 25000,20500 再经过一通计算得出 2.5 的版本号
509509
int oneUiVersionCode = semPlatformVersion - superfluousValue;
510510
sCurrentOriginalOsVersionName = getOneUiVersionNameByVersionCode(oneUiVersionCode);
511-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
511+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
512512
}
513513
} catch (Exception ignore) {
514514
// default implementation ignored
@@ -521,15 +521,15 @@ private DeviceOs() {
521521
if (!TextUtils.isEmpty(oxygenOsVersion)) {
522522
sCurrentOsName = OS_NAME_OXYGEN_OS;
523523
sCurrentOriginalOsVersionName = oxygenOsVersion;
524-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
524+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
525525
}
526526
}
527527
if (sCurrentOsName == null) {
528528
String h2OsVersion = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_H2_OS);
529529
if (!TextUtils.isEmpty(h2OsVersion)) {
530530
sCurrentOsName = OS_NAME_H2_OS;
531531
sCurrentOriginalOsVersionName = h2OsVersion;
532-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
532+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
533533
}
534534
}
535535

@@ -538,10 +538,10 @@ private DeviceOs() {
538538
String flymeVersion = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_FLYME_1);
539539
if (!TextUtils.isEmpty(flymeVersion) && flymeVersion.toLowerCase().contains("flyme")) {
540540
sCurrentOriginalOsVersionName = flymeVersion;
541-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
541+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
542542
} else {
543543
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_FLYME_2);
544-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
544+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
545545
}
546546
}
547547

@@ -552,29 +552,29 @@ private DeviceOs() {
552552
if (lowerCaseOsVersion.contains("redmagicos")) {
553553
sCurrentOsName = OS_NAME_RED_MAGIC_OS;
554554
sCurrentOriginalOsVersionName = osVersion;
555-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
555+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
556556
} else if (lowerCaseOsVersion.contains("myos")) {
557557
sCurrentOsName = OS_NAME_MY_OS;
558558
sCurrentOriginalOsVersionName = osVersion;
559-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
559+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
560560
} else if (lowerCaseOsVersion.contains("zte")) {
561561
sCurrentOsName = OS_NAME_MIFAVOR_UI;
562562
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_MIFAVOR_UI);
563-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
563+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
564564
}
565565
}
566566
}
567567

568568
if (sCurrentOsName == null && SystemPropertyCompat.isSystemPropertyAnyOneExist(OS_CONDITIONS_SMARTISAN_OS)) {
569569
sCurrentOsName = OS_NAME_SMARTISAN_OS;
570570
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_SMARTISAN_OS);
571-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
571+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
572572
}
573573

574574
if (sCurrentOsName == null && SystemPropertyCompat.isSystemPropertyAnyOneExist(OS_CONDITIONS_EUI_OS)) {
575575
sCurrentOsName = OS_NAME_EUI_OS;
576576
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_EUI_OS);
577-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
577+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
578578
}
579579

580580
if (sCurrentOsName == null) {
@@ -583,11 +583,11 @@ private DeviceOs() {
583583
if (!TextUtils.isEmpty(zuxOsName) && zuxOsName.toLowerCase().contains("zuxos")) {
584584
sCurrentOsName = OS_NAME_ZUX_OS;
585585
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyAnyOneValue(OS_VERSION_NAME_ZUX_OS);
586-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
586+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
587587
} else if (SystemPropertyCompat.isSystemPropertyAnyOneExist(OS_CONDITIONS_ZUI)) {
588588
sCurrentOsName = OS_NAME_ZUI;
589589
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_ZUI);
590-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
590+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
591591
}
592592
}
593593

@@ -596,7 +596,7 @@ private DeviceOs() {
596596
if (!TextUtils.isEmpty(osName) && osName.toLowerCase().contains("nubiaui")) {
597597
sCurrentOsName = OS_NAME_NUBIA_UI;
598598
sCurrentOriginalOsVersionName = SystemPropertyCompat.getSystemPropertyValue(OS_VERSION_NAME_NUBIA_UI);
599-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
599+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
600600
}
601601
}
602602

@@ -605,7 +605,7 @@ private DeviceOs() {
605605
if (!TextUtils.isEmpty(osVersion) && osVersion.toLowerCase().contains("360ui")) {
606606
sCurrentOsName = OS_NAME_360_UI;
607607
sCurrentOriginalOsVersionName = osVersion;
608-
sCurrentBeautificationVersionName = getBeautificationVersionName(sCurrentOriginalOsVersionName);
608+
sCurrentBeautificationVersionName = extractVersionNameByText(sCurrentOriginalOsVersionName);
609609
}
610610
}
611611

@@ -954,27 +954,38 @@ private static String getOneUiVersionNameByVersionCode(int oneUiVersionCode) {
954954
}
955955

956956
/**
957-
* 获取经过美化的版本名称
957+
* 从文本提取字符串中的版本号(只保留数字和点号)
958958
*/
959959
@NonNull
960-
private static String getBeautificationVersionName(String originalOsVersionName) {
960+
private static String extractVersionNameByText(@Nullable String text) {
961+
if (TextUtils.isEmpty(text)) {
962+
return "";
963+
}
964+
961965
// 使用正则表达式匹配数字和点号组成的版本号
962-
Pattern pattern = Pattern.compile(REGEX_VERSION_NAME);
963-
Matcher matcher = pattern.matcher(originalOsVersionName);
966+
// 这里需要注意:因为是获取正则表达式的分组,所以需要在 Pattern.compile 时加上括号
967+
// Github 地址:https://github.com/getActivity/DeviceCompat/pull/3
968+
Pattern pattern = Pattern.compile("(" + REGEX_VERSION_NAME + ")");
969+
Matcher matcher = pattern.matcher(text);
964970

965-
if (matcher.find()) {
971+
if (matcher.find() && matcher.groupCount() > 0) {
966972
String result = matcher.group(1);
967-
return result != null ? result : "";
973+
if (result != null) {
974+
return result;
975+
}
968976
}
969977

970978
// 需要注意的是 华为畅享 5S Android 5.1 获取到的厂商版本号是 EmotionUI_3,而不是 3.1 或者 3.0 这种
971-
// 使用正则表达式匹配数字和点号组成的版本号
972-
pattern = Pattern.compile(REGEX_NUMBER);
973-
matcher = pattern.matcher(originalOsVersionName);
979+
// 这里需要注意:因为是获取正则表达式的分组,所以需要在 Pattern.compile 时加上括号
980+
// Github 地址:https://github.com/getActivity/DeviceCompat/pull/3
981+
pattern = Pattern.compile("(" + REGEX_NUMBER + ")");
982+
matcher = pattern.matcher(text);
974983

975-
if (matcher.find()) {
984+
if (matcher.find() && matcher.groupCount() > 0) {
976985
String result = matcher.group(1);
977-
return result != null ? result : "";
986+
if (result != null) {
987+
return result;
988+
}
978989
}
979990
return "";
980991
}

0 commit comments

Comments
 (0)