Di chuyển ứng dụng Android Sender từ Cast SDK phiên bản 2 sang Khung ứng dụng truyền (CAF)

Quy trình sau đây cho phép bạn chuyển đổi ứng dụng người gửi Android từ Cast SDK phiên bản 2 sang Người gửi CAF, dựa trên singleton CastContext.

Cast CAF Sender SDK sử dụng CastContext để thay bạn quản lý GoogleAPIClient. CastContext quản lý vòng đời, lỗi và lệnh gọi lại cho bạn, giúp đơn giản hoá đáng kể việc phát triển ứng dụng Cast.

Giới thiệu

  • CAF Sender vẫn được phân phối trong Dịch vụ Google Play bằng trình quản lý Android SDK
  • Chúng tôi đã thêm các gói mới chịu trách nhiệm tuân thủ danh sách kiểm tra Thiết kế Google Cast (com.google.android.gms.cast.framework.*)
  • CAF Sender cung cấp các tiện ích tuân thủ các yêu cầu về trải nghiệm người dùng của Cast; phiên bản 2 không cung cấp bất kỳ thành phần giao diện người dùng nào và yêu cầu bạn triển khai các tiện ích này.
  • Bạn không còn cần phải sử dụng GoogleApiClient để dùng Cast API nữa.
  • Phụ đề trong CAF Sender tương tự như trong phiên bản 2.

Phần phụ thuộc

V2 và CAF có cùng các phần phụ thuộc vào thư viện hỗ trợ và Dịch vụ Google Play (9.2.0 trở lên) như mô tả trong Hướng dẫn về các tính năng của Thư viện hỗ trợ

Phiên bản SDK Android tối thiểu mà CAF hỗ trợ là 9 (Gingerbread).

Khởi chạy

Trong CAF, bạn phải thực hiện một bước khởi chạy rõ ràng cho khung Cast. Thao tác này liên quan đến việc khởi chạy singleton CastContext, sử dụng OptionsProvider thích hợp để chỉ định mã nhận dạng ứng dụng Web Receiver và mọi lựa chọn khác trên toàn cầu.

public class CastOptionsProvider implements OptionsProvider {

    @Override
    public CastOptions getCastOptions(Context context) {
        return new CastOptions.Builder()
                .setReceiverApplicationId(context.getString(R.string.app_id))
                .build();
    }

    @Override
    public List<SessionProvider> getAdditionalSessionProviders(Context context) {
        return null;
    }
}

Khai báo OptionsProvider trong thẻ "application" của tệp AndroidManifest.xml ứng dụng:

<application>
...
    <meta-data
        android:name=
            "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>

Khởi chạy CastContext một cách trì hoãn trong phương thức onCreate của mỗi Hoạt động:

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

Các bước này không cần thiết trong phiên bản 2.

Khám phá thiết bị

Trong CAF, quy trình khám phá sẽ tự động bắt đầu và dừng theo khung khi ứng dụng chuyển sang nền trước và nền sau, tương ứng. Không nên dùng MediaRouteSelectorMediaRouter.Callback.

Nút truyền và hộp thoại Truyền

Như trong phiên bản 2, các thành phần này được cung cấp bởi thư viện hỗ trợ MediaRouter.

Nút Truyền vẫn được MediaRouteButton triển khai và có thể được thêm vào hoạt động của bạn (bằng cách sử dụng ActionBar hoặc Toolbar), dưới dạng một mục trong trình đơn.

<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
    app:showAsAction="always"/>

Ghi đè phương thức onCreateOptionMenu() của mỗi Activity bằng cách sử dụng CastButtonFactory để kết nối MediaRouteButton với khung Cast:

private MenuItem mediaRouteMenuItem;

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    mediaRouteMenuItem =
        CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
                                                menu,
                                                R.id.media_route_menu_item);
    return true;
}

Khi người dùng nhấn vào nút này, hộp thoại Truyền sẽ tự động xuất hiện.

Điều khiển thiết bị

