ย้ายข้อมูลแอปผู้ส่ง Android จาก Cast SDK v2 ไปยัง Cast Application Framework (CAF)

ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปตัวส่ง Android จาก Cast SDK v2 เป็นตัวส่ง CAF ซึ่งอิงตาม CastContext แบบ Singleton

Cast CAF Sender SDK ใช้ CastContext เพื่อจัดการ GoogleAPIClient ในนามของคุณ CastContext จะจัดการวงจร ข้อผิดพลาด และการเรียกกลับให้คุณ ซึ่งช่วยลดความซับซ้อนในการพัฒนาแอป Cast ได้อย่างมาก

บทนำ

  • เรายังคงเผยแพร่ CAF Sender เป็นส่วนหนึ่งของบริการ Google Play โดยใช้ Android SDK Manager
  • เราได้เพิ่มแพ็กเกจใหม่ที่รับผิดชอบในการปฏิบัติตาม รายการตรวจสอบการออกแบบ Google Cast (com.google.android.gms.cast.framework.*)
  • CAF Sender มีวิดเจ็ตที่เป็นไปตามข้อกำหนด UX ของ Cast v2 ไม่มีคอมโพเนนต์ UI และกำหนดให้คุณใช้วิดเจ็ตเหล่านี้
  • ไม่จำเป็นต้องใช้ GoogleApiClient อีกต่อไปเพื่อใช้ Cast API
  • คำบรรยายแทนเสียงใน CAF Sender จะคล้ายกับ v2

แท็กเริ่มการทำงาน

V2 และ CAF มีการอ้างอิงเดียวกันในไลบรารีการสนับสนุนและบริการ Google Play (9.2.0 ขึ้นไป) ตามที่อธิบายไว้ในคู่มือฟีเจอร์ไลบรารีการสนับสนุน

Android SDK เวอร์ชันขั้นต่ำที่ CAF รองรับคือ 9 (Gingerbread)

การเริ่มต้น

ใน CAF ต้องมีขั้นตอนการเริ่มต้นที่ชัดเจนสำหรับเฟรมเวิร์ก Cast ซึ่งเกี่ยวข้องกับการเริ่มต้นCastContext Singleton โดยใช้OptionsProvider ที่เหมาะสมเพื่อระบุรหัสแอปพลิเคชัน Web Receiver และตัวเลือกส่วนกลางอื่นๆ

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;
    }
}

ประกาศ OptionsProvider ภายในแท็ก "application" ของไฟล์ 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>

เริ่มต้น CastContext อย่างช้าๆ ในเมธอด onCreate ของแต่ละ Activity

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

ใน v2 ไม่จำเป็นต้องทำตามขั้นตอนเหล่านี้

การค้นหาอุปกรณ์

ใน CAF เฟรมเวิร์กจะเริ่มและหยุดกระบวนการค้นหาโดยอัตโนมัติเมื่อแอปเข้าสู่เบื้องหน้าและไปที่เบื้องหลังตามลำดับ ไม่ควรใช้ MediaRouteSelector และ MediaRouter.Callback

ปุ่มแคสต์และกล่องโต้ตอบแคสต์

เช่นเดียวกับใน v2 คอมโพเนนต์เหล่านี้มาจากไลบรารีการรองรับ MediaRouter

MediaRouteButton ยังคงใช้ปุ่มแคสต์ และสามารถเพิ่มลงในกิจกรรมของคุณ (โดยใช้ ActionBar หรือ Toolbar) เป็นรายการเมนูในเมนูของคุณ

<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"/>

ลบล้างonCreateOptionMenu()ของแต่ละกิจกรรมโดยใช้ CastButtonFactory เพื่อเชื่อมต่อ MediaRouteButton กับเฟรมเวิร์ก 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;
}

เมื่อมีผู้แตะปุ่มดังกล่าว กล่องโต้ตอบการแคสต์จะปรากฏขึ้นโดยอัตโนมัติ

ควบคุมอุปกรณ์

ใน CAF เฟรมเวิร์กจะจัดการการควบคุมอุปกรณ์เป็นส่วนใหญ่ แอปพลิเคชัน ผู้ส่งไม่จำเป็นต้องจัดการ (และไม่ควรพยายามจัดการ) การเชื่อมต่อกับ อุปกรณ์และการเปิดใช้แอปพลิเคชัน Web Receiver โดยใช้ GoogleApiClient ตอนนี้การโต้ตอบระหว่างผู้ส่งและ Web Receiver จะแสดงเป็น "เซสชัน" แล้ว คลาส SessionManager จะจัดการวงจรเซสชัน และเริ่มและหยุดเซสชันโดยอัตโนมัติ เพื่อตอบสนองต่อท่าทางสัมผัสของผู้ใช้ โดยเซสชันจะเริ่มต้นเมื่อผู้ใช้เลือกอุปกรณ์ Cast ในกล่องโต้ตอบ Cast และจะสิ้นสุดเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบ Cast หรือเมื่อแอปผู้ส่งสิ้นสุดลง แอปพลิเคชันตัวส่งจะได้รับการแจ้งเตือนเกี่ยวกับเหตุการณ์วงจรเซสชันโดยการลงทะเบียน SessionManagerListener กับ SessionManager SessionManagerListener การเรียกกลับจะกําหนด วิธีการเรียกกลับสําหรับเหตุการณ์วงจรเซสชันทั้งหมด

