【问题标题】:Telephonymanager.EXTRA_INCOMING_NUMBER is deprecated in API level 29Telephonymanager.EXTRA_INCOMING_NUMBER 在 API 级别 29 中已弃用
【发布时间】:2020-11-09 17:21:28
【问题描述】:

我需要在 Android 中识别来电电话号码,但使用 TelephonyManager.EXTRA_INCOMING_NUMBER android studio 警告 EXTRA_INCOMING_NUMBER 已弃用。我通过了开发人员.android.com,它显示执行呼叫筛选的应用应使用 CallScreeningService API。但我不知道如何使用 CallScreeningService 来获取来电电话号码。谁能帮帮我?

【问题讨论】:

    标签: java android kotlin android-intent telephonymanager


    【解决方案1】:

    正如@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 -> {}
               }
           }
      

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

    【讨论】:

      【解决方案2】:

      像这样创建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>
      

      【讨论】:

      • 这个服务类“ScreeningService”在来电期间没有被调用,也没有被覆盖的方法被调用。正如你提到的,我已经在清单中注册了这个。你试过吗?谢谢你的回复。
      • 您在哪个 Android 版本上进行测试?
      • 我正在使用 android R 并在 api 29 中进行了测试。
      • 我不确定这一点,但只有默认拨号器应用程序的 CallScreeningService 被调用。它可能在 Android Q 之后发生了变化。尝试将您的应用设置为默认拨号器。
      • 对我也不起作用。三星S9。也许还需要一些东西......
      【解决方案3】:

      我知道现在已经很晚了,但是如果有人遇到类似问题,我会为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 =&gt; ActionPhoneStateChanged 电话号码后,第一次为空,但第二次应填充。 所以要做好第二次识别 Api 28+ 电话号码的准备。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 2020-12-22
        • 1970-01-01
        • 1970-01-01
        • 2022-08-12
        • 2021-03-14
        • 2019-11-20
        相关资源
        最近更新 更多