You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Billing版本切换后遇NonNull缺失及空指针异常问题

问题1:Billing 4.0.0编译时找不到androidx.annotation.NonNull

现象

使用Billing 6.0.0时,导入androidx.annotation.NonNull编译正常;降级到4.0.0后,编译报错:

error: cannot find symbol
import androidx.annotation.NonNull;
                          ^
  symbol:   class NonNull
  location: package androidx.annotation

已添加implementation "androidx.annotation:annotation:1.6.0"依赖,且gradle.properties配置了:

android.useAndroidX=true
android.enableJetifier=true

解决方案

  • 调整依赖作用域:将implementation改为api,确保依赖能传递到所有模块:
    api "androidx.annotation:annotation:1.6.0"
    
  • 清理Gradle缓存并重构:
    在终端执行命令:
    ./gradlew clean build --refresh-dependencies
    
  • 排查依赖冲突:
    执行命令查看依赖树,确认androidx.annotation:annotation是否被其他依赖排除:
    ./gradlew app:dependencies
    
    若发现排除规则,强制引入依赖:
    implementation "androidx.annotation:annotation:1.6.0" {
        force = true
    }
    
  • 确认修改的是模块级build.gradle(而非项目根目录的),同步Gradle后重新编译。

问题2:Billing v6运行时出现空指针异常

现象

使用Billing v6时,抛出系统进程空指针异常:

Exception Process: com.android.settings, PID: 20342
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.android.settingslib.media.MediaDevice.isConnected()' on a null object reference
  at com.android.settingslib.media.MediaDevice.compareTo (MediaDevice.java:325)
  at com.android.settingslib.media.MediaDevice.compareTo (MediaDevice.java:56)
  at java.util.Comparators$NaturalOrderComparator.compare (Comparators.java:52)
  at java.util.Comparators$NaturalOrderComparator.compare (Comparators.java:47)
  at java.util.TimSort.countRunAndMakeAscending (TimSort.java:355)
  at java.util.TimSort.sort (TimSort.java:220)
  at java.util.Arrays.sort (Arrays.java:1492)
  at java.util.ArrayList.sort (ArrayList.java:1470)
  at java.util.Collections.sort (Collections.java:206)
  at com.android.settingslib.media.LocalMediaManager$MediaDeviceCallback.onDeviceListAdded (LocalMediaManager.java:484)
  at com.android.settingslib.media.MediaManager.dispatchDeviceListAdded (MediaManager.java:91)
  at com.android.settingslib.media.InfoMediaManager.refreshDevices (InfoMediaManager.java:407)
  at com.android.settingslib.media.InfoMediaManager.access$000 (InfoMediaManager.java:61)
  at com.android.settingslib.media.InfoMediaManager$RouterManagerCallback.onRoutesAdded (InfoMediaManager.java:514)
  at android.media.MediaRouter2Manager.lambda$notifyRoutesAdded$0 (MediaRouter2Manager.java:671)
  at android.media.MediaRouter2Manager$$ExternalSyntheticLambda6.run
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
  at java.lang.Thread.run (Thread.java:920)

解决方案

该异常来自系统设置的媒体设备排序逻辑,并非Billing SDK直接导致,但可能由Billing v6的间接行为触发系统bug:

  • 升级Billing SDK至最新稳定版:如6.1.0及以上,官方可能修复了相关系统交互问题;
  • 检查应用媒体相关代码:若应用注册了媒体设备监听回调,在处理设备列表前对每个MediaDevice对象判空,避免系统传递空对象引发崩溃;
  • 系统版本兼容处理:若仅在特定Android版本出现,通过版本判断跳过相关排序逻辑;
  • 临时异常捕获(治标方案):若异常来自系统或第三方代码,添加全局异常捕获避免应用崩溃,但建议优先从根源修复。

内容的提问来源于stack exchange,提问作者Alexey Starinsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:15:31