Object statusBarService = context.getSystemService(Context.STATUS_BAR_SERVICE);
-
在 Android 开发中,上述代码出现如下警告信息
Must be one of:
Context. POWER_SERVICE,
Context. WINDOW_SERVICE,
Context. LAYOUT_INFLATER_SERVICE,
Context. ACCOUNT_SERVICE,
Context. ACTIVITY_SERVICE,
Context. ALARM_SERVICE,
Context. NOTIFICATION_SERVICE,
Context. ACCESSIBILITY_SERVICE,
Context. CAPTIONING_SERVICE,
Context. KEYGUARD_SERVICE,
Context. LOCATION_SERVICE,
android. content. Context. HEALTHCONNECT_SERVICE,
Context. SEARCH_SERVICE,
Context. SENSOR_SERVICE,
Context. STORAGE_SERVICE,
Context. STORAGE_STATS_SERVICE,
Context. WALLPAPER_SERVICE,
Context. VIBRATOR_MANAGER_SERVICE,
Context. VIBRATOR_SERVICE,
Context. CONNECTIVITY_SERVICE,
Context. IPSEC_SERVICE,
Context. VPN_MANAGEMENT_SERVICE,
Context. NETWORK_STATS_SERVICE,
Context. WIFI_SERVICE,
Context. WIFI_AWARE_SERVICE,
Context. WIFI_P2P_SERVICE,
Context. WIFI_RTT_RANGING_SERVICE,
Context. NSD_SERVICE,
Context. AUDIO_SERVICE,
Context. FINGERPRINT_SERVICE,
Context. BIOMETRIC_SERVICE,
Context. MEDIA_ROUTER_SERVICE,
Context. TELEPHONY_SERVICE,
Context. TELEPHONY_SUBSCRIPTION_SERVICE,
Context. CARRIER_CONFIG_SERVI...
问题原因
-
代码尝试获取
STATUS_BAR_SERVICE系统服务,但系统提示该服务不在允许的列表中 -
错误信息列出了所有合法的
Context.getSystemService方法可用的服务名称 -
STATUS_BAR_SERVICE是隐藏的系统服务,Context.getSystemService方法仅支持公开的、文档化的系统服务 -
可以反射调用
STATUS_BAR_SERVICE系统服务,但是不推荐
处理策略
- 可以使用
@SuppressLint注解抑制警告
java
@SuppressLint("WrongConstant")
Object statusBarService = context.getSystemService(Context.STATUS_BAR_SERVICE);
-
但是,这个时候又会出现如下警告信息,
STATUS_BAR_SERVICE是 Android 13(API 33)才引入的常量,而这里的 minSdkVersion 是 24Field requires API level 33 (current min is 24): android. content. Context#STATUS_BAR_SERVICE
-
可以使用字符串代替常量,
Context.getSystemService方法允许传入字符串参数,可以绕过 API 33 的限制
java
@SuppressLint("WrongConstant")
Object statusBarService = context.getSystemService("statusbar");