Telephonymanager.EXTRA_INCOMING_NUMBER is deprecated in API level 29

社会主义新天地 提交于 2020-12-26 18:38:24

问题


I am in situation where I need to identify incoming call phone number in Android but when using TelephonyManager.EXTRA_INCOMING_NUMBER android studio warning EXTRA_INCOMING_NUMBER is deprecated.I gone through the developers.android.com, it shows apps performing call screening should use the CallScreeningService API instead. But I can't figure out how to use CallScreeningService to get incoming call phone number. Anyone can help me?


回答1:


As @Saurabh said, the new way to screen calls is through the CallScreeningService. However, for the service to work on Android Q and up, the user needs to set your app as the default caller ID & spam app (which is done by using the new RoleManager class)

  1. Register your screening service:

     <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. Create you service class:

     @RequiresApi(api = Build.VERSION_CODES.N)
     class ScreeningService : CallScreeningService() {
    
         override fun onScreenCall(details: Details) {
             //code here
         }
    
     }
    
  3. Request the screening role from the user in your main activity (or where ever you see as fit):

     @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. Catch the user's response:

     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 -> {}
             }
         }
    

Apologies for using a hard coded request code >.<




回答2:


Create a CallScreeningService like this:

class ScreeningService : CallScreeningService() {

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

And register this service in your 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>


来源:https://stackoverflow.com/questions/62995702/telephonymanager-extra-incoming-number-is-deprecated-in-api-level-29

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!