Trong CAF, hoạt động điều khiển thiết bị chủ yếu do khung xử lý. Ứng dụng người gửi không cần xử lý (và không nên cố gắng xử lý) việc kết nối với thiết bị và khởi chạy ứng dụng Web Receiver bằng GoogleApiClient. Tương tác giữa người gửi và Web Receiver hiện được biểu thị dưới dạng "phiên". Lớp SessionManager xử lý vòng đời của phiên và tự động bắt đầu cũng như dừng các phiên để phản hồi cử chỉ của người dùng: một phiên sẽ bắt đầu khi người dùng chọn một thiết bị truyền trong hộp thoại Truyền và kết thúc khi người dùng nhấn vào nút "Dừng truyền" trong hộp thoại Truyền hoặc khi chính ứng dụng người gửi kết thúc. Ứng dụng gửi có thể được thông báo về các sự kiện trong vòng đời của phiên bằng cách đăng ký SessionManagerListener với SessionManager. Các lệnh gọi lại SessionManagerListener xác định các phương thức gọi lại cho tất cả các sự kiện trong vòng đời của phiên.

Lớp CastSession biểu thị một phiên hoạt động với thiết bị truyền. Lớp này có các phương thức để kiểm soát âm lượng và trạng thái tắt tiếng của thiết bị. Trước đây, bạn có thể thực hiện việc này trong phiên bản 2 bằng cách sử dụng các phương thức trên Cast.CastApi.

Trong phiên bản 2, các lệnh gọi lại Cast.Listener đã cung cấp thông báo về các thay đổi đối với trạng thái thiết bị, bao gồm cả âm lượng, trạng thái tắt tiếng, trạng thái chờ, v.v.

Trong CAF, thông báo thay đổi trạng thái âm lượng/tắt tiếng vẫn được gửi qua các phương thức gọi lại trong Cast.Listener; các trình nghe này được đăng ký bằng CastSession. Tất cả các thông báo còn lại về trạng thái thiết bị đều được gửi qua các lệnh gọi lại CastStateListener; những trình nghe này được đăng ký bằng CastSession. Hãy nhớ huỷ đăng ký trình nghe khi các mảnh, hoạt động hoặc ứng dụng được liên kết chuyển sang chế độ nền.

Logic kết nối lại

Giống như v2, CAF cố gắng thiết lập lại các kết nối mạng bị mất do mất tín hiệu Wi-Fi tạm thời hoặc các lỗi mạng khác. Giờ đây, việc này được thực hiện ở cấp phiên; một phiên có thể chuyển sang trạng thái "tạm ngưng" khi mất kết nối và sẽ chuyển về trạng thái "đã kết nối" khi khôi phục được kết nối. Khung này sẽ đảm nhận việc kết nối lại với ứng dụng Web Receiver và kết nối lại mọi kênh truyền trong quá trình này.

Ngoài ra, CAF cũng thêm tính năng tự động tiếp tục phiên (được bật theo mặc định và có thể tắt thông qua CastOptions. Nếu ứng dụng người gửi được chuyển xuống chế độ nền hoặc bị chấm dứt (bằng cách vuốt để đóng hoặc do sự cố) trong khi phiên truyền đang diễn ra, thì khung sẽ cố gắng tiếp tục phiên đó khi ứng dụng người gửi quay lại chế độ nền trước hoặc được khởi chạy lại; SessionManager sẽ tự động xử lý việc này và sẽ đưa ra các lệnh gọi lại thích hợp trên mọi thực thể SessionManagerListener đã đăng ký.

Đăng ký kênh tuỳ chỉnh

Trong phiên bản 2, các kênh tuỳ chỉnh (được triển khai bằng Cast.MessageReceivedCallback) được đăng ký bằng Cast.CastApi. Trong CAF, các kênh tuỳ chỉnh sẽ được đăng ký với thực thể CastSession. Bạn có thể đăng ký trong phương thức gọi lại SessionManagerListener.onSessionStarted. Đối với các ứng dụng đa phương tiện, bạn không cần phải đăng ký rõ ràng kênh điều khiển nội dung đa phương tiện thông qua Cast.CastApi.setMessageReceivedCallbacks nữa; hãy xem phần sau để biết thêm thông tin chi tiết.

Điều khiển phương tiện

Lớp v2 RemoteMediaPlayer không được dùng nữa và bạn không nên sử dụng. Trong CAF, lớp này được thay thế bằng lớp RemoteMediaClient mới, cung cấp chức năng tương đương trong một API thuận tiện hơn. Bạn không cần khởi chạy hoặc đăng ký đối tượng này một cách rõ ràng; khung sẽ tự động tạo thực thể đối tượng và đăng ký kênh truyền thông cơ bản tại thời điểm bắt đầu phiên nếu ứng dụng Web Receiver đang kết nối hỗ trợ không gian tên nội dung nghe nhìn.

Bạn có thể truy cập vào RemoteMediaClient dưới dạng phương thức getRemoteMediaClient của đối tượng CastSession.

Trong phiên bản 2, tất cả các yêu cầu về nội dung nghe nhìn được đưa ra trên RemoteMediaPlayer sẽ trả về RemoteMediaPlayer.MediaChannelResult thông qua lệnh gọi lại PendingResult.

Trong CAF, tất cả các yêu cầu về nội dung nghe nhìn được đưa ra trên RemoteMediaClient đều trả về RemoteMediaClient.MediaChannelResult thông qua lệnh gọi lại PendingResult. Lệnh gọi lại này có thể dùng để theo dõi tiến trình và kết quả cuối cùng của yêu cầu.

RemoteMediaPlayer phiên bản 2 sẽ gửi thông báo về các thay đổi trong trạng thái trình phát nội dung nghe nhìn trên Web Receiver thông qua RemoteMediaPlayer.OnStatusUpdatedListener.

Trong CAF, RemoteMediaClient cung cấp các lệnh gọi lại tương đương thông qua giao diện RemoteMediaClient.Listener. Bạn có thể đăng ký bất kỳ số lượng trình nghe nào bằng RemoteMediaClient, cho phép nhiều thành phần của người gửi chia sẻ một phiên bản duy nhất của RemoteMediaClient được liên kết với phiên.

Trong phiên bản 2, ứng dụng người gửi phải chịu trách nhiệm đồng bộ hoá giao diện người dùng với trạng thái của trình phát nội dung nghe nhìn trên Web Receiver.

Trong CAF, lớp UIMediaController đảm nhận hầu hết trách nhiệm này.

Lớp phủ giới thiệu

Phiên bản 2 không cung cấp giao diện người dùng lớp phủ giới thiệu.

CAF cung cấp một khung hiển thị tuỳ chỉnh IntroductoryOverlay để làm nổi bật nút Truyền khi nút này xuất hiện lần đầu tiên với người dùng.

Bộ điều khiển mini

Trong phiên bản 2, bạn cần triển khai một bộ điều khiển thu nhỏ từ đầu trong ứng dụng người gửi.

Trong CAF, SDK cung cấp một khung hiển thị tuỳ chỉnh, MiniControllerFragment, mà bạn có thể thêm vào tệp bố cục ứng dụng của các hoạt động mà bạn muốn hiển thị bộ điều khiển thu nhỏ.

Thông báo và màn hình khoá

Trong phiên bản 2, SDK không cung cấp bộ điều khiển cho thông báo và màn hình khoá. Đối với SDK đó, bạn cần tích hợp các tính năng này vào ứng dụng người gửi bằng cách sử dụng API khung Android.

Trong CAF, SDK cung cấp một NotificationsOptions.Builder để giúp bạn tạo các chế độ điều khiển nội dung nghe nhìn cho thông báo và màn hình khoá trong ứng dụng người gửi. Bạn có thể bật các chế độ điều khiển thông báo và màn hình khoá bằng CastOptions khi khởi chạy CastContext.

public CastOptions getCastOptions(Context context) {
    NotificationOptions notificationOptions = new NotificationOptions.Builder()
            .setTargetActivityClassName(VideoBrowserActivity.class.getName())
            .build();
    CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
            .setNotificationOptions(notificationOptions)
            .build();

    return new CastOptions.Builder()
            .setReceiverApplicationId(context.getString(R.string.app_id))
            .setCastMediaOptions(mediaOptions)
            .build();
}

Bộ điều khiển mở rộng

Trong phiên bản 2, bạn cần triển khai một bộ điều khiển mở rộng từ đầu trong ứng dụng người gửi.

CAF cung cấp một lớp trợ giúp UIMediaController giúp bạn dễ dàng tạo bộ điều khiển mở rộng của riêng mình.

CAF thêm một tiện ích bộ điều khiển mở rộng được tạo sẵn ExpandedControllerActivity mà bạn chỉ cần thêm vào ứng dụng của mình. Bạn không cần triển khai bộ điều khiển mở rộng tuỳ chỉnh bằng UIMediaController nữa.

Tập trung âm thanh

Trong phiên bản 2, bạn cần dùng MediaSessionCompat để quản lý tiêu điểm âm thanh.

Trong CAF, quyền phát âm thanh được quản lý tự động.

Ghi nhật ký gỡ lỗi

Trong CAF, không có lựa chọn ghi nhật ký.

Ứng dụng mẫu

Chúng tôi có hướng dẫn về lớp học lập trìnhcác ứng dụng mẫu sử dụng CAF.