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

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

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

เกริ่นนำ

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

การอ้างอิง

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

เวอร์ชัน 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 ภายในแท็ก "แอปพลิเคชัน" ของไฟล์ 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 แบบ Lazy Loading ในเมธอด onCreate ของแต่ละกิจกรรม ดังนี้

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

ขั้นตอนเหล่านี้ไม่จำเป็นในเวอร์ชัน 2

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

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

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

เช่นเดียวกับเวอร์ชัน 2 คอมโพเนนต์เหล่านี้ให้บริการโดยไลบรารีการสนับสนุนของ 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 จะจัดการวงจรเซสชัน รวมถึงจะเริ่มต้นและหยุดเซสชันโดยอัตโนมัติตามท่าทางสัมผัสของผู้ใช้ โดยเซสชันจะเริ่มต้นเมื่อผู้ใช้เลือกอุปกรณ์แคสต์ในกล่องโต้ตอบการแคสต์ และสิ้นสุดลงเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบการแคสต์ หรือเมื่อแอปของผู้ส่งยุติ แอปพลิเคชันของผู้ส่งรับการแจ้งเตือนเกี่ยวกับเหตุการณ์ในวงจรเซสชันได้โดยการลงทะเบียน SessionManagerListener กับ SessionManager Callback ของ SessionManagerListener จะกำหนดเมธอด Callback สำหรับเหตุการณ์ในวงจรทั้งหมดของเซสชัน

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

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

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

ตรรกะการเชื่อมต่ออีกครั้ง

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

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

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

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

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

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

คุณสามารถเข้าถึง RemoteMediaClient ได้เพราะเมธอด getRemoteMediaClient ของออบเจ็กต์ CastSession

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

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

RemoteMediaPlayer เวอร์ชัน 2 จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของมีเดียเพลเยอร์บนตัวรับเว็บผ่านทาง RemoteMediaPlayer.OnStatusUpdatedListener

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

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

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

การวางซ้อนบทนำ

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

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

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

ในเวอร์ชัน 2 คุณต้องใช้ตัวควบคุมขนาดเล็กในแอปผู้ส่งตั้งแต่ต้น

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

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

ในเวอร์ชัน 2 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();
}

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

ในเวอร์ชัน 2 คุณต้องใช้ตัวควบคุมแบบขยายในแอปผู้ส่งตั้งแต่ต้น

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

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

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

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

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

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

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

แอปตัวอย่าง

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