用 InCallService 替换 Android 6 和 7 上的默认 Phone 应用程序
Replacing default Phone app on Android 6 and 7 with InCallService
Android API 级别 23 添加 InCallService
到 提供用于管理 phone 呼叫的用户界面 。该文档提供了一个示例清单注册,但我无法让它工作。该应用程序编译正常,但设置中的默认应用程序未显示我的应用程序。
我找到有关该主题的任何信息的唯一地方是 ,它在一年前关闭。对该问题的评论建议添加 android.intent.action.DIAL
activity 但这对我也没有帮助。我也在 activity.
中尝试了其他意图的各种组合(android.intent.action.CALL_DIAL
和 android.intent.action.ANSWER
)
是否有替换 phone 应用程序所需的代码示例? 类 需要提供一些工作方法让应用显示吗?
The app compiles fine but Default Apps in settings doesn't show my app.
要将您的应用列为 Phone 应用,您的 activity 必须至少具有这些意图过滤器(以处理 ACTION_DIAL, also mentioned in DefaultDialerManager hidden class 文档中提到的两种情况):
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
</intent-filter>
老实说,这有点违反直觉,因为设置默认 Phone 应用程序与设置默认拨号器是分开的——前者仅控制正在进行的通话 UI,而后者控制仅拨号 UI.
上面的最小值可以稍微改进,以允许将您的拨号器设置为默认值,并通过使用这些 Intent 过滤器从 Web 浏览器启动:
<intent-filter>
<!-- Handle links from other applications -->
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DIAL" />
<!-- Populate the system chooser -->
<category android:name="android.intent.category.DEFAULT" />
<!-- Handle links in browsers -->
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Dialer app in AOSP 声明了更多过滤器。
在 TelecomManager
:
的帮助下,您可以让用户更轻松地将您的应用设置为默认 Phone 应用
if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
.let(::startActivity)
}
这将显示一个类似于此的对话框:
请参阅 以了解您需要执行哪些操作才能真正自行处理呼叫。
这是实现处理拨号所需的最低要求的应用代码,accepting/rejecting/ending 自己调用 UI:
Android API 级别 23 添加 InCallService
到 提供用于管理 phone 呼叫的用户界面 。该文档提供了一个示例清单注册,但我无法让它工作。该应用程序编译正常,但设置中的默认应用程序未显示我的应用程序。
我找到有关该主题的任何信息的唯一地方是 android.intent.action.DIAL
activity 但这对我也没有帮助。我也在 activity.
android.intent.action.CALL_DIAL
和 android.intent.action.ANSWER
)
是否有替换 phone 应用程序所需的代码示例? 类 需要提供一些工作方法让应用显示吗?
The app compiles fine but Default Apps in settings doesn't show my app.
要将您的应用列为 Phone 应用,您的 activity 必须至少具有这些意图过滤器(以处理 ACTION_DIAL, also mentioned in DefaultDialerManager hidden class 文档中提到的两种情况):
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
</intent-filter>
老实说,这有点违反直觉,因为设置默认 Phone 应用程序与设置默认拨号器是分开的——前者仅控制正在进行的通话 UI,而后者控制仅拨号 UI.
上面的最小值可以稍微改进,以允许将您的拨号器设置为默认值,并通过使用这些 Intent 过滤器从 Web 浏览器启动:
<intent-filter>
<!-- Handle links from other applications -->
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DIAL" />
<!-- Populate the system chooser -->
<category android:name="android.intent.category.DEFAULT" />
<!-- Handle links in browsers -->
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Dialer app in AOSP 声明了更多过滤器。
在 TelecomManager
:
if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
.let(::startActivity)
}
这将显示一个类似于此的对话框:
请参阅
这是实现处理拨号所需的最低要求的应用代码,accepting/rejecting/ending 自己调用 UI: