javaandroidkotlinandroid-intenttelephonymanager

Telephonymanager.EXTRA_INCOMING_NUMBER is deprecated in API level 29


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?


Solution

  • 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 >.<