Skip to content

Commit 59bb997

Browse files
committed
新增判断 Android 版本相关的方法
1 parent 5d8cf13 commit 59bb997

10 files changed

Lines changed: 162 additions & 28 deletions

File tree

app/src/main/java/com/hjq/demo/manager/ActivityManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
import android.app.Activity;
55
import android.app.Application;
66
import android.content.Context;
7-
import android.os.Build;
87
import android.os.Bundle;
98
import android.text.TextUtils;
109
import androidx.annotation.NonNull;
1110
import androidx.annotation.Nullable;
11+
import com.hjq.demo.other.AndroidVersion;
1212
import java.io.FileInputStream;
1313
import java.io.IOException;
1414
import java.lang.reflect.InvocationTargetException;
@@ -259,7 +259,7 @@ public static boolean isMainProcess(Context context) {
259259
@Nullable
260260
public static String getProcessName() {
261261
String processName = null;
262-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
262+
if (AndroidVersion.isAndroid9()) {
263263
processName = Application.getProcessName();
264264
} else {
265265
try {

app/src/main/java/com/hjq/demo/manager/InitManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import android.content.SharedPreferences;
77
import android.net.ConnectivityManager;
88
import android.net.Network;
9-
import android.os.Build;
109
import androidx.annotation.NonNull;
1110
import androidx.core.content.ContextCompat;
1211
import androidx.lifecycle.Lifecycle;
@@ -17,6 +16,7 @@
1716
import com.hjq.demo.R;
1817
import com.hjq.demo.http.model.RequestHandler;
1918
import com.hjq.demo.http.model.RequestServer;
19+
import com.hjq.demo.other.AndroidVersion;
2020
import com.hjq.demo.other.AppConfig;
2121
import com.hjq.demo.other.CrashHandler;
2222
import com.hjq.demo.other.DebugLoggerTree;
@@ -186,7 +186,7 @@ private void handlerGsonParseException(String message) {
186186

187187
// 注册网络状态变化监听
188188
ConnectivityManager connectivityManager = ContextCompat.getSystemService(application, ConnectivityManager.class);
189-
if (connectivityManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
189+
if (connectivityManager != null && AndroidVersion.isAndroid7()) {
190190
connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
191191

192192
@Override

app/src/main/java/com/hjq/demo/manager/InputTextManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import android.app.Activity;
44
import android.app.Application;
5-
import android.os.Build;
65
import android.os.Bundle;
76
import android.text.Editable;
87
import android.text.TextWatcher;
98
import android.view.View;
109
import android.widget.TextView;
1110
import androidx.annotation.NonNull;
1211
import androidx.annotation.Nullable;
12+
import com.hjq.demo.other.AndroidVersion;
1313
import java.util.ArrayList;
1414
import java.util.List;
1515

@@ -250,7 +250,7 @@ private TextInputLifecycle(Activity activity, InputTextManager helper) {
250250

251251
private static void register(Activity activity, InputTextManager helper) {
252252
TextInputLifecycle lifecycle = new TextInputLifecycle(activity, helper);
253-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
253+
if (AndroidVersion.isAndroid10()) {
254254
activity.registerActivityLifecycleCallbacks(lifecycle);
255255
} else {
256256
activity.getApplication().registerActivityLifecycleCallbacks(lifecycle);
@@ -281,7 +281,7 @@ public void onActivityDestroyed(@NonNull Activity activity) {
281281
return;
282282
}
283283
mTextHelper.removeAllViews();
284-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
284+
if (AndroidVersion.isAndroid10()) {
285285
mActivity.unregisterActivityLifecycleCallbacks(this);
286286
} else {
287287
mActivity.getApplication().unregisterActivityLifecycleCallbacks(this);
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package com.hjq.demo.other;
2+
3+
import android.annotation.SuppressLint;
4+
import android.os.Build;
5+
6+
/**
7+
* author : Android 轮子哥
8+
* github : https://github.com/getActivity/AndroidProject
9+
* time : 2025/12/12
10+
* desc : Android 版本判断类
11+
*/
12+
@SuppressLint("AnnotateVersionCheck")
13+
@SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
14+
public final class AndroidVersion {
15+
16+
/** {@link Build.VERSION_CODES#BAKLAVA} */
17+
public static final int ANDROID_16 = 36;
18+
/** {@link Build.VERSION_CODES#VANILLA_ICE_CREAM} */
19+
public static final int ANDROID_15 = 35;
20+
/** {@link Build.VERSION_CODES#UPSIDE_DOWN_CAKE} */
21+
public static final int ANDROID_14 = 34;
22+
/** {@link Build.VERSION_CODES#TIRAMISU} */
23+
public static final int ANDROID_13 = 33;
24+
/** {@link Build.VERSION_CODES#S_V2} */
25+
public static final int ANDROID_12_1 = 32;
26+
/** {@link Build.VERSION_CODES#S} */
27+
public static final int ANDROID_12 = 31;
28+
/** {@link Build.VERSION_CODES#R} */
29+
public static final int ANDROID_11 = 30;
30+
/** {@link Build.VERSION_CODES#Q} */
31+
public static final int ANDROID_10 = 29;
32+
/** {@link Build.VERSION_CODES#P} */
33+
public static final int ANDROID_9 = 28;
34+
/** {@link Build.VERSION_CODES#O_MR1} */
35+
public static final int ANDROID_8_1 = 27;
36+
/** {@link Build.VERSION_CODES#O} */
37+
public static final int ANDROID_8 = 26;
38+
/** {@link Build.VERSION_CODES#N_MR1} */
39+
public static final int ANDROID_7_1 = 25;
40+
/** {@link Build.VERSION_CODES#N} */
41+
public static final int ANDROID_7 = 24;
42+
43+
private AndroidVersion() {}
44+
45+
/**
46+
* 是否是 Android 16 及以上版本
47+
*/
48+
public static boolean isAndroid16() {
49+
return Build.VERSION.SDK_INT >= ANDROID_16;
50+
}
51+
52+
/**
53+
* 是否是 Android 15 及以上版本
54+
*/
55+
public static boolean isAndroid15() {
56+
return Build.VERSION.SDK_INT >= ANDROID_15;
57+
}
58+
59+
/**
60+
* 是否是 Android 14 及以上版本
61+
*/
62+
public static boolean isAndroid14() {
63+
return Build.VERSION.SDK_INT >= ANDROID_14;
64+
}
65+
66+
/**
67+
* 是否是 Android 13 及以上版本
68+
*/
69+
public static boolean isAndroid13() {
70+
return Build.VERSION.SDK_INT >= ANDROID_13;
71+
}
72+
73+
/**
74+
* 是否是 Android 12.1(又称 Android 12L)及以上版本
75+
*/
76+
public static boolean isAndroid12_1() {
77+
return Build.VERSION.SDK_INT >= ANDROID_12_1;
78+
}
79+
80+
/**
81+
* 是否是 Android 12 及以上版本
82+
*/
83+
public static boolean isAndroid12() {
84+
return Build.VERSION.SDK_INT >= ANDROID_12;
85+
}
86+
87+
/**
88+
* 是否是 Android 11 及以上版本
89+
*/
90+
public static boolean isAndroid11() {
91+
return Build.VERSION.SDK_INT >= ANDROID_11;
92+
}
93+
94+
/**
95+
* 是否是 Android 10 及以上版本
96+
*/
97+
public static boolean isAndroid10() {
98+
return Build.VERSION.SDK_INT >= ANDROID_10;
99+
}
100+
101+
/**
102+
* 是否是 Android 9.0 及以上版本
103+
*/
104+
public static boolean isAndroid9() {
105+
return Build.VERSION.SDK_INT >= ANDROID_9;
106+
}
107+
108+
/**
109+
* 是否是 Android 8.1 及以上版本
110+
*/
111+
public static boolean isAndroid8_1() {
112+
return Build.VERSION.SDK_INT >= ANDROID_8_1;
113+
}
114+
115+
/**
116+
* 是否是 Android 8.0 及以上版本
117+
*/
118+
public static boolean isAndroid8() {
119+
return Build.VERSION.SDK_INT >= ANDROID_8;
120+
}
121+
122+
/**
123+
* 是否是 Android 7.1 及以上版本
124+
*/
125+
public static boolean isAndroid7_1() {
126+
return Build.VERSION.SDK_INT >= ANDROID_7_1;
127+
}
128+
129+
/**
130+
* 是否是 Android 7.0 及以上版本
131+
*/
132+
public static boolean isAndroid7() {
133+
return Build.VERSION.SDK_INT >= ANDROID_7;
134+
}
135+
}

app/src/main/java/com/hjq/demo/other/DebugLoggerTree.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.hjq.demo.other;
22

3-
import android.os.Build;
43
import org.jetbrains.annotations.NotNull;
54
import timber.log.Timber;
65

@@ -21,7 +20,7 @@ public final class DebugLoggerTree extends Timber.DebugTree {
2120
protected String createStackElementTag(@NotNull StackTraceElement element) {
2221
String tag = "(" + element.getFileName() + ":" + element.getLineNumber() + ")";
2322
// 日志 TAG 长度限制已经在 Android 8.0 被移除
24-
if (tag.length() <= MAX_TAG_LENGTH || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
23+
if (tag.length() <= MAX_TAG_LENGTH || AndroidVersion.isAndroid8()) {
2524
return tag;
2625
}
2726
return tag.substring(0, MAX_TAG_LENGTH);

app/src/main/java/com/hjq/demo/other/KeyboardWatcher.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.app.Activity;
44
import android.app.Application;
55
import android.graphics.Rect;
6-
import android.os.Build;
76
import android.os.Bundle;
87
import android.view.View;
98
import android.view.ViewTreeObserver;
@@ -39,7 +38,7 @@ private KeyboardWatcher(Activity activity) {
3938
mActivity = activity;
4039
mContentView = activity.findViewById(Window.ID_ANDROID_CONTENT);
4140

42-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
41+
if (AndroidVersion.isAndroid10()) {
4342
mActivity.registerActivityLifecycleCallbacks(this);
4443
} else {
4544
mActivity.getApplication().registerActivityLifecycleCallbacks(this);
@@ -116,7 +115,7 @@ public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bun
116115
@Override
117116
public void onActivityDestroyed(@NonNull Activity activity) {
118117
if (mActivity == activity) {
119-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
118+
if (AndroidVersion.isAndroid10()) {
120119
mActivity.unregisterActivityLifecycleCallbacks(this);
121120
} else {
122121
mActivity.getApplication().unregisterActivityLifecycleCallbacks(this);

app/src/main/java/com/hjq/demo/permission/PermissionConverter.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import androidx.annotation.NonNull;
88
import androidx.annotation.Nullable;
99
import com.hjq.demo.R;
10+
import com.hjq.demo.other.AndroidVersion;
1011
import com.hjq.permissions.permission.PermissionGroups;
1112
import com.hjq.permissions.permission.PermissionNames;
1213
import com.hjq.permissions.permission.base.IPermission;
@@ -47,7 +48,7 @@ public final class PermissionConverter {
4748

4849
PERMISSION_NAME_MAP.put(PermissionGroups.NEARBY_DEVICES, R.string.common_permission_nearby_devices);
4950
// 注意:在 Android 13 的时候,WIFI 相关的权限已经归到附近设备的权限组了,但是在 Android 13 之前,WIFI 相关的权限归属定位权限组
50-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
51+
if (AndroidVersion.isAndroid13()) {
5152
// 需要填充文案:蓝牙权限描述 + WIFI 权限描述
5253
PERMISSION_DESCRIPTION_MAP.put(R.string.common_permission_nearby_devices, R.string.common_permission_nearby_devices_description);
5354
} else {
@@ -58,10 +59,10 @@ public final class PermissionConverter {
5859
PERMISSION_NAME_MAP.put(PermissionGroups.LOCATION, R.string.common_permission_location);
5960
// 注意:在 Android 12 的时候,蓝牙相关的权限已经归到附近设备的权限组了,但是在 Android 12 之前,蓝牙相关的权限归属定位权限组
6061
// 注意:在 Android 13 的时候,WIFI 相关的权限已经归到附近设备的权限组了,但是在 Android 13 之前,WIFI 相关的权限归属定位权限组
61-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
62+
if (AndroidVersion.isAndroid13()) {
6263
// 需要填充文案:前台定位权限描述
6364
PERMISSION_DESCRIPTION_MAP.put(R.string.common_permission_location, R.string.common_permission_location_description);
64-
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
65+
} else if (AndroidVersion.isAndroid12()) {
6566
// 需要填充文案:前台定位权限描述 + WIFI 权限描述
6667
PERMISSION_DESCRIPTION_MAP.put(R.string.common_permission_location, R.string.common_permission_location_description);
6768
} else {
@@ -74,7 +75,7 @@ public final class PermissionConverter {
7475
PERMISSION_DESCRIPTION_MAP.put(R.string.common_permission_location_background, R.string.common_permission_location_background_description);
7576

7677
int sensorsPermissionNameStringId;
77-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
78+
if (AndroidVersion.isAndroid16()) {
7879
sensorsPermissionNameStringId = R.string.common_permission_health_data;
7980
} else {
8081
sensorsPermissionNameStringId = R.string.common_permission_body_sensors;
@@ -84,7 +85,7 @@ public final class PermissionConverter {
8485

8586
// 后台传感器权限虽然属于传感器权限组,但是只要是属于后台权限,都有独属于自己的一套规则
8687
int bodySensorsBackgroundPermissionNameStringId;
87-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
88+
if (AndroidVersion.isAndroid16()) {
8889
bodySensorsBackgroundPermissionNameStringId = R.string.common_permission_health_data_background;
8990
} else {
9091
bodySensorsBackgroundPermissionNameStringId = R.string.common_permission_body_sensors_background;
@@ -107,7 +108,7 @@ public final class PermissionConverter {
107108

108109
PERMISSION_NAME_MAP.put(PermissionGroups.PHONE, R.string.common_permission_phone);
109110
// 注意:在 Android 9.0 的时候,读写通话记录权限已经归到一个单独的权限组了,但是在 Android 9.0 之前,读写通话记录权限归属电话权限组
110-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
111+
if (AndroidVersion.isAndroid9()) {
111112
// 需要填充文案:电话权限描述
112113
PERMISSION_DESCRIPTION_MAP.put(R.string.common_permission_phone, R.string.common_permission_phone_description);
113114
} else {
@@ -123,7 +124,7 @@ public final class PermissionConverter {
123124

124125
// 注意:在 Android 10 的版本,这个权限的名称为《健身运动权限》,但是到了 Android 11 的时候,这个权限的名称被修改成了《身体活动权限》
125126
// 没错就改了一下权限的叫法,其他的一切没有变,Google 产品经理真的是闲的蛋疼,但是吐槽归吐槽,框架也要灵活应对一下,避免小白用户跳转到设置页找不到对应的选项
126-
int activityRecognitionPermissionNameStringId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ? R.string.common_permission_activity_recognition_api30 : R.string.common_permission_activity_recognition_api29;
127+
int activityRecognitionPermissionNameStringId = AndroidVersion.isAndroid11() ? R.string.common_permission_activity_recognition_api30 : R.string.common_permission_activity_recognition_api29;
127128
PERMISSION_NAME_MAP.put(PermissionNames.ACTIVITY_RECOGNITION, activityRecognitionPermissionNameStringId);
128129
PERMISSION_DESCRIPTION_MAP.put(activityRecognitionPermissionNameStringId, R.string.common_permission_activity_recognition_description);
129130

app/src/main/java/com/hjq/demo/permission/PermissionInterceptor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import android.app.Activity;
44
import android.content.Context;
55
import android.content.pm.PackageManager;
6-
import android.os.Build;
76
import android.os.Build.VERSION;
87
import android.os.Build.VERSION_CODES;
98
import android.text.TextUtils;
109
import androidx.annotation.NonNull;
1110
import androidx.annotation.Nullable;
1211
import com.hjq.demo.R;
12+
import com.hjq.demo.other.AndroidVersion;
1313
import com.hjq.demo.ui.dialog.common.MessageDialog;
1414
import com.hjq.permissions.OnPermissionCallback;
1515
import com.hjq.permissions.OnPermissionInterceptor;
@@ -144,7 +144,7 @@ private String generatePermissionHint(@NonNull Activity activity, @NonNull List<
144144
} else if (deniedSensorsPermissionCount == deniedPermissionCount && VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
145145
if (deniedPermissionCount == 1) {
146146
if (XXPermissions.equalsPermission(deniedList.get(0), PermissionNames.BODY_SENSORS_BACKGROUND)) {
147-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
147+
if (AndroidVersion.isAndroid16()) {
148148
return activity.getString(R.string.common_permission_fail_hint_1,
149149
activity.getString(R.string.common_permission_health_data_background),
150150
activity.getString(R.string.common_permission_health_data_background_option));
@@ -156,7 +156,7 @@ private String generatePermissionHint(@NonNull Activity activity, @NonNull List<
156156
}
157157
} else {
158158
if (doNotAskAgain) {
159-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
159+
if (AndroidVersion.isAndroid16()) {
160160
return activity.getString(R.string.common_permission_fail_hint_1,
161161
activity.getString(R.string.common_permission_health_data),
162162
activity.getString(R.string.common_permission_allow_all_option));
@@ -225,7 +225,7 @@ private String generatePermissionHint(@NonNull Activity activity, @NonNull List<
225225
@NonNull
226226
private String getBackgroundPermissionOptionLabel(Context context) {
227227
PackageManager packageManager = context.getPackageManager();
228-
if (packageManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
228+
if (packageManager != null && AndroidVersion.isAndroid11()) {
229229
CharSequence backgroundPermissionOptionLabel = packageManager.getBackgroundPermissionOptionLabel();
230230
if (!TextUtils.isEmpty(backgroundPermissionOptionLabel)) {
231231
return backgroundPermissionOptionLabel.toString();

app/src/main/java/com/hjq/demo/ui/activity/common/CameraActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import android.content.Intent;
44
import android.media.MediaScannerConnection;
55
import android.net.Uri;
6-
import android.os.Build;
76
import android.os.Environment;
87
import android.provider.MediaStore;
98
import androidx.core.content.FileProvider;
109
import com.hjq.base.BaseActivity;
1110
import com.hjq.demo.R;
1211
import com.hjq.demo.aop.Log;
1312
import com.hjq.demo.app.AppActivity;
13+
import com.hjq.demo.other.AndroidVersion;
1414
import com.hjq.demo.other.AppConfig;
1515
import com.hjq.demo.permission.PermissionDescription;
1616
import com.hjq.demo.permission.PermissionInterceptor;
@@ -121,7 +121,7 @@ protected void initData() {
121121
}
122122

123123
Uri imageUri;
124-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
124+
if (AndroidVersion.isAndroid7()) {
125125
// 通过 FileProvider 创建一个 Content 类型的 Uri 文件
126126
imageUri = FileProvider.getUriForFile(this, AppConfig.getPackageName() + ".provider", file);
127127
} else {

0 commit comments

Comments
 (0)