API第29级中不赞成使用电话管理员EXTRA_ININCING_NUMBER



我需要在安卓系统中识别来电电话号码,但在使用TelephonyManager.EXTRA_incoming_number安卓工作室警告不推荐使用EXTRA_incoming_number。我浏览了开发者.Android.com,它显示执行呼叫屏蔽的应用程序应该使用CallScreeningService API。但我不知道如何使用CallScreeningService来获取来电电话号码。有人能帮我吗?

正如@Saurabh所说,筛选调用的新方法是通过CallScreeningService。然而,为了让该服务在Android Q及以上版本上运行,用户需要将您的应用程序设置为默认的来电显示;垃圾邮件应用程序(通过使用新的RoleManager类完成(
  1. 注册您的筛查服务:

    <service android:name="com.example.ScreeningService"
    android:permission="android.permission.BIND_SCREENING_SERVICE">
    <intent-filter>
    <action android:name="android.telecom.CallScreeningService"/>
    </intent-filter>
    </service>
    
  2. 创建您的服务类别:

    @RequiresApi(api = Build.VERSION_CODES.N)
    class ScreeningService : CallScreeningService() {
    override fun onScreenCall(details: Details) {
    //code here
    }
    }
    
  3. 请求用户在您的主要活动中扮演筛选角色(或您认为合适的位置(:

    @RequiresApi(Build.VERSION_CODES.Q)
    private fun requestScreeningRole(){
    val roleManager = getSystemService(Context.ROLE_SERVICE) as RoleManager
    val isHeld = roleManager.isRoleHeld(RoleManager.ROLE_CALL_SCREENING)
    if(!isHeld){
    //ask the user to set your app as the default screening app
    val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING)
    startActivityForResult(intent, 123)
    } else {
    //you are already the default screening app!
    }
    }
    
  4. 捕捉用户的响应:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
    123 -> {
    if (resultCode == Activity.RESULT_OK) {
    //The user set you as the default screening app!
    } else {
    //the user didn't set you as the default screening app...
    }
    }
    else -> {}
    }
    }
    

对使用硬编码请求代码表示歉意>lt;

创建这样的CallScreeningService

class ScreeningService : CallScreeningService() {
override fun onScreenCall(callDetails: Call.Details) {
val phoneNumber = callDetails.handle.schemeSpecificPart
// Do stuff with phone number
}
}

并在您的AndroidManifest.xml:中注册此服务

<service android:name="your.package.ScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService"/>
</intent-filter>
</service>

我知道已经很晚了,但如果有人有类似的问题,我会找到一个适用于TelephonyManager的API 28+的解决方案。因为仅仅识别电话号码CallScreeningService就太过分了,你可能会覆盖用户的私人设置或其他阻止垃圾邮件呼叫的应用程序。

您需要在清单中添加android.permission.READ_CALL_LOG,并在运行时请求它。

if (Build.VERSION.SdkInt >= BuildVersionCodes.P) {
if (ApplicationContext.CheckSelfPermission(Manifest.Permission.ReadCallLog) != Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadCallLog }, ACTION_READ_CALL_LOG);
}
}

如果用户允许您的应用程序读取通话日志,则在广播接收器点击OnReceive => ActionPhoneStateChanged后,第一次电话号码将为空,但第二次应该填充。因此,请做好准备,在Api 28+上可以第二次识别电话号码。

相关内容

最新更新