安卓手機APP開發__構建通話應用

安卓手機APP開發__構建通話應用

目錄

概述

依賴項和權限

注冊應用

平臺集成

注冊通話

添加通話

接聽來電

拒接來電

去電

將通話置于保持狀態

斷開連接

轉接音頻

前臺支持

Surface 支持


概述

使用 Telecom Jetpack 庫為用戶提供最佳視頻和音頻體驗。借助
Telecom 框架,您可以獲得通話和通知管理、前臺支持等。
新的 Jetpack 庫增加了對以下內容的支持:

??? 通話流式傳輸和轉接
??? Android Auto 和 Wear OS 集成
??? 向后兼容性

如需詳細了解如何使用 Telecom 庫構建通話應用,請參閱 Telecom 指南。
支持的電信設備

從 Android 7(API 級別 21)開始,大多數手機都支持 Telecom 框架,
必須支持 Telecom 框架,基于 SIM 卡的通話功能才能正常運行。對于
通常不需要電話實現的設備(例如平板電腦),Android 14(API 級別 34)
引入了新要求,以強制要求支持 VoIP 的平板電腦采用適當的
Telecom 框架實現。

使用 PackageManager 檢查設備是否支持電信:

packagemanager.hasSystemFeature(PackageManager.FEATURE_TELECOM)

新的 Android Telecom Jetpack 庫可讓您輕松告知平臺您的通話處于何種狀態。

依賴項和權限

首先,打開應用模塊 build.gradle 文件,然后添加 androidx Telecom 模塊的依賴項:

dependencies {
??? implementation ("androidx.core:core-telecom:1.0.0-alpha02")
}

在應用清單中,聲明您的應用使用 MANAGE_OWN_CALLS 權限:

<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />

注冊應用

如需讓 Android 知道您的應用,您必須注冊該應用及其 capability。這
會告知 Android 您的應用支持哪些功能,例如視頻通話、通話流式傳輸和保持通話。
這些信息非常重要,以便 Android 可以自行配置以使用應用的功能。

?private val callsManager = CallsManager(context)

var capabilities: @CallsManager.Companion.Capability Int =
??? CallsManager.CAPABILITY_BASELINE or
????????? CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING or
????????? CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING

callsManager.registerAppWithTelecom(capabilities)

平臺集成

任何通話應用的兩種最常見的通話場景是來電和去電。如需正確注冊
調用的方向并適當地向用戶發送通知,請使用以下 API。

注冊通話

以下示例演示了如何注冊來電:

companion object {
? const val APP_SCHEME = "MyCustomScheme"
? const val ALL_CALL_CAPABILITIES = (CallAttributes.SUPPORTS_SET_INACTIVE
??? or CallAttributes.SUPPORTS_STREAM or CallAttributes.SUPPORTS_TRANSFER)

? const val INCOMING_NAME = "Luke"
? val INCOMING_URI: Uri = Uri.fromParts(APP_SCHEME, "", "")
? // Define all possible properties for CallAttributes
? val INCOMING_CALL_ATTRIBUTES =
??? CallAttributes(
????? INCOMING_NAME,
????? INCOMING_URI,
????? DIRECTION_INCOMING,
????? CALL_TYPE_VIDEO_CALL,
????? ALL_CALL_CAPABILITIES)
}

callAttributes 對象可以具有以下屬性:

??? displayName:調用方、會議或會話的名稱。
??? address:通話地址。請注意,這可擴展到會議鏈接。
??? direction:通話方向,例如來電或去電。
??? callType:與要傳輸的數據相關的信息,例如視頻和音頻。
??? callCapabilities:用于指定調用功能的對象。

callCapabilities 對象可以具有以下屬性:

??? streaming:指示通話是否支持將音頻流式傳輸到其他 Android 設備。
??? transfer:指示是否可以轉接來電。
??? hold:指示通話是否可以置于保持狀態。

添加通話

如果設備不支持電信,或者設置通話時出錯,則 addCall() 方法會返回異常。

