ย้ายข้อมูลแอปผู้ส่ง Android จาก Cast SDK v2 ไปยังเฟรมเวิร์กแอปพลิเคชันการแคสต์ (CAF)

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

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

บทนำ

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

การอ้างอิง

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

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

การเริ่มต้น

ใน CAF คุณจําเป็นต้องระบุขั้นตอนการแคสต์อย่างชัดเจนสําหรับเฟรมเวิร์ก "แคสต์" ซึ่งรวมถึงการเริ่มต้น 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 ในเมธอด 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 กับเฟรมเวิร์กแคสต์

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

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

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

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

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

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

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

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

ในเวอร์ชัน 2 แชแนลที่กําหนดเอง (ใช้งานโดยใช้ 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 ซึ่งใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของคําขอได้

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

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

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

ใน CAF ชั้นเรียน UIMediaController เป็นผู้รับผิดชอบสูงสุด

การวางซ้อนที่แนะนํา

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

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

ตัวควบคุมขนาดเล็ก

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

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

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

SDK ใน v2 ไม่มีตัวควบคุมสําหรับการแจ้งเตือนและหน้าจอล็อก สําหรับ 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();
}

ตัวควบคุมแบบขยาย

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

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

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

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

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

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

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

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

แอปตัวอย่าง

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