产品提出一个需求:在来电或通话时获取来电号码(因为内部使用的是虚拟号,需要调接口查询对方的身份)并展示相关信息
先上个效果图
解决方案:在前台服务中注册通话状态的监听,在响铃和通话时可以获取到手机号码,做完相关的逻辑处理后,在前台服务中使用对话框显示
声明权限
监听手机的状态肯定是危险权限的 ,需要我们配置清单中声明后再运行中申请
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><!--前台服务权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /><!--手机通话状态权限-->
<uses-permission android:name="android.permission.READ_CALL_LOG" /><!--获取来电号码权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><!--悬浮窗权限,6.0之前就有-->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /><!--悬浮窗权限,6.0之后额外添加-->
在activity中申请权限,申请权限使用的是郭霖大大的PermissionX
dependencies {
...
//PermissionX
implementation 'com.guolindev.permissionx:permissionx:1.5.1'
}
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
PermissionX.init(this)
.permissions(Manifest.permission.READ_CALL_LOG,Manifest.permission.READ_CALL_LOG,Manifest.permission.SYSTEM_ALERT_WINDOW)
.onExplainRequestReason {
scope, deniedList ->
//先获取正常的权限,获取完后,走这里获取特殊权限(如悬浮窗等,必须要去系统页面手动设置)
val message = "需要您开启以下权限才能正常使用"
scope.showRequestReasonDialog(deniedList, message, "去开启", "拒绝")
}
.request {
allGranted, _, deniedList ->
if (allGranted) {