.NET MAUI Android使用CallScreeningService时出现类找不到异常
问题分析与解决方案
1. 包名与清单声明不匹配
检查CallBlockerService类的实际包名是否严格等于com.katoapps.callblocker,同时确认AndroidManifest.xml中服务的android:name属性是否准确:
- 如果清单根元素的
package属性已经是com.katoapps.callblocker,服务名可以简写为.CallBlockerService;如果使用完整类名,必须和实际类的包名+类名完全一致,注意大小写敏感。
2. 混淆规则误移除服务类
若开启了ProGuard/R8代码混淆,服务类可能被当作无用代码移除。在proguard-rules.pro中添加保留规则:
-keep class com.katoapps.callblocker.CallBlockerService { *; } -keep class android.telecom.CallScreeningService { *; }
同步清理并重新构建项目,确保混淆不会影响服务类的保留。
3. Xamarin项目的特殊配置问题
从异常中的Java.Lang.RuntimeException判断你可能使用Xamarin.Android开发:
- 确保服务类添加了正确的
[Service]特性,显式指定Java端类名:[Service(Name = "com.katoapps.callblocker.CallBlockerService", Permission = "android.permission.BIND_CALL_SCREENING_SERVICE")] [IntentFilter(new[] { "android.telecom.CallScreeningService" })] public class CallBlockerService : CallScreeningService { // 实现服务逻辑 } - 确认服务类的访问修饰符为
public,否则系统无法实例化该类。
4. 清单文件服务声明错误
检查AndroidManifest.xml中的服务声明是否符合要求:
- 服务标签必须嵌套在
<application>标签内部,且包含正确的Intent Filter和权限:<service android:name="com.katoapps.callblocker.CallBlockerService" android:permission="android.permission.BIND_CALL_SCREENING_SERVICE"> <intent-filter> <action android:name="android.telecom.CallScreeningService" /> </intent-filter> </service> - 确认已在清单中声明必要权限:
同时注意Android 10+需要引导用户通过<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Settings.ACTION_MANAGE_APP_CALL_SCREENING授权通话筛选权限。
5. 构建缓存问题
清理项目构建缓存,执行以下操作:
- Android Studio:点击
Build > Clean Project,再Build > Rebuild Project - Xamarin:右键项目选择
Clean,再Rebuild
重启模拟器后重新测试,避免旧缓存导致的类加载异常。
内容的提问来源于stack exchange,提问作者Carl Schmidt
相关产品推荐
相关产品推荐