คลาส CastSession แสดงเซสชันที่มีอุปกรณ์ Cast คลาสมีเมธอดสำหรับ ควบคุมระดับเสียงของอุปกรณ์และสถานะปิดเสียง ซึ่งก่อนหน้านี้ทำใน v2 โดยใช้เมธอดใน Cast.CastApi

ใน v2 Cast.Listener การเรียกกลับจะแจ้งเตือนการเปลี่ยนแปลงสถานะของอุปกรณ์ ซึ่งรวมถึง ระดับเสียง สถานะปิดเสียง สถานะสแตนด์บาย และอื่นๆ

ใน CAF การแจ้งเตือนการเปลี่ยนแปลงสถานะระดับเสียง/ปิดเสียงจะยังคงส่งผ่านเมธอดการเรียกกลับ ใน Cast.Listener โดยจะลงทะเบียน Listener เหล่านี้ด้วย CastSession การแจ้งเตือนสถานะอุปกรณ์ที่เหลือทั้งหมดจะส่งผ่านการเรียกกลับของ CastStateListener โดยจะลงทะเบียน Listener เหล่านี้กับ CastSession ตรวจสอบว่าคุณยังคงยกเลิกการลงทะเบียน Listener เมื่อ Fragment, กิจกรรม หรือแอปที่เชื่อมโยง เข้าสู่เบื้องหลัง

ตรรกะการเชื่อมต่อใหม่

เช่นเดียวกับ v2 CAF จะพยายามสร้างการเชื่อมต่อเครือข่ายใหม่ ที่ขาดหายเนื่องจากสัญญาณ Wi-Fi ขาดหายชั่วคราวหรือข้อผิดพลาดอื่นๆ ในเครือข่าย ตอนนี้ระบบจะดำเนินการที่ระดับเซสชัน โดยเซสชันจะเข้าสู่สถานะ "ระงับ" เมื่อการเชื่อมต่อขาดหาย และจะเปลี่ยนกลับไปเป็นสถานะ "เชื่อมต่อแล้ว" เมื่อการเชื่อมต่อกลับมาอีกครั้ง เฟรมเวิร์กจะดูแลการเชื่อมต่อแอปพลิเคชัน Web Receiver อีกครั้งและการเชื่อมต่อช่อง Cast อีกครั้งซึ่งเป็นส่วนหนึ่งของกระบวนการนี้

