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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ใน CAF RemoteMediaClient จะให้ Callback ที่เทียบเท่ากันผ่าน RemoteMediaClient.Listener ของ Google ผู้ฟังทุกคนสามารถลงทะเบียนกับ 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 ชั้นเรียน Helper ที่ทำให้คุณสามารถเรียนรู้

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

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

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

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

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

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

แอปตัวอย่าง

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