統合された通話履歴

VoIP アプリケーションは、通話をシステムの通話履歴に統合できます。これにより、ユーザーは VoIP 通話履歴をシステムの電話アプリで一元的に確認し、電話アプリから直接折り返すことができます。このガイドでは、VoIP 通話アプリシステムの電話アプリに必要な変更と、統合された通話履歴の設定の管理について説明します。

通話アプリの変更

VoIP アプリをシステムの通話履歴と統合する手順は次のとおりです。

コールバック インテント フィルタを登録する

システム保護インテント TelecomManager.ACTION_CALL_BACK を登録します。

このインテント フィルタが適切に登録されると、アプリが CallsManager.addCall やその他の関連する Telecom API を使用して追加した通話は、システムによって自動的に 記録されます。ユーザーが電話アプリで VoIP 通話ログエントリを選択して折り返す場合、システムはこの登録済みインテントを使用して、後でアプリにコールバックを送信します。

<!-- Activity to handle the callback intent from the system dialer -->
<activity
    android:name=".VoipCallActivity"
    android:exported="true">

    <!-- Register callback intent -->
    <intent-filter>
        <action android:name="android.telecom.action.CALL_BACK" />
    </intent-filter>
</activity>

通話のロギングを除外する

コールバックが登録されると、すべての通話がシステムの電話アプリに記録されます。通話ごとに除外するには、isLogExcluded ブール値を true 内の CallAttributesCompatに設定します。

CallAttributesCompat(
    displayName = displayName,
    address = address,
    isLogExcluded = excludeCallLogging, // to exclude call from logging
    direction = if (isIncoming) {
        CallAttributesCompat.DIRECTION_INCOMING
    } else {
        CallAttributesCompat.DIRECTION_OUTGOING
    },
    callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL,
    callCapabilities = (
        CallAttributesCompat.SUPPORTS_SET_INACTIVE
            or CallAttributesCompat.SUPPORTS_STREAM
            or CallAttributesCompat.SUPPORTS_TRANSFER
        ),
)

コールバックを処理する

CallsManager.addCall を介して追加された通話には、 CallControlScope.getCallId を介して一意の UUID が割り当てられます。

// check the intent action for CALL_BACK
if (intent.action == TelecomManager.ACTION_CALL_BACK) {
    launchCall(
        // fetching stored call details for the UUID to initiate callback
        callDetails = getCallDetails(
            uuid = intent.getStringExtra(TelecomManager.EXTRA_UUID)
        )
    )
}

通話履歴エントリを確認する

システムの通話履歴には、一定数のエントリが保持され、古い通話記録は最終的に削除されます。アプリはコールバック処理のために UUID と通話の詳細のマッピングを保存するため、システムの通話履歴にどの UUID が残っているかを定期的に確認する必要があります。UUID がシステムログに存在しなくなった場合、ユーザーはその通話のコールバックを開始できず、アプリはローカル ストレージからマッピングを安全に削除できます。これにより、ストレージを最適化できます。

システムログ内のアプリに割り当てられた UUID の現在のリストを取得するには、CallLog.Calls.CONTENT_VOIP_URI を使用します。

電話アプリの変更

電話アプリで VoIP 通話履歴を表示し、VoIP アプリへのコールバックを開始できるようにする手順は次のとおりです。

電話アプリに VoIP 通話履歴を表示する

デフォルトでは、VoIP アプリの通話履歴は電話アプリに表示されません。統合された通話履歴を電話アプリに表示するには、次の操作を行います。

  • Android 16.1(API レベル 36.1)では、クエリ パラメータ include_voip_callsCallLog.Calls コンテンツ プロバイダに追加して、VoIP 通話履歴を表示します。

    CallLog.Calls.CONTENT_URI.buildUpon()
        .appendQueryParameter("include_voip_calls", "true")
        .build()

  • Android 17(API レベル 37)以降では、次の形式化されたコンテンツ プロバイダとパラメータキーを使用します。

電話アプリからコールバックを開始する

電話アプリからコールバックを開始するには、TelecomManager.placeCall を使用します。プラットフォームは、通話履歴のログエントリの一意の CallLog.Calls._ID を使用して、正しい VoIP アプリを起動します。この起動には、折り返し通話を開始するためのシステム定義アクションである TelecomManager.ACTION_CALL_BACK インテントが含まれます。このインテントには、通話の UUID が インテント エクストラ TelecomManager.EXTRA_UUID に含まれているため、VoIP アプリは どの通話に折り返しているかを特定できます。

// Uri generated with unique ID of the call log entry to launch the respective VoIP app for callback
val address = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId)

// extra information required to initiate callback
val extras = Bundle()

telecomManager.placeCall(address, extras)

統合された通話履歴の設定を管理する

Android 17(API レベル 37)以降では、ユーザーはシステム設定(通常は [設定 > 通話アカウント > 統合された通話履歴] またはデフォルトの電話アプリ内)で、アプリごとに統合された通話履歴を表示して切り替えることができます。サードパーティの通話アプリと電話アプリの両方で、これらの設定を操作できます。

統合された通話履歴の設定を開くには、 TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION インテントのアクションを使用して Activity を開始します。

val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION)
startActivity(intent)

ユーザーがシステム設定でアプリの統合された通話履歴をオフにすると、システムはそのパッケージの既存の通話履歴エントリをすべてネイティブの通話履歴プロバイダ(CallLog.Calls)から即座に完全に削除します。そのアプリによって開始された通話、またはそのアプリ宛てに受信した通話は、システムの電話アプリに記録されません。

設定の変更をリッスンする

ユーザーがシステム設定または電話アプリで通話アプリの統合された通話履歴を有効または無効にしたときに同期を維持するには、 ブロードキャスト インテント TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE (android.telecom.action.VOIP_CALL_LOG_PREFERENCE) のブロードキャスト レシーバを登録します。

val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE) {
            // Status of the Unified Call History of the app
            val isEnabled = intent.getBooleanExtra(
                TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS,
                true
            )
        }
    }
}

ユーザーが切り替えをフリップすると、プラットフォームはこのインテントをアプリにブロードキャストします。このインテントには、 TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUSエクストラに更新されたブール値の状態が含まれています。アプリは、CallLog.Calls に対する定期的な検証を待つのではなく、このブロードキャストをリッスンできます。統合された通話履歴が無効になっている場合(つまり、false に設定されている場合)、アプリは内部状態を更新したり、コールバック処理に使用されるローカルにキャッシュされた通話マッピングをクリアするなどのクリーンアップを実行したりできます。