try {callsManager.addCall(INCOMING_CALL_ATTRIBUTES,onIsCallAnswered, // Watch needs to know if it can answer the callonIsCallDisconnected,onIsCallActive,onIsCallInactive) {callControlScope = this}
}

注意: 添加通話并且設置 callControlScope 后,這并不意味著您正在進行通話,而是表示平臺知道您的通話。


接聽來電

撥出電話后,您必須接聽或拒絕來電。本示例演示了如何接聽來電:

when (answer(CallAttributesCompat.CALL_TYPE_AUDIO_CALL)) {is CallControlResult.Success -> {}is CallControlResult.Error -> {}
}

如果另一個通話正在進行中,answer() 將返回CallControlResult.Error,以
告知無法接聽來電的原因。在這種情況下,用戶需要將另一個通話置于保持狀態。

拒接來電

要拒絕來電,請斷開與 DisconnectCause.Rejected 的通話。

fun onRejectCall(){coroutineScope.launch {callControlScope?.let {it.disconnect(DisconnectCause(DisconnectCause.REJECTED))}}
}

去電

撥出電話時,當遠程方接聽后,您必須將通話設置為 active,讓平臺知道
通話正在進行中:

when (setActive()) {is CallControlResult.Success -> {onIsCallActive()}is CallControlResult.Error -> {updateCurrentCall {copy(errorCode = result.errorCode)}}
}

將通話置于保持狀態

如果您的通話應用支持保持通話,請使用 setInActive 告知平臺您的通話未處于活躍狀態,且麥克風和攝像頭可供其他應用隨意使用:

when (setInActive()) {is CallControlResult.Success -> {}is CallControlResult.Error -> {updateCurrentCall {copy(errorCode = result.errorCode)}}
}

斷開連接

如需斷開通話連接,請提供正當原因以告知 Telecom 堆棧斷開連接:

coroutineScope.launch {
??? callControlScope?.disconnect(DisconnectCause(DisconnectCause.LOCAL))
}

轉接音頻

在通話期間,用戶有時會在揚聲器、手機聽筒或藍牙設備等設備之間切換。
使用 availableEndpoints 和 currentCallEndpoint API
獲取用戶可用的所有設備以及哪個設備處于活動狀態的列表。

以下示例將兩個流程組合起來,創建一個界面對象,以向用戶顯示設備列表
以及哪個設備處于有效狀態:

availableEndpoint = combine(callControlScope.availableEndpoints,callControlScope.currentCallEndpoint) {availableDevices: List<CallEndpoint>, activeDevice : CallEndpoint ->availableDevices.map {EndPointUI(isActive = activeDevice.endpointName == it.endpointName, it)}
}

注意: 如果用戶連接了助聽器,平臺會自動將此設備設為默認設備。某些 OEM 可能會有不同的行為。

如需更改活躍設備,請使用 requestEndpointChange 以及要更改的 CallEndpoint。

coroutineScope.launch {
???? callControlScope?.requestEndpointChange(callEndpoint)
}

注意: 媒體流必須配置為使用 AudioManager.STREAM_VOICE_CALL


前臺支持

Telecom 庫支持前臺。對于搭載 Android 13 及更低版本的設備,此庫會
使用 ConnectionService。對于 Android 14 及更高版本,
它使用前臺類型麥克風和攝像頭來正確支持前臺服務。詳細了解前臺服務。

作為前臺要求的一部分,應用必須發布通知,讓用戶知道它正在前臺運行。

為了確保您的應用獲得前臺執行優先級,請在向平臺注冊調用后創建通知。
當應用終止調用或通知失效時,前臺優先級會被移除。

is TelecomCall.Registered -> {
??? val notification = createNotification(call)
??? notificationManager.notify(TELECOM_NOTIFICATION_ID, notification)
}

注意: 您必須在將調用添加到平臺后的 5 秒內發布通知。


Surface 支持

手表具有通用端點接收器應用。此應用可為用戶提供基本界面,例如接聽、
拒接和掛斷來電。應用通過實現 lambda 函數來支持這些操作,
以通知平臺您已在設備上執行操作。

如果您的應用沒有響應,則每個 lambda 函數都會在 5 秒后超時并拋出事務失敗。

callsManager.addCall(attributes,onIsCallAnswered, // Watch/Auto need to know if they can answer the callonIsCallDisconnected,onIsCallActive,onIsCallInactive) {
//Call Scope
}
/***  Can the call be successfully answered??*  TIP: Check the connection/call state to see if you can answer a call*  Example you may need to wait for another call to hold.**/
val onIsCallAnswered: suspend(type: Int) -> Unit = {}/*** Can the call perform a disconnect*/
val onIsCallDisconnected: suspend (cause: DisconnectCause) -> Unit = {}/***  Check is see if you can make the call active.*  Other calls and state might stop us from activating the call*/
val onIsCallActive: suspend () -> Unit = {updateCurrentCall {}
}/*** Check to see if you can make the call inactivate*/
val onIsCallInactive: suspend () -> Unit = {}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17554.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GO語言 linux部署

https://blog.csdn.net/wangye135/article/details/136177171 一、簡述 1. 可以直接在服務器上運行編譯好的二進制文件&#xff0c;不需要在服務器上下載語言環境。 2. 內置運行時環境&#xff1a;可執行文件中內置了運行時環境&#xff0c;包括垃圾回收、調度器等&#xff…

Java深拷貝淺拷貝

在Java中&#xff0c;深拷貝和淺拷貝是兩種不同的對象復制方式。 淺拷貝&#xff1a;創建一個新對象&#xff0c;然后將原對象的非靜態字段復制到新對象中。如果字段是值類型的&#xff0c;那么對該字段執行逐位復制。如果字段是引用類型的&#xff0c;則復制引用但不復制引用的…

SAP 根據報錯消息號快速定位問題

通常用戶在業務的操作過程中&#xff0c;經常會遇到報錯信息&#xff0c;有些報錯是系統控制拋出的信息&#xff0c;但是有些報錯的信息是根據不同地點業務場景對填寫的數據進行判斷校驗&#xff0c;然后給出的報錯信息&#xff0c;正常情況報錯信息一般是有文本&#xff0c;或…

【C語言】文件操作講解

C語言文件操作講解 文件文件名文件類型數據在內存中的存儲 文件緩沖區文件指針文件的打開與關閉fopenfclosefopen與fclose的使用文件的打開方式 文件的順序讀寫fputcfgetcfputsfgetsfprintffscanffwritefread輸入流與輸出流對比scanf\fscanf\sscanf與printf\fprintf\sprintfssc…

【區分vue2和vue3下的elementUI和elementUI Plus的button組件,介紹如何安裝,屬性,事件,方法等以及使用案例】

區分vue2下的Element UI和vue3下的Element Plus的Button組件 Element UI (vue2) Button組件&#xff1a;基于Vue 2的Element UI庫中的Button組件提供了多種樣式和類型&#xff0c;如默認、主要、成功、警告、危險等。 Element Plus (vue3) Button組件&#xff1a;作為Element …

匯編原理(二)寄存器——內存訪問

一個字 兩個字節 雙字 字節為8位 字為16位&#xff08;看兩格&#xff09; 雙子dword32位&#xff08;看四格&#xff09; 內存中字的存儲&#xff1a; 0地址單元中存放的字節型數據是多少&#xff1f; 0地址字單元中存放的字型數據是多少&#xff1f; 2地址字單元中存放…

Secure Operation

文章目錄 Secure Summation OperationSecure Set Union Operation Secure Summation Operation 讓我們通過一個具體的例子來說明這個算法。 假設有三個數據擁有者 S1, S2 和 S3&#xff0c;他們分別持有以下值&#xff1a; S1 持有 value1 10S2 持有 value2 20S3 持有 val…

基坑氣膜:建筑工地環保新利器—輕空間

隨著城市化進程的加快&#xff0c;建筑行業的飛速發展帶來了嚴重的環境問題&#xff0c;如噪音和粉塵污染&#xff0c;給人們的生活帶來諸多不便。為了解決這些問題&#xff0c;建筑行業一直在探索更為環保和高效的施工方式。近年來&#xff0c;基坑氣膜技術逐漸嶄露頭角&#…

Audition 2024 for Mac/Win:音頻錄制與編輯的卓越之選

隨著數字媒體的不斷發展&#xff0c;音頻內容創作已經成為各行各業中不可或缺的一部分。無論是音樂制作、廣播節目、播客錄制還是影視配音&#xff0c;都需要高品質的音頻錄制和編輯工具來實現專業水準的作品。在這個充滿競爭的時代&#xff0c;要想在音頻創作領域脫穎而出&…

解線性方程組——最速下降法及圖形化表示 | 北太天元 or matlab

一、思路轉變 A為對稱正定矩陣&#xff0c; A x b Ax b Axb 求解向量 x x x這個問題可以轉化為一個求 f ( x ) f(x) f(x)極小值點的問題&#xff0c;為什么可以這樣&#xff1a; f ( x ) 1 2 x T A x ? x T b c f(x) \frac{1}{2}x^TAx - x^Tb c f(x)21?xTAx?xTbc 可…

ZooKeeper安裝

安裝Zookeeper 1、下載Zookeeper安裝包 打開鏈接選擇一個版本進行下載 https://zookeeper.apache.org/releases.html2、上傳Zookeeper安裝包到集群 輸入命令 scp apache-zookeeper-3.8.4-bin.tar.gz hadoop192.168.88.100:/tmp也可以使用xftp等上傳&#xff0c;物理機用u盤…

Python 網格變換之平移、旋轉、縮放、變換矩陣

網格變換 一、平移1.1、代碼示例1.2、結果示例二、旋轉2.1、代碼示例2.2、結果示例三、縮放3.1、代碼示例3.2、結果示例四、變換矩陣4.1、代碼示例4.2、結果示例一、平移 網格平移:將網格沿著特定的方向移動一段距離。 1.1、代碼示例

Android實現無線連接ADB調試

無線連接ADB(Android Debug Bridge)進行調試,是一種方便的遠程調試方式,尤其適合在沒有USB線或者設備物理接觸不便的情況下使用。下面是如何設置無線ADB調試的步驟: 1. 準備工作 確保你的電腦和Android設備連接在同一局域網(Wi-Fi)下。 2. 在Android設備上操作 允許…

hadoop其中一個節點壞了,用其他節點克隆的教程+datanode正常顯示,但master只有1個livenodes

如果一個slave出了非常棘手的問題&#xff0c;還是用其他slave克隆吧&#xff0c;很快的。 克隆教程&#xff1a; 1.克隆后只需要&#xff1a;sudo gedit /etc/network/interfaces&#xff0c;把ip地址改好。 2.ssh不需要重新設置&#xff0c;其他東西也都不需要重新進行設置…

linux日常運維2

下載linux離線安裝包---- 利用 Downloadonly 插件下載 RPM 軟件包及其所有依賴包 1. 先找個可以上網的linux操作系統&#xff0c;這里是以centos7操作系統為例&#xff0c;如果要使用centos6就先安裝一個centos6的系統&#xff0c;然后讓他可以上網&#xff0c;后面步驟如下 a.…

《精通Stable Diffusion AI繪畫:基礎技巧、實戰案例與海量資源一站式學習》

隨著人工智能技術的迅猛發展&#xff0c;AI繪畫已經成為了一個炙手可熱的話題。特別是在設計、藝術和創意領域&#xff0c;AI繪畫工具的出現無疑為創作者們帶來了更多的可能性和便利。《Stable Diffusion AI繪畫從提示詞到模型出圖》這本書&#xff0c;就是一本深入解析Stable …

打包遷移Python env環境

打包遷移Python env環境 平常工作中可能遇到python虛擬環境遷移的場景&#xff0c;總結了如下幾個方法。適用于同架構、相同類型系統之間的python虛擬環境遷移。 方法一&#xff1a;使用pip freeze和requirements.txt 這種方法將當前環境中的所有包記錄到一個文件中&#xff0c…

恢復視頻3個攻略:從不同情況下的恢復方法到實踐!

隨著科技的進步&#xff0c;我們的生活被各種各樣的數字內容所包圍&#xff0c;其中&#xff0c;視頻因其獨特的記錄性質&#xff0c;承載著許多重要的資料。但不管是自媒體人還是普通人日常生活隨手一拍&#xff0c;都會遇到誤刪視頻的情況。為了幫助您找回手機視頻&#xff0…

從零學爬蟲:使用比如說說解析網頁結構

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言 二、網頁結構概述 示例&#xff1a;查看網頁結構 三、使用比如說說解析網頁 1.…

windows10更改文件默認打開軟件

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??感謝大家點贊&#x1f44d;&…