ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปผู้ส่ง Android จาก Cast SDK v2 เป็นผู้ส่ง CAF ซึ่งอิงตามเดี่ยวๆ ของ CastContext
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 แต่เวอร์ชัน 2 ไม่มีคอมโพเนนต์ 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 การควบคุมอุปกรณ์ส่วนใหญ่จะจัดการโดยเฟรมเวิร์ก แอปพลิเคชันของผู้ส่งไม่จำเป็นต้องจัดการ (และไม่ควรพยายามจัดการ) การเชื่อมต่อกับอุปกรณ์และเปิดแอปพลิเคชัน Web Receiver โดยใช้ GoogleApiClient
ตอนนี้การโต้ตอบระหว่างผู้ส่งกับ Web Receiver แสดงเป็น "เซสชัน" คลาส SessionManager
จะจัดการวงจรเซสชัน รวมถึงจะเริ่มต้นและหยุดเซสชันโดยอัตโนมัติตามท่าทางสัมผัสของผู้ใช้ โดยเซสชันจะเริ่มต้นเมื่อผู้ใช้เลือกอุปกรณ์แคสต์ในกล่องโต้ตอบการแคสต์ และสิ้นสุดลงเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบการแคสต์ หรือเมื่อแอปของผู้ส่งยุติ แอปพลิเคชันของผู้ส่งรับการแจ้งเตือนเกี่ยวกับเหตุการณ์ในวงจรเซสชันได้โดยการลงทะเบียน SessionManagerListener
กับ SessionManager
Callback ของ SessionManagerListener
จะกำหนดเมธอด Callback สำหรับเหตุการณ์ในวงจรทั้งหมดของเซสชัน
คลาส CastSession
แสดงเซสชันที่มีอุปกรณ์แคสต์ ชั้นเรียนนี้มีวิธีต่างๆ ในการควบคุมระดับเสียงและสถานะการปิดเสียงของอุปกรณ์ ซึ่งก่อนหน้านี้ได้ทำใน v2 โดยใช้เมธอดใน Cast.CastApi
ในเวอร์ชัน 2 การเรียกกลับของ Cast.Listener
ส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของอุปกรณ์ ซึ่งรวมถึงระดับเสียง สถานะปิดเสียง สถานะสแตนด์บาย และอื่นๆ
ใน CAF การแจ้งเตือนการเปลี่ยนแปลงระดับเสียง/ปิดเสียงจะยังคงส่งผ่านเมธอด Callback ใน Cast.Listener
โดย Listener เหล่านี้จะลงทะเบียนด้วย
CastSession
การแจ้งเตือนสถานะของอุปกรณ์ที่เหลือทั้งหมดจะนำส่งผ่าน Callback CastStateListener
ซึ่ง Listener เหล่านี้จะลงทะเบียนอยู่กับ CastSession
ตรวจสอบว่ายังคงยกเลิกการลงทะเบียน Listener อยู่เมื่อส่วนย่อย กิจกรรม หรือแอปที่เกี่ยวข้องไปที่พื้นหลัง
ตรรกะการเชื่อมต่ออีกครั้ง
เช่นเดียวกับเวอร์ชัน 2 CAF จะพยายามสร้างการเชื่อมต่อเครือข่ายที่สูญหายไปเนื่องจากสัญญาณ Wi-Fi สูญหายชั่วคราวหรือข้อผิดพลาดอื่นๆ ของเครือข่าย ซึ่งตอนนี้จะดำเนินการในระดับเซสชัน โดยเซสชันจะเข้าสู่สถานะ "ถูกระงับ" เมื่อการเชื่อมต่อขาดหาย และจะเปลี่ยนกลับเป็นสถานะ "เชื่อมต่อแล้ว" เมื่อมีการคืนค่าการเชื่อมต่อ โดยเฟรมเวิร์กนี้จะทำการเชื่อมต่อแอปพลิเคชันเว็บรีซีฟเวอร์อีกครั้ง และเชื่อมต่อช่องการแคสต์ใหม่ตามกระบวนการนี้
นอกจากนี้ CAF ยังเพิ่มการเริ่มเซสชันอัตโนมัติอีกครั้ง ซึ่งจะเปิดใช้โดยค่าเริ่มต้น (และปิดใช้งานได้ผ่าน CastOptions
)
หากแอปพลิเคชันของผู้ส่งส่งไปยังเบื้องหลังหรือถูกยุติ (ด้วยการเลื่อนออกหรือการขัดข้อง) ขณะที่เซสชันการแคสต์อยู่ระหว่างดำเนินการ เฟรมเวิร์กจะพยายามทำให้เซสชันนั้นกลับมาทำงานอีกครั้งเมื่อแอปพลิเคชันของผู้ส่งกลับมาทำงานในเบื้องหน้าหรือเปิดอีกครั้ง ซึ่งจะมีการจัดการโดยอัตโนมัติโดย SessionManager
ซึ่งจะออก Callback ที่เหมาะสมในอินสแตนซ์ SessionManagerListener
ที่ลงทะเบียนไว้
การลงทะเบียนแชแนลที่กำหนดเอง
ในเวอร์ชัน 2 แชแนลที่กำหนดเอง (ใช้งานโดยใช้ Cast.MessageReceivedCallback
) จะลงทะเบียนกับ Cast.CastApi
ใน CAF แชแนลที่กำหนดเองจะลงทะเบียนกับอินสแตนซ์ CastSession
แทน คุณลงทะเบียนได้ในเมธอด Callback SessionManagerListener.onSessionStarted
สำหรับแอปพลิเคชันสื่อ คุณไม่จำเป็นต้องลงทะเบียนช่องทางควบคุมสื่อผ่าน Cast.CastApi.setMessageReceivedCallbacks
อย่างชัดแจ้งอีกต่อไป โปรดดูรายละเอียดเพิ่มเติมในส่วนต่อไปนี้
ส่วนควบคุมสื่อ
คลาส v2 RemoteMediaPlayer
เลิกใช้งานแล้วและไม่ควรใช้ ใน CAF จะมีการแทนที่คลาส RemoteMediaClient
ใหม่ซึ่งมีฟังก์ชันการทำงานที่เทียบเท่าใน API ที่สะดวกกว่า ไม่จำเป็นต้องเริ่มต้นหรือลงทะเบียนออบเจ็กต์นี้อย่างชัดเจน เฟรมเวิร์ก
จะสร้างอินสแตนซ์อ็อบเจ็กต์โดยอัตโนมัติและลงทะเบียนช่องทางสื่อ
ที่อยู่ในเวลาเริ่มต้นเซสชันหากแอปพลิเคชัน Web Receiver ที่กำลังเชื่อมต่ออยู่รองรับเนมสเปซสื่อ
คุณสามารถเข้าถึง RemoteMediaClient
ได้เพราะเมธอด getRemoteMediaClient
ของออบเจ็กต์ CastSession
ในเวอร์ชัน 2 คำขอสื่อทั้งหมดที่ออกเมื่อวันที่ RemoteMediaPlayer
จะแสดงผล RemoteMediaPlayer.MediaChannelResult
ผ่าน Callback PendingResult
ใน CAF คำขอสื่อทั้งหมดที่ออกในวันที่ RemoteMediaClient
จะแสดงผล RemoteMediaClient.MediaChannelResult
ผ่านการเรียกกลับ PendingResult
ซึ่งสามารถใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของคำขอ
RemoteMediaPlayer
เวอร์ชัน 2 จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของมีเดียเพลเยอร์บนตัวรับเว็บผ่านทาง RemoteMediaPlayer.OnStatusUpdatedListener
ใน CAF นั้น RemoteMediaClient
จะให้ Callback ที่เทียบเท่ากันผ่านอินเทอร์เฟซ RemoteMediaClient.Listener
คุณสามารถลงทะเบียน Listener กี่รายการก็ได้กับ 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
ที่ช่วยให้คุณสร้างตัวควบคุมแบบขยายของตัวเองได้อย่างง่ายดาย
CAF เพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า
ExpandedControllerActivity
ซึ่งคุณเพิ่มลงในแอปได้ง่ายๆ โดยไม่ต้อง
ใช้ตัวควบคุมแบบขยายที่กำหนดเองอีกต่อไปโดยใช้ UIMediaController
โฟกัสอัตโนมัติ
ในเวอร์ชัน 2 คุณต้องใช้ MediaSessionCompat
เพื่อจัดการการโฟกัสเสียง
ใน CAF โฟกัสเสียงจะได้รับการจัดการโดยอัตโนมัติ
การบันทึกการแก้ไขข้อบกพร่อง
ใน CAF ไม่มีตัวเลือกการบันทึก
แอปตัวอย่าง
เรามี บทแนะนำ Codelab และ ตัวอย่างแอป ที่ใช้ CAF