統合された通話履歴

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>

通話ログの記録を除外する

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

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)では、CallLog.Calls コンテンツ プロバイダにクエリ パラメータ include_voip_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 インテントが含まれます。このインテントには、インテント エクストラ TelecomManager.EXTRA_UUID に通話の 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)