Android 10 API上的CallScreeningService getExtras NULL 29

时间:2019-12-02 21:52:53

标签: android bundle phone-call android-10.0

我正在使用Android类CallScreeningService onScreenCall(Call.Details calldetails)来获取所有来电,并且一切正常!从现在开始我有一个错误,那就是在Android 10设备上,函数calldetails.getExras()和calldetails.getIntentExtras()始终返回NULL,而不是Bundle,在其中我可以阅读一些进一步的信息。在Android 9设备及更低版本上,一切正常。

有人有类似的问题吗?这是源代码和一些声明:

public class IncommingCallService extends CallScreeningService {

    @Override
    public void onScreenCall(Call.Details callDetails) {
                if (callDetails.getExtras() != null) {
                        Log.d(LOG_TAG, "Everything works on Android 9 or older");
                }else{
                        Log.d(LOG_TAG, "Its Null on Android 10!");
                }  

                if (callDetails.getIntentExtras() != null) {
                        Log.d(LOG_TAG, "Everything works on Android 9 or older");
                }else{
                        Log.d(LOG_TAG, "Its Null on Android 10!");
                }     
}

Manifest.xml:

<service android:name=".call_handler.IncommingCallService"
    android:permission="android.permission.BIND_SCREENING_SERVICE">
     <intent-filter>
          <action android:name="android.telecom.CallScreeningService"/>
     </intent-filter>
</service>

2 个答案:

答案 0 :(得分:0)

根据Android文档:

  

注意:提供给呼叫筛选服务的Call.Details实例   将仅设置以下属性。其余的   Call.Details属性将设置为其默认值   或为空。

     

Call.Details#getCallDirection()

     

Call.Details#getConnectTimeMillis()

     

Call.Details#getCreationTimeMillis()

     

Call.Details#getHandle()

     

Call.Details#getHandlePresentation()

     

仅在以下位置拨打电话   Call.Details#getHandle()Uri#getScheme()是PhoneAccount#SCHEME_TEL   通过了电话筛选。此外,仅呼叫不在   用户的联系人已通过筛选。对于拨出电话,否   拨号后的数字被传递。

所以您看到的只是Android 10的预期行为。

答案 1 :(得分:0)

在 Android 29+ 上,您需要用户权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
        Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING);
        startActivityForResult(intent, 1);
    }