Telephonymanager.EXTRA_INCOMING_NUMBER 在 API 级别 29 中已弃用
Telephonymanager.EXTRA_INCOMING_NUMBER is deprecated in API level 29
我的情况是我需要在 Android 中识别来电 phone 号码,但是在使用 TelephonyManager.EXTRA_INCOMING_NUMBER android studio 警告EXTRA_INCOMING_NUMBER 已弃用。我查看了 developers.android.com,它显示执行呼叫筛选的应用应使用 CallScreeningService API 代替。但我不知道如何使用 CallScreeningService 来获取来电 phone 号码。谁能帮帮我?
像这样创建一个 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>
正如@Saurabh 所说,筛选呼叫的新方法是通过 CallScreeningService
。但是,要使服务在 Android Q 及更高版本上运行,用户需要将您的应用程序设置为默认来电显示和垃圾邮件应用程序(这是通过使用新的 RoleManager
class )
注册您的筛查服务:
<service android:name="com.example.ScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService"/>
</intent-filter>
</service>
创建你的服务class:
@RequiresApi(api = Build.VERSION_CODES.N)
class ScreeningService : CallScreeningService() {
override fun onScreenCall(details: Details) {
//code here
}
}
在您的主activity(或您认为合适的任何地方)中向用户请求筛选角色:
@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!
}
}
捕捉用户的响应:
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 -> {}
}
}
对于使用硬编码请求代码表示歉意>.<
我知道已经很晚了,但如果有人遇到类似问题,我找到了适用于 API 28+ for TelephonyManager
的解决方案。仅仅识别 phone 号码 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
phone 号码在第一次实例中将是空的,但第二次它应该被填充。
因此请做好准备,在 Api 28+ phone 号可以在第二次识别。
我的情况是我需要在 Android 中识别来电 phone 号码,但是在使用 TelephonyManager.EXTRA_INCOMING_NUMBER android studio 警告EXTRA_INCOMING_NUMBER 已弃用。我查看了 developers.android.com,它显示执行呼叫筛选的应用应使用 CallScreeningService API 代替。但我不知道如何使用 CallScreeningService 来获取来电 phone 号码。谁能帮帮我?
像这样创建一个 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>
正如@Saurabh 所说,筛选呼叫的新方法是通过 CallScreeningService
。但是,要使服务在 Android Q 及更高版本上运行,用户需要将您的应用程序设置为默认来电显示和垃圾邮件应用程序(这是通过使用新的 RoleManager
class )
注册您的筛查服务:
<service android:name="com.example.ScreeningService" android:permission="android.permission.BIND_SCREENING_SERVICE"> <intent-filter> <action android:name="android.telecom.CallScreeningService"/> </intent-filter> </service>
创建你的服务class:
@RequiresApi(api = Build.VERSION_CODES.N) class ScreeningService : CallScreeningService() { override fun onScreenCall(details: Details) { //code here } }
在您的主activity(或您认为合适的任何地方)中向用户请求筛选角色:
@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! } }
捕捉用户的响应:
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 -> {} } }
对于使用硬编码请求代码表示歉意>.<
我知道已经很晚了,但如果有人遇到类似问题,我找到了适用于 API 28+ for TelephonyManager
的解决方案。仅仅识别 phone 号码 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
phone 号码在第一次实例中将是空的,但第二次它应该被填充。
因此请做好准备,在 Api 28+ phone 号可以在第二次识别。