Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java API级别29中不推荐使用Telephonymanager.EXTRA_传入_编号_Java_Android_Kotlin_Android Intent_Telephonymanager - Fatal编程技术网

Java API级别29中不推荐使用Telephonymanager.EXTRA_传入_编号

Java API级别29中不推荐使用Telephonymanager.EXTRA_传入_编号,java,android,kotlin,android-intent,telephonymanager,Java,Android,Kotlin,Android Intent,Telephonymanager,我需要在Android中识别来电号码,但当使用TelephonyManager.EXTRA_incoming_number时,Android studio warning EXTRA_incoming_number已被弃用。我浏览了developers.Android.com,它显示执行来电屏蔽的应用程序应改为使用CallScreeningService API。但我不知道如何使用CallScreeningService获取来电号码。有人能帮我吗?创建一个类似这样的: class Screeni

我需要在Android中识别来电号码,但当使用TelephonyManager.EXTRA_incoming_number时,Android studio warning EXTRA_incoming_number已被弃用。我浏览了developers.Android.com,它显示执行来电屏蔽的应用程序应改为使用CallScreeningService API。但我不知道如何使用CallScreeningService获取来电号码。有人能帮我吗?

创建一个类似这样的:

class ScreeningService : CallScreeningService() {

    override fun onScreenCall(callDetails: Call.Details) {
        val phoneNumber = callDetails.handle.schemeSpecificPart
        // Do stuff with phone number
    }
}
并在您的AndroidManifest.xml中注册此服务:

创建一个如下所示的

class ScreeningService : CallScreeningService() {

    override fun onScreenCall(callDetails: Call.Details) {
        val phoneNumber = callDetails.handle.schemeSpecificPart
        // Do stuff with phone number
    }
}
并在您的AndroidManifest.xml中注册此服务:


正如@Saurabh所说,筛选呼叫的新方法是通过CallScreeningService。但是,为了让该服务在Android Q及更高版本上运行,用户需要将您的应用程序设置为默认的来电显示和垃圾邮件应用程序,这是通过使用新的RoleManager类完成的

注册您的筛选服务:

 <service android:name="com.example.ScreeningService"
     android:permission="android.permission.BIND_SCREENING_SERVICE">
     <intent-filter>
         <action android:name="android.telecom.CallScreeningService"/>
     </intent-filter>
 </service>
在您的主要活动中或您认为合适的任何地方,向用户请求筛选角色:

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

抱歉使用硬编码的请求代码>,正如@Saurabh所说,筛选呼叫的新方法是通过CallScreeningService。但是,为了让该服务在Android Q及更高版本上运行,用户需要将您的应用程序设置为默认的来电显示和垃圾邮件应用程序,这是通过使用新的RoleManager类完成的

注册您的筛选服务:

 <service android:name="com.example.ScreeningService"
     android:permission="android.permission.BIND_SCREENING_SERVICE">
     <intent-filter>
         <action android:name="android.telecom.CallScreeningService"/>
     </intent-filter>
 </service>
在您的主要活动中或您认为合适的任何地方,向用户请求筛选角色:

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

抱歉使用硬编码的请求代码>。传入呼叫期间不会调用此服务类ScreeningService,也不会调用重写的方法。正如你提到的,我已经在舱单上登记了。你尝试过这个吗?谢谢你的回复。你在哪个Android版本上测试这个?我正在使用Android R并在api 29中测试。我不确定这一点,但只有默认拨号程序的CallScreeningService被调用。它可能在Android Q之后发生了更改。请尝试将您的应用程序设置为默认拨号程序。这对我也不起作用。三星S9。也许还需要更多的东西…这个服务类ScreeningService在传入调用期间不会被调用,而且重写的方法也不会被调用。正如你提到的,我已经在舱单上登记了。你尝试过这个吗?谢谢你的回复。你在哪个Android版本上测试这个?我正在使用Android R并在api 29中测试。我不确定这一点,但只有默认拨号程序的CallScreeningService被调用。它可能在Android Q之后发生了更改。请尝试将您的应用程序设置为默认拨号程序。这对我也不起作用。三星S9。也许需要更多的东西。。。