นอกจากนี้ CAF ยังเพิ่มการกลับมาใช้เซสชันต่อโดยอัตโนมัติซึ่งเปิดใช้โดย ค่าเริ่มต้น (และปิดใช้ได้ผ่าน CastOptions หากแอปพลิเคชันตัวส่งถูกส่งไปยังเบื้องหลังหรือถูกปิด (โดยการปัดออกหรือเนื่องจากแอปขัดข้อง) ขณะที่เซสชันการแคสต์กำลังดำเนินอยู่ เฟรมเวิร์กจะพยายามกลับมาใช้เซสชันนั้นต่อเมื่อแอปพลิเคชันตัวส่งกลับมาที่เบื้องหน้าหรือเปิดขึ้นมาอีกครั้ง ซึ่งSessionManager จะจัดการเรื่องนี้โดยอัตโนมัติ และจะเรียกใช้การเรียกกลับที่เหมาะสมในอินสแตนซ์ SessionManagerListener ที่ลงทะเบียนไว้

การลงทะเบียนแชแนลที่กำหนดเอง

ใน v2 แชแนลที่กำหนดเอง (ใช้Cast.MessageReceivedCallback) จะลงทะเบียนกับ Cast.CastApi ใน CAF ระบบจะลงทะเบียนแชแนลที่กำหนดเองกับอินสแตนซ์ CastSessionแทน คุณลงทะเบียนได้ในเมธอด SessionManagerListener.onSessionStarted การเรียกกลับ สำหรับแอปพลิเคชันสื่อ คุณไม่จำเป็นต้องลงทะเบียนช่องควบคุมสื่ออย่างชัดเจนผ่าน Cast.CastApi.setMessageReceivedCallbacks อีกต่อไป โปรดดูรายละเอียดเพิ่มเติมในส่วนต่อไปนี้

ส่วนควบคุมสื่อ

คลาส v2 RemoteMediaPlayer เลิกใช้งานแล้วและไม่ควรใช้ ใน CAF คลาสใหม่ RemoteMediaClient จะแทนที่คลาสนี้ ซึ่งมีฟังก์ชันการทำงานเทียบเท่าใน API ที่สะดวกกว่า คุณ ไม่จำเป็นต้องเริ่มต้นหรือลงทะเบียนออบเจ็กต์นี้อย่างชัดเจน เนื่องจากเฟรมเวิร์ก จะสร้างอินสแตนซ์ออบเจ็กต์และลงทะเบียนช่องสื่อพื้นฐานโดยอัตโนมัติ เมื่อเซสชันเริ่มต้น หากแอปพลิเคชัน Web Receiver ที่เชื่อมต่ออยู่ รองรับเนมสเปซสื่อ

RemoteMediaClient สามารถเข้าถึงได้ในฐานะเมธอด getRemoteMediaClient ของออบเจ็กต์ CastSession

ในเวอร์ชัน 2 คำขอสื่อทั้งหมดที่ออกใน RemoteMediaPlayer จะแสดงผลเป็น RemoteMediaPlayer.MediaChannelResult ผ่านการเรียกกลับ PendingResult

ใน CAF คำขอสื่อทั้งหมดที่ออกใน RemoteMediaClient จะแสดงผล RemoteMediaClient.MediaChannelResult ผ่านการเรียกกลับ PendingResult ซึ่งใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของคำขอได้

v2 RemoteMediaPlayer จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของโปรแกรมเล่นสื่อใน Web Receiver ผ่าน RemoteMediaPlayer.OnStatusUpdatedListener

ใน CAF RemoteMediaClient จะให้การเรียกกลับที่เทียบเท่าผ่านอินเทอร์เฟซ RemoteMediaClient.Listener คุณลงทะเบียนผู้ฟังจำนวนเท่าใดก็ได้ด้วย RemoteMediaClient ซึ่งจะช่วยให้คอมโพเนนต์ผู้ส่งหลายรายการแชร์ อินสแตนซ์เดียวของ RemoteMediaClient ที่เชื่อมโยงกับเซสชันได้

ใน v2 แอปพลิเคชันตัวส่งต้องรับภาระในการซิงค์อินเทอร์เฟซผู้ใช้กับสถานะของมัลติมีเดียเพลเยอร์ใน Web Receiver

ใน CAF คลาส UIMediaController จะรับผิดชอบในส่วนนี้เป็นส่วนใหญ่

การซ้อนทับช่วงแนะนำ

V2 ไม่มี UI การวางซ้อนเบื้องต้น

CAF มีมุมมองที่กำหนดเอง IntroductoryOverlay เพื่อไฮไลต์ปุ่มแคสต์เมื่อแสดงต่อผู้ใช้เป็นครั้งแรก

มินิคอนโทรลเลอร์

ใน v2 คุณต้องติดตั้งใช้งานมินิคอนโทรลเลอร์ตั้งแต่ต้นในแอปผู้ส่ง

ใน CAF นั้น SDK จะมีมุมมองที่กำหนดเอง MiniControllerFragment ซึ่งคุณสามารถเพิ่มลงในไฟล์เลย์เอาต์ของแอปของกิจกรรมที่คุณต้องการ แสดงมินิคอนโทรลเลอร์ได้

การแจ้งเตือนและหน้าจอล็อก

ใน v2 SDK จะไม่ได้ให้ตัวควบคุมสำหรับการแจ้งเตือนและหน้าจอล็อก สำหรับ SDK นั้น คุณต้องสร้างฟีเจอร์เหล่านี้ลงในแอปผู้ส่งโดยใช้ Android Framework API

ใน CAF นั้น SDK จะมี NotificationsOptions.Builder เพื่อช่วยคุณสร้างตัวควบคุมสื่อสำหรับการแจ้งเตือนและหน้าจอล็อก ในแอปผู้ส่ง คุณเปิดใช้ตัวควบคุมการแจ้งเตือนและหน้าจอล็อกได้ ด้วย CastOptions เมื่อเริ่มต้น 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();
}

ตัวควบคุมที่ขยายแล้ว

ใน v2 คุณต้องใช้ตัวควบคุมที่ขยายจากศูนย์ในแอปผู้ส่ง

CAF มี UIMediaController คลาสตัวช่วยที่ช่วยให้คุณสร้างตัวควบคุมที่ขยายได้ด้วยตนเองได้ง่ายๆ

CAF เพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า ExpandedControllerActivity ซึ่งคุณสามารถเพิ่มลงในแอปได้อย่างง่ายดาย คุณไม่จำเป็นต้อง ใช้ตัวควบคุมแบบขยายที่กำหนดเองโดยใช้ UIMediaController อีกต่อไป

โฟกัสอัตโนมัติ

ใน v2 คุณต้องใช้ MediaSessionCompat เพื่อจัดการโฟกัสเสียง

ใน CAF ระบบจะจัดการโฟกัสเสียงโดยอัตโนมัติ

การบันทึกการแก้ไขข้อบกพร่อง

ใน CAF จะไม่มีตัวเลือกการบันทึก

แอปตัวอย่าง

เรามีบทแนะนำ Codelab และแอปตัวอย่าง ที่ใช้ CAF