統合された通話履歴

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)

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

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 に設定されている場合)、アプリは内部状態を更新したり、コールバック処理に使用されるローカルにキャッシュ保存された通話マッピングのクリアなどのクリーンアップを実行したりできます。