ย้ายข้อมูลแอปผู้ส่ง 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 โดยใช้เครื่องมือจัดการ SDK ของ Android
  • เราได้เพิ่มแพ็กเกจใหม่ที่รับผิดชอบในการปฏิบัติตามรายการตรวจสอบการออกแบบ Google Cast (com.google.android.gms.cast.framework.*)
  • ตัวส่ง CAF มีวิดเจ็ตที่เป็นไปตามข้อกำหนด 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 แบบสแตนด์อโลนเพื่อระบุรหัสแอปพลิเคชันตัวรับเว็บและตัวเลือกส่วนกลางอื่นๆOptionsProvider

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" ของไฟล์ app 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 ของกิจกรรมแต่ละรายการแบบล่าช้า

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

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

เช่นเดียวกับ 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 เฟรมเวิร์กจะจัดการการควบคุมอุปกรณ์ส่วนใหญ่ แอปพลิเคชันฝั่งผู้ส่งไม่จําเป็นต้องจัดการ (และไม่ควรพยายามจัดการ) การเชื่อมต่อกับอุปกรณ์และการเปิดแอปพลิเคชันตัวรับเว็บโดยใช้ GoogleApiClient ตอนนี้การโต้ตอบระหว่างผู้ส่งและผู้รับเว็บจะแสดงเป็น "เซสชัน" คลาส SessionManager จะจัดการวงจรของเซสชัน รวมถึงเริ่มและหยุดเซสชันโดยอัตโนมัติเพื่อตอบสนองต่อท่าทางสัมผัสของผู้ใช้ โดยเซสชันจะเริ่มขึ้นเมื่อผู้ใช้เลือกอุปกรณ์แคสต์ในกล่องโต้ตอบแคสต์ และสิ้นสุดลงเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบแคสต์หรือเมื่อแอปผู้ส่งสิ้นสุดการทำงาน แอปพลิเคชันของผู้ส่งจะได้รับการแจ้งเตือนเหตุการณ์ในวงจรชีวิตของเซสชันโดยการลงทะเบียน SessionManagerListener กับ SessionManager SessionManagerListener callbacks define callback methods for all session lifecycle events.

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

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

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

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

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

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

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

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

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

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

เข้าถึง RemoteMediaClient ได้เป็นเมธอด getRemoteMediaClient ของออบเจ็กต์ CastSession

ใน v2 คําขอสื่อทั้งหมดที่ออกใน RemoteMediaPlayer จะแสดงผล RemoteMediaPlayer.MediaChannelResult ผ่าน PendingResult callback

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

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

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

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

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

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

V2 ไม่มี UI การวางซ้อนช่วงแนะนำ

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

รีโมตคอนโทรลเลอร์ขนาดเล็ก

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

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

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

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

ใน 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