Telephonymanager.EXTRA_INCOMING_NUMBER 在 API 级别 29 中已弃用

eli*_*iot 1 java android android-intent telephonymanager kotlin

我在情况下,我需要确定的Android来电的电话号码,但使用时 TelephonyManager.EXTRA_INCOMING_NUMBER机器人工作室警告EXTRA_INCOMING_NUMBER已被弃用。我通过电话进行筛查应该使用的developers.android.com,它显示了应用CallScreeningService API代替. 但我不知道如何使用 CallScreeningService 来获取来电号码。任何人都可以帮助我吗?

小智 5

正如@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>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建您的服务类:

     @RequiresApi(api = Build.VERSION_CODES.N)
     class ScreeningService : CallScreeningService() {
    
         override fun onScreenCall(details: Details) {
             //code here
         }
    
     }
    
    Run Code Online (Sandbox Code Playgroud)
  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!
         }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  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 -> {}
             }
         }
    
    Run Code Online (Sandbox Code Playgroud)

为使用硬编码请求代码而道歉 >.<