Bài Học Lập Trình Android - Xây Dựng Một Ứng Dụng Gọi Điện

Thảo luận trong 'Học tập' bởi HoitruongS4, 12/3/2019.

  1. HoitruongS4

    HoitruongS4 Thành viên tập sự

    Tham gia:
    14/8/2018
    Bài viết:
    15
    Đã được thích:
    0
    Điểm thành tích:
    1
    Ứng dụng gọi điện cho phép người dùng nhận hoặc thực hiện cuộc gọi âm thanh hoặc video trên thiết bị của họ.

    Ứng dụng gọi điện sử dụng giao diện người dùng của riêng họ cho các cuộc gọi thay vì sử dụng giao diện ứng dụng Điện thoại mặc định, như được hiển thị trong ảnh chụp màn hình sau.



    [​IMG]

    Học lập trình Android chuyên nghiệp​

    Một ví dụ về ứng dụng gọi điện sử dụng giao diện người dùng của chính nó

    Khung Android bao gồm Android. telecom gói, chứa các lớp giúp bạn xây dựng ứng dụng gọi điện theo khung viễn thông.

    >> Xây dựng ứng dụng Học lập trình Android của bạn theo khung viễn thông cung cấp các lợi ích sau <<

    Ứng dụng của bạn tương tác chính xác với hệ thống con viễn thông gốc trong thiết bị.

    Ứng dụng của bạn tương tác chính xác với các ứng dụng gọi điện khác cũng tuân thủ khuôn khổ.

    Khung giúp ứng dụng của bạn quản lý định tuyến âm thanh và video.

    Khung giúp ứng dụng của bạn xác định xem các cuộc gọi của nó có tập trung hay không.

    Khai báo và giấy phép

    Trong manifest ứng dụng của bạn, tuyên bố rằng ứng dụng của bạn sử dụng MANAGE_OWN_CALLS, READ_CALL_LOG và READ_PHONE_STATE cho phép, như trong ví dụ sau:<manifest … >

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

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

    <!-- Needed only if your calling app reads numbers from the `PHONE_STATE`

    intent action. -->

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



    </manifest>

    Để biết thêm thông tin về việc khai báo quyền ứng dụng, xem Quyền .

    Bạn phải khai báo một dịch vụ chỉ định lớp thực hiện ConnectionService lớp trong ứng dụng của bạn. Hệ thống con viễn thông yêu cầu dịch vụ tuyên bố sự

    BIND_TELECOM_CONNECTION_SERVICE cho phép để có thể liên kết với nó. Ví dụ sau đây cho thấy cách khai báo dịch vụ trong bảng kê khai ứng dụng của bạn:

    <service android:name="com.example.MyConnectionService"

    android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">

    <intent-filter>

    <action android:name="android.telecom.ConnectionService" />

    </intent-filter>

    </service>

    Để biết thêm thông tin về khai báo các thành phần ứng dụng, bao gồm các dịch vụ, hãy xem Thành phần ứng dụng .

    Triển khai dịch vụ kết nối

    Ứng dụng gọi điện của bạn phải cung cấp việc triển khai ConnectionService lớp mà hệ thống con viễn thông có thể liên kết. Việc ConnectionService triển khai của bạn nên ghi đè các phương thức sau: onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)

    Hệ thống con viễn thông gọi phương thức này để đáp ứng với cuộc gọi ứng dụng của bạn placeCall(Uri, Bundle) để tạo một cuộc gọi đi mới.

    Ứng dụng của bạn trả về một phiên bản mới của Connection việc triển khai lớp của bạn (để biết thêm thông tin, hãy xem Thực hiện kết nối ) để thể hiện cuộc gọi đi mới. Bạn có thể tùy chỉnh thêm kết nối đi bằng cách thực hiện các hành động sau:

    Ứng dụng của bạn nên gọi setConnectionProperties(int) phương thức với PROPERTY_SELF_MANAGED hằng số là đối số để chỉ ra rằng kết nối bắt nguồn từ ứng dụng gọi điện.

    Nếu ứng dụng của bạn có hỗ trợ đặt cuộc gọi ở trạng thái giữ, hãy gọi setConnectionCapabilities(int) phương pháp và thiết lập các tham số cho các bit giá trị mặt nạ của CAPABILITY_HOLDvà CAPABILITY_SUPPORT_HOLD hằng số.

    Để đặt tên của người gọi, sử dụng setCallerDisplayName(String, int)phương thức truyền PRESENTATION_ALLOWED hằng số làm int tham số để chỉ ra rằng tên người gọi sẽ được hiển thị.

    Để đảm bảo rằng cuộc gọi đi có trạng thái video thích hợp, hãy gọi setVideoState(int) phương thức của Connection đối tượng và gửi giá trị được trả về bởi getVideoState() phương thức của ConnectionRequest đối tượng. onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)

    Hệ thống con viễn thông gọi phương thức này khi ứng dụng của bạn gọi placeCall(Uri, Bundle)phương thức và không thể thực hiện cuộc gọi đi.

    Để đối phó với tình huống này, ứng dụng của bạn nên thông báo cho người dùng (ví dụ: sử dụng hộp cảnh báo hoặc bánh mì nướng) rằng không thể thực hiện cuộc gọi đi.

    Ứng dụng của bạn có thể không thể thực hiện cuộc gọi nếu có cuộc gọi khẩn cấp đang diễn ra hoặc nếu có cuộc gọi đang diễn ra trong một ứng dụng khác không thể tạm dừng trước khi thực hiện cuộc gọi của bạn. onCreateIncoming Connection (PhoneAccountHandle, ConnectionRequest)

    Hệ thống con viễn thông gọi phương thức này khi ứng dụng của bạn gọi addNewIncomingCall (PhoneAccountHandle, Bundle) phương thức để thông báo cho hệ thống về một cuộc gọi đến mới trong ứng dụng của bạn.

    Ứng dụng của bạn trả về một phiên bản mới của Connection việc triển khai của bạn (để biết thêm thông tin, hãy xem Thực hiện kết nối ) để thể hiện cuộc gọi đến mới. Bạn có thể tùy chỉnh thêm kết nối đến bằng cách thực hiện các hành động sau:

    Ứng dụng của bạn nên gọi setConnectionProperties (int) phương thức với PROPERTY_SELF_MANAGED hằng số là đối số để chỉ ra rằng kết nối bắt nguồn từ ứng dụng gọi điện.

    Nếu ứng dụng của bạn có hỗ trợ đặt cuộc gọi ở trạng thái giữ, hãy gọi setConnectionCapabilities (int) phương pháp và thiết lập các tham số cho các bit giá trị mặt nạ của CAPABILITY_HOLD và CAPABILITY_SUPPORT_HOLD hằng số.

    Để đặt tên của người gọi, sử dụng setCallerDisplay Name(String, int) phương thức truyền PRESENTATION_ALLOWED hằng số làm int tham số để chỉ ra rằng tên người gọi sẽ được hiển thị.

    Để chỉ định số điện thoại hoặc địa chỉ của cuộc gọi đến, hãy sử dụng setAddress(Uri, int)phương thức của Connection đối tượng.

    Để đảm bảo rằng cuộc gọi đi có trạng thái video thích hợp, hãy gọi setVideoState (int)phương thức của Connection đối tượng và gửi giá trị được trả về bởi getVideoState () phương thức củaConnectionRequest đối tượng. onCreateIncomingConnectionFailed (PhoneAccountHandle, ConnectionRequest)

    Hệ thống con viễn thông gọi phương thức này khi ứng dụng của bạn gọi addNewIncomingCall (PhoneAccountHandle, Bundle) phương thức để thông báo cho Viễn thông về một cuộc gọi đến mới, nhưng cuộc gọi đến không được phép (để biết thêm thông tin, hãy xem các ràng buộc cuộc gọi ).

    Ứng dụng của bạn nên âm thầm từ chối cuộc gọi đến, tùy chọn đăng thông báo để thông báo cho người dùng về cuộc gọi nhỡ.

    Thực hiện kết nối

    Ứng dụng của bạn sẽ tạo một lớp con Connection để thể hiện các cuộc gọi trong ứng dụng của bạn. Bạn nên ghi đè các phương thức sau trong quá trình thực hiện: onShowIncomingCallUi()

    Hệ thống con viễn thông gọi phương thức này khi bạn thêm một cuộc gọi đến mới và ứng dụng của bạn sẽ hiển thị giao diện người dùng cuộc gọi đến.

    Lưu ý: Khi bạn thêm một cuộc gọi đến mới, hệ thống con viễn thông sẽ hiển thị UI cuộc gọi đến thay mặt cho ứng dụng của bạn nếu có một cuộc gọi đang diễn ra trong một ứng dụng khác không thể tạm dừng.

    Người dùng có thể quyết định trả lời cuộc gọi đến và bỏ cuộc gọi hiện tại hoặc từ chối cuộc gọi đến. Trong những trường hợp này, onShowIncomingCallUI() phương thức của ứng dụng của bạn không được gọi. onCallAudioStateChanged(CallAudioState)

    Hệ thống con viễn thông gọi phương thức này để thông báo cho ứng dụng của bạn rằng tuyến hoặc chế độ âm thanh hiện tại đã thay đổi. Điều này được gọi để đáp ứng với ứng dụng của bạn thay đổi chế độ âm thanh bằng setAudioRoute(int) phương pháp.

    Phương pháp này cũng có thể được gọi nếu hệ thống thay đổi tuyến âm thanh (ví dụ: khi tai nghe Bluetooth bị ngắt kết nối).onHold()

    Hệ thống con viễn thông gọi phương thức này khi nó muốn tạm dừng cuộc gọi. Để đáp ứng yêu cầu này, ứng dụng của bạn nên giữ cuộc gọi và sau đó gọi setOnHold() phương thức để thông báo cho hệ thống rằng cuộc gọi đang được giữ.

    Hệ thống con viễn thông có thể gọi phương thức này khi một dịch vụ trong cuộc gọi, chẳng hạn như Android Auto, đang hiển thị cuộc gọi của bạn muốn chuyển tiếp yêu cầu của người dùng để tạm dừng cuộc gọi.

    Hệ thống con viễn thông cũng gọi phương thức này nếu người dùng thực hiện cuộc gọi hoạt động trong một ứng dụng khác. Để biết thêm thông tin về các dịch vụ trong cuộc gọi, xem InCallService. onUnhold()

    Hệ thống con viễn thông gọi phương thức này khi nó muốn tiếp tục cuộc gọi đã bị tạm dừng. Khi ứng dụng của bạn đã tiếp tục cuộc gọi, nó sẽ gọi setActive() phương thức để thông báo cho hệ thống rằng cuộc gọi không còn bị giữ.

    Hệ thống con viễn thông có thể gọi phương thức này khi một dịch vụ trong cuộc gọi, chẳng hạn như Android Auto, đang hiển thị cuộc gọi của bạn muốn chuyển tiếp yêu cầu tiếp tục cuộc gọi. Để biết thêm thông tin về các dịch vụ trong cuộc gọi, xem InCallService.onAnswer()

    Hệ thống con viễn thông gọi phương thức này để thông báo cho ứng dụng của bạn rằng một cuộc gọi đến sẽ được trả lời.

    Khi ứng dụng của bạn đã trả lời cuộc gọi, nó sẽ gọi setActive() phương thức để thông báo cho hệ thống rằng cuộc gọi đã được trả lời. Hệ thống con viễn thông có thể gọi phương thức này khi ứng dụng của bạn thêm một cuộc gọi đến mới và đã có một cuộc gọi đang diễn ra trong một ứng dụng khác không thể tạm dừng.

    Hệ thống con viễn thông hiển thị UI cuộc gọi đến thay mặt cho ứng dụng của bạn trong những trường hợp này. Khung này cung cấp một phương thức quá tải cung cấp hỗ trợ để chỉ định trạng thái video để trả lời cuộc gọi. Để biết thêm thông tin, xem onAnswer(int).onReject()

    Hệ thống con viễn thông gọi phương thức này khi nó muốn từ chối cuộc gọi đến. Khi ứng dụng của bạn đã từ chối cuộc gọi, ứng dụng sẽ gọi setDisconnected (DisconnectCause) và chỉ định REJECTED làm tham số.

    Sau đó, ứng dụng của bạn sẽ gọi destroy() phương thức để thông báo cho hệ thống rằng ứng dụng đã xử lý cuộc gọi. Hệ thống con viễn thông gọi phương thức này khi người dùng đã từ chối cuộc gọi đến từ ứng dụng của bạn. onDisconnect()

    Hệ thống con viễn thông gọi phương thức này khi nó muốn ngắt kết nối cuộc gọi. Khi cuộc gọi kết thúc, ứng dụng của bạn sẽ gọi setDisconnected (DisconnectCause) phương thức và chỉ định LOCAL làm tham số để cho biết rằng yêu cầu của người dùng khiến cuộc gọi bị ngắt kết nối.

    Sau đó, ứng dụng của bạn sẽ gọi destroy() phương thức để thông báo cho hệ thống con viễn thông rằng ứng dụng đã xử lý cuộc gọi.

    Hệ thống có thể gọi phương thức này khi người dùng đã ngắt kết nối cuộc gọi thông qua một dịch vụ trong cuộc gọi khác như Android Auto.

    Hệ thống cũng gọi phương thức này khi cuộc gọi của bạn phải bị ngắt kết nối để cho phép cuộc gọi khác được thực hiện, ví dụ, nếu người dùng muốn thực hiện cuộc gọi khẩn cấp. Để biết thêm thông tin về các dịch vụ trong cuộc gọi, xemInCallService.

    Xử lý các tình huống gọi chung

    Việc sử dụng ConnectionServiceAPI trong luồng cuộc gọi của bạn liên quan đến việc tương tác với các lớp khác trong android. telecom gói. Các phần sau đây mô tả các tình huống gọi điện phổ biến và cách ứng dụng của bạn nên sử dụng API để xử lý chúng.

    Trả lời cuộc gọi đến

    Luồng để xử lý các cuộc gọi đến thay đổi cho dù có cuộc gọi trong các ứng dụng khác hay không. Lý do cho sự khác biệt trong các luồng là do khung viễn thông phải thiết lập một số ràng buộc khi có các cuộc gọi hoạt động trong các ứng dụng khác để đảm bảo môi trường ổn định cho tất cả các ứng dụng gọi điện trên thiết bị.

    Để biết thêm thông tin, xem các ràng buộc gọi .

    Không có cuộc gọi hoạt động trong các ứng dụng khác

    Để trả lời các cuộc gọi đến khi không có cuộc gọi hoạt động trong các ứng dụng khác, hãy làm theo các bước sau:

    Ứng dụng của bạn nhận được một cuộc gọi đến mới bằng các cơ chế thông thường.

    Sử dụng addNewIncomingCall (PhoneAccountHandle, Bundle)phương pháp để thông báo cho hệ thống con viễn thông về cuộc gọi đến mới.

    Hệ thống con viễn thông liên kết với ConnectionService việc triển khai ứng dụng của bạn và yêu cầu một thể hiện mới của Connection lớp thể hiện cuộc gọi đến mới bằng

    onCreateIncoming Connection(PhoneAccountHandle, ConnectionRequest) phương thức.

    Hệ thống con viễn thông thông báo cho ứng dụng của bạn rằng nó sẽ hiển thị giao diện người dùng cuộc gọi đến bằng onShowIncomingCallUi() phương thức này.

    Ứng dụng của bạn hiển thị giao diện người dùng đến bằng thông báo với mục đích toàn màn hình được liên kết. Để biết thêm thông tin, xem onShowIncomingCallUi().

    Gọi setActive()phương thức nếu người dùng chấp nhận cuộc gọi đến hoặc setDisconnected (DisconnectCause) chỉ định REJECTED làm tham số theo sau là cuộc gọi đến destroy()phương thức nếu người dùng từ chối cuộc gọi đến.

    Các cuộc gọi hoạt động trong các ứng dụng khác không thể tạm dừng

    Để trả lời các cuộc gọi đến khi có các cuộc gọi hoạt động trong các ứng dụng khác không thể tạm dừng, hãy làm theo các bước sau:

    Ứng dụng của bạn nhận được một cuộc gọi đến mới bằng các cơ chế thông thường.

    Sử dụng addNewIncomingCall (PhoneAccountHandle, Bundle)phương pháp để thông báo cho hệ thống con viễn thông về cuộc gọi đến mới.

    Hệ thống con viễn thông liên kết với ConnectionService việc triển khai ứng dụng của bạn và yêu cầu một phiên bản mới của Connection đối tượng thể hiện cuộc gọi đến mới bằng onCreateIncoming Connection (PhoneAccountHandle, ConnectionRequest) phương thức này.

    Hệ thống con viễn thông hiển thị UI cuộc gọi đến cho cuộc gọi đến của bạn.

    Nếu người dùng chấp nhận cuộc gọi, hệ thống con viễn thông sẽ gọi onAnswer()phương thức. Bạn nên gọi setActive()phương thức để chỉ báo cho hệ thống con viễn thông rằng cuộc gọi hiện được kết nối.

    Nếu người dùng từ chối cuộc gọi, hệ thống con viễn thông sẽ gọi onReject()phương thức. Bạn nên gọi setDisconnected(DisconnectCause) phương thức chỉ định REJECTED là tham số theo sau là một cuộc gọi đến destroy()phương thức.

    Thực hiện cuộc gọi đi

    Luồng để thực hiện cuộc gọi đi liên quan đến việc xử lý khả năng cuộc gọi không thể được thực hiện do các ràng buộc áp đặt bởi khung viễn thông. Để biết thêm thông tin, xem các ràng buộc gọi .
    Để thực hiện cuộc gọi đi, hãy làm theo các bước sau:

    Người dùng bắt đầu một cuộc gọi đi trong ứng dụng của bạn.

    Sử dụng placeCall(Uri, Bundle) phương pháp để thông báo cho hệ thống con viễn thông về cuộc gọi đi mới. Hãy xem xét các tham số sau cho các tham số phương thức:

    Các Uri tham số đại diện cho địa chỉ nơi cuộc gọi đang được đặt vào. Đối với các số điện thoại thông thường, hãy sử dụng tel:lược đồ URI.

    Các Bundle tham số cho phép bạn cung cấp thông tin về ứng dụng gọi bạn bằng cách thêm các PhoneAccountHandle đối tượng của ứng dụng của bạn để

    EXTRA_PHONE_ACCOUNT_HANDLE thêm. Ứng dụng của bạn phải cung cấp PhoneAccountHandle đối tượng cho mọi cuộc gọi đi.

    Các Bundle tham số cũng cho phép bạn chỉ định nếu cuộc gọi đi bao gồm video bằng cách xác định STATE_BIDIRECTIONAL giá trị trong EXTRA_START_CALL_WITH_VIDEO_STATE thêm. Theo mặc định, hệ thống con viễn thông định tuyến các cuộc gọi video đến loa ngoài.

    Hệ thống con viễn thông liên kết với ConnectionService việc triển khai ứng dụng của bạn .

    Nếu ứng dụng của bạn không thể thực hiện cuộc gọi đi, hệ thống con viễn thông sẽ gọi onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)phương thức để thông báo cho ứng dụng của bạn rằng cuộc gọi không thể được thực hiện tại thời điểm hiện tại. Ứng dụng của bạn sẽ thông báo cho người dùng rằng cuộc gọi không thể được thực hiện.

    Nếu ứng dụng của bạn có thể thực hiện cuộc gọi đi, hệ thống con viễn thông sẽ gọi onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest) phương thức đó.

    Ứng dụng của bạn sẽ trả về một thể hiện của Connection lớp để thể hiện cuộc gọi đi mới. Để biết thêm thông tin về các thuộc tính mà bạn nên đặt trong kết nối, hãy xem Triển khai dịch vụ kết nối .

    Khi cuộc gọi đi đã được kết nối, hãy gọi setActive() phương thức để thông báo cho hệ thống con viễn thông rằng cuộc gọi đang hoạt động.

    Kết thúc cuộc gọi

    Để kết thúc cuộc gọi, hãy làm theo các bước sau:

    Gọi setDisconnected(DisconnectCause) gửi LOCAL làm tham số nếu người dùng kết thúc cuộc gọi hoặc gửi REMOTE làm tham số nếu bên kia kết thúc cuộc gọi. Gọi destroy() phương thức.

    Hạn chế gọi

    Để đảm bảo trải nghiệm gọi điện phù hợp và đơn giản cho người dùng của bạn, khung viễn thông thực thi một số ràng buộc để quản lý cuộc gọi trên thiết bị.

    Ví dụ: hãy xem xét rằng người dùng đã cài đặt hai ứng dụng gọi điện thực hiện ConnectionService API tự quản lý , FooTalk và BarTalk. Trong trường hợp này, các ràng buộc sau được áp dụng:

    Chỉ có thể có các cuộc gọi liên tục trong bất kỳ một ứng dụng gọi điện nào tại một thời điểm. Ràng buộc này có nghĩa là người dùng chỉ có thể thực hiện các cuộc gọi trong FooTalk hoặc BarTalk bất cứ lúc nào.

    Người dùng có thể thực hiện nhiều cuộc gọi trong ứng dụng FooTalk, nhưng người dùng không thể thực hiện cuộc gọi trong FooTalk và cuộc gọi trong BarTalk cùng một lúc.

    Nếu người dùng tham gia vào các cuộc gọi được quản lý thông thường (ví dụ: sử dụng ứng dụng Điện thoại hoặc Trình quay số tích hợp), người dùng không thể có các cuộc gọi bắt nguồn từ các ứng dụng gọi điện.

    Điều này có nghĩa là nếu người dùng trong một cuộc gọi thông thường sử dụng nhà cung cấp dịch vụ di động của họ, họ cũng không thể đồng thời trong cuộc gọi FooTalk hoặc BarTalk.

    Hệ thống con viễn thông ngắt kết nối các cuộc gọi của ứng dụng nếu người dùng quay số cuộc gọi khẩn cấp.

    Ứng dụng của bạn không thể nhận hoặc thực hiện cuộc gọi trong khi người dùng đang trong cuộc gọi khẩn cấp.

    Nếu có một cuộc gọi đang diễn ra trong một ứng dụng gọi điện khác khi ứng dụng của bạn nhận được một cuộc gọi đến, việc trả lời cuộc gọi đến sẽ kết thúc mọi cuộc gọi đang diễn ra trong ứng dụng khác.

    Ứng dụng của bạn không nên hiển thị giao diện người dùng cuộc gọi đến thông thường. Khung viễn thông hiển thị giao diện người dùng cuộc gọi đến và thông báo cho người dùng rằng việc trả lời cuộc gọi mới sẽ kết thúc (các) cuộc gọi đang diễn ra của họ.

    Điều này có nghĩa là nếu người dùng đang thực hiện cuộc gọi FooTalk và ứng dụng BarTalk nhận được cuộc gọi đến, khung viễn thông sẽ thông báo cho người dùng rằng họ có cuộc gọi BarTalk mới và việc trả lời cuộc gọi BarTalk sẽ kết thúc cuộc gọi FooTalk của họ.
     

    Xem thêm các chủ đề tạo bởi HoitruongS4
    Đang tải...


Chia sẻ trang này