android 7 中第三方应用程序可以实现 CallScreeningService 吗?

Can a third-party app implement CallScreeningService in android 7?

Android API 24 级引入了一项名为 CallScreeningService 的新服务。该文档说该服务可以由默认拨号程序实现以筛选来电。我想在我自己的应用程序中实现此服务,最好是 而不是 创建整个拨号器应用程序,但是当来电时 OS 似乎忽略了一个简单的天真实现发生了。

AndroidManifest.xml 片段:

<service android:name="com.example.callbouncer.CallService" android:permission="android.permission.BIND_SCREENING_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.CallScreeningService"/>
    </intent-filter>
</service>

CallService.java:

// imports...
public class CallService extends CallScreeningService {
    @Override
    public void onScreenCall(Call.Details callDetails) {
        CallResponse.Builder response = new CallResponse.Builder();
        Log.e("CallBouncer", "Call screening service triggered");
        respondToCall(callDetails, response.build() );
    }
}

构建或安装此程序时没有错误,但似乎没有进行筛选。我做错了什么(比如清单或服务中缺少 implementations/overrides )还是不可能?如果在这样的小应用程序中不可能,如果我实现一个完整的拨号应用程序并将其设置为默认拨号程序是否可能?最后,如果是这样,是否有什么阻止我从 AOSP 中分叉出拨号器并向其添加我的功能?

查看您链接到的文档:

This service can be implemented by the default dialer (see getDefaultDialerPackage()) to allow or disallow incoming calls before they are shown to a user.

不要认为您可以在单独的应用程序中执行此操作(至少使用当前界面:我希望在不太远的功能中它会被公开)。

从 Android 10 (API 29+) 开始,您可以拥有一个 CallScreeningService 而无需 也实现整个拨号器应用程序。在 Android 10 之前,只会调用默认拨号器应用程序的调用 CallScreeningService

https://developer.android.com/about/versions/10/features#call-screening

不过不要太兴奋,因为它有很多错误并且不能像文档中所说的那样工作:

我的已知联系人呼叫解决方法是要求用户访问联系人并检查来电者是否在用户的联系人中。目前没有其他问题的解决方法。

我制作了一个非常基本的筛选应用程序,它拒绝来自不在用户联系人中的号码的所有呼叫,如果您愿意,您可以使用一个示例:https://github.com/joshfriend/gofccyourself