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 dành cho thiết bị gửi Android từ tính năng Truyền SDK phiên bản 2 đến Trình gửi CAF, dựa trên CastContext singleton.

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

Giới thiệu

  • CAF Sender vẫn được phân phối như một phần của Dịch vụ Google Play bằng trình quản lý SDK Android
  • Các gói mới đã được thêm vào và 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ề Cast UX; 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 phải triển khai các thành phần này các tiện ích khác nhau.
  • Bạn không cần phải sử dụng GoogleApiClient để sử dụng Cast API nữa.
  • Phụ đề chi tiết trong CAF Sender tương tự như phiên bản 2.

Phần phụ thuộc

Phiên bản 2 và CAF có cùng phần phụ thuộc trên thư viện hỗ trợ và Google Play dịch vụ (9.2.0 trở lên) như được mô tả tại Tính năng của Thư viện hỗ trợ Hướng dẫn

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 cần có bước khởi chạy rõ ràng cho khung Truyền. Chiến dịch này bao gồm việc khởi chạy CastContext singleton, sử dụng OptionsProvider để chỉ định ID ứng dụng Trình nhận web và bất kỳ tùy chọn chung nào khác.

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 "ứng dụng" thẻ của ứng dụng Tệp AndroidManifest.xml:

<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 từng phần CastContext 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 là không cần thiết trong phiên bản 2.

Khám phá thiết bị

Trong CAF, quá trình khám phá được bắt đầu và dừng tự động bằng khi ứng dụng chạy trên nền trước và chuyển sang chạy ở chế độ nền, tương ứng. MediaRouteSelectorMediaRouter.Callback không được đã sử dụng.

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 hỗ trợ MediaRouter cung cấp thư viện.

Nút Truyền vẫn được triển khai bằng MediaRouteButton 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 từng Hoạt động bằng cách sử dụng CastButtonFactory để kết nối MediaRouteButton với khung Truyền:

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 ai đó nhấn vào nút này, hộp thoại Truyền tự động hiển thị.

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

Trong CAF, việc kiểm soát thiết bị phần lớn do khung xử lý. Người gửi ứng dụng không cần xử lý (và không nên cố gắng xử lý) 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". Chiến lược phát hành đĩa đơn SessionManager lớp xử lý vòng đời phiên, tự động bắt đầu và dừng 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 Truyền trong hộp thoại Truyền và được kết thúc khi người dùng nhấn vào "Dừng truyền" trong hộp thoại Truyền hoặc khi chính ứng dụng của người gửi chấm dứt. Người gửi ứng dụng 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ý một SessionManagerListener bằng SessionManager. Các lệnh gọi lại SessionManagerListener xác định cho tất cả các sự kiện trong vòng đời phiên.

Chiến lược phát hành đĩa đơn CastSession lớp biểu thị một phiên có Thiết bị truyền. Lớp này có các phương thức để kiểm soát âm lượng thiết bị và trạng thái tắt tiếng, được thực hiện trước đây trong phiên bản 2 bằng các phương thức trên Cast.CastApi.

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

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

Logic kết nối lại

Giống như phiên bản 2, CAF cố gắng thiết lập lại các kết nối mạng đều 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. Lúc này là được thực hiện ở cấp phiên hoạt động; một phiên có thể chuyển sang trạng thái "bị tạm ngưng" cho biết khi mất kết nối và sẽ chuyển về trạng thái "đã kết nối" nêu rõ khi nào kết nối đã được khôi phục. Khung này đảm nhận việc kết nối lại với 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 hoạt động, được bật bằng cách mặc định (và có thể huỷ kích hoạt qua CastOptions. Nếu ứng dụng của người gửi được gửi ở chế độ nền hoặc bị chấm dứt (bằng cách vuốt ra xa hoặc do gặp sự cố) trong khi phiên Truyền đang diễn ra, khung này sẽ cố gắng tiếp tục phiên đó khi ứng dụng của người gửi quay lại nền trước hoặc được chạy lại; việc này được xử lý tự động bằng SessionManager sẽ tạo lệnh gọi lại thích hợp trên bất kỳ lệnh gọi lại nào đã đăng ký SessionManagerListener thực thể.

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

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

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

Lớp v2 RemoteMediaPlayer không được dùng nữa và không nên sử dụng. Trong CAF, nó được thay thế bằng RemoteMediaClient , cung cấp chức năng tương đương trong một API thuận tiện hơn. Đó là không cần thiết để 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ể cho đối tượng và đăng ký nội dung nghe nhìn cơ bản kênh tại thời điểm bắt đầu phiên nếu ứng dụng Trình nhận web được kết nối với hỗ trợ không gian tên đa phương tiện.

Bạn có thể truy cập 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 đa phương tiện được đưa ra trên RemoteMediaPlayer sẽ trả về một RemoteMediaPlayer.MediaChannelResult thông qua lệnh gọi lại PendingResult.

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

RemoteMediaPlayer v2 sẽ gửi thông báo về những thay đổi trong nội dung nghe nhìn trạng thái của người chơi trên Web receiver qua RemoteMediaPlayer.OnStatusUpdatedListener.

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

Trong phiên bản 2, ứng dụng của người gửi phải đảm nhận gánh nặng trong việc giữ chân người dùng giao diện đồng bộ hoá với trạng thái trình phát nội dung đa phương tiện trên Web receiver.

Trong CAF, lớp UIMediaController đảm nhận phần lớn 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 khung hiển thị tuỳ chỉnh IntroductoryOverlay để đánh dấu nút Truyền khi nút này hiển thị lần đầu với người dùng.

Tay đ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 mini từ đầu trong ứng dụng dành cho 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 bạn muốn hiện tay đ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 của 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á vào ứng dụng của 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á với CastOptions khi khởi tạo 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();
}

Đã mở rộng bộ điều khiển

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 của người gửi.

CAF cung cấp UIMediaController lớp trợ giúp giúp bạn dễ dàng xây dựng thiết bị điều khiển.

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 phải triển khai bộ điều khiển mở rộng tuỳ chỉnh bằng UIMediaController.

Tập trung âm thanh

Trong phiên bản 2, bạn cần sử dụng MediaSessionCompat để quản lý quyền phát âm thanh.

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

Ghi nhật ký gỡ lỗi

Trong CAF, không có tuỳ chọn ghi nhật ký.

Ứng dụng mẫu

Chúng ta có hướng dẫn của lớp học lập trìnhứng dụng mẫu sử dụng CAF.