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

ขั้นตอนต่อไปนี้จะช่วยให้คุณแปลงแอปผู้ส่ง Android จาก Cast SDK v2 เป็น CAF Sender ซึ่งอิงตาม 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 ซึ่งเกี่ยวข้องกับการเริ่มต้น 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

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

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