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

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

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 ซึ่งเกี่ยวข้องกับการเริ่มต้น Singleton ของ CastContext โดยใช้ 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 ของแต่ละกิจกรรม

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

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

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

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

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

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

ใน CAF RemoteMediaClient มีการเรียกกลับที่เทียบเท่าผ่านอินเทอร์เฟซ RemoteMediaClient.Listener คุณลงทะเบียน 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 มีคลาส Helper UIMediaController ที่ช่วยให้คุณสร้างตัวควบคุมที่ขยายแล้วของคุณเองได้อย่างง่ายดาย

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

โฟกัสเสียง

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

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

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

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

ตัวอย่างแอป

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