该应用程序编译良好,但设置中的默认应用程序不显示我的应用程序。
要将您的应用程序列为电话应用程序,您必须具有至少具有这些意图过滤器的活动(以处理ACTION_DIAL文档中提到的两种情况,也在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>
老实说,这有点违反直觉,因为设置默认电话应用程序与设置默认拨号器是分开的——前者仅控制正在进行的呼叫 UI,而后者仅控制拨号 UI。
上面的最小值可以稍微改进一下,以允许将您的拨号器设置为默认值,并通过使用这些意图过滤器从 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>
AOSP中的Dialer 应用程序声明了更多过滤器。
您可以在以下帮助下让用户更轻松地将您的应用设置为默认电话应用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)
}
这将显示一个类似于此的对话框:
请参阅使用 android.telecom 和 InCallService 接听来电,了解实际处理呼叫所需的操作。
这是一个应用程序的代码,该应用程序实现了在其自己的 UI 中处理拨号和接受/拒绝/结束呼叫所需的最低要求:
https://github.com/arekolek/simple-phone