ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปผู้ส่ง Android จาก Cast SDK v2 เป็น CAF Sender ซึ่งอิงตามซิงเกิลตัน CastContext ได้
Cast CAF Sender SDK ใช้ CastContext เพื่อจัดการ GoogleAPIClient ในนามของคุณ CastContext จะจัดการวงจร ข้อผิดพลาด และ Callback ให้คุณ ซึ่งช่วยลดความซับซ้อนในการพัฒนาแอป Cast ได้อย่างมาก
บทนำ
- CAF Sender ยังคงเผยแพร่เป็นส่วนหนึ่งของบริการ Google Play โดยใช้เครื่องมือจัดการ Android SDK
- มีการเพิ่มแพ็กเกจใหม่ที่รับผิดชอบในการปฏิบัติตามรายการตรวจสอบการออกแบบ Google Cast (
com.google.android.gms.cast.framework.*) - CAF Sender มีวิดเจ็ตที่เป็นไปตามข้อกำหนด UX ของ Cast ส่วน v2 ไม่มีคอมโพเนนต์ UI ใดๆ และกำหนดให้คุณต้องติดตั้งใช้งานวิดเจ็ตเหล่านี้
- ไม่จำเป็นต้องใช้ GoogleApiClient เพื่อใช้ Cast API อีกต่อไป
- คำบรรยายแทนเสียงใน CAF Sender จะคล้ายกับ v2
แท็กเริ่มการทำงาน
V2 และ CAF มีทรัพยากร Dependency เดียวกันในไลบรารีสนับสนุนและบริการ Google Play (9.2.0 ขึ้นไป) ตามที่อธิบายไว้ในคู่มือฟีเจอร์ของไลบรารีสนับสนุน
เวอร์ชัน Android SDK ขั้นต่ำที่ CAF รองรับคือ 9 (Gingerbread)
การเริ่มต้น
ใน CAF ต้องมีขั้นตอนการเริ่มต้นที่ชัดเจนสำหรับเฟรมเวิร์ก Cast ซึ่งรวมถึงการเริ่มต้นซิงเกิลตัน 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 ของแต่ละกิจกรรมแบบ Lazy:
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;
}
เมื่อมีคนแตะปุ่ม กล่องโต้ตอบ Cast จะแสดงขึ้นโดยอัตโนมัติ
ระบบควบคุมอุปกรณ์
ใน CAF การควบคุมอุปกรณ์จะจัดการโดยเฟรมเวิร์กเป็นส่วนใหญ่ แอปพลิเคชันผู้ส่งไม่จำเป็นต้องจัดการ (และไม่ควรพยายามจัดการ) การเชื่อมต่อกับอุปกรณ์และการเปิดแอปพลิเคชัน Web Receiver โดยใช้ GoogleApiClient ตอนนี้การโต้ตอบระหว่างผู้ส่งและตัวรับสัญญาณบนเว็บจะแสดงเป็น "เซสชัน" คลาส SessionManager จะจัดการวงจรของเซสชัน รวมถึงเริ่มและหยุดเซสชันโดยอัตโนมัติเพื่อตอบสนองต่อท่าทางของผู้ใช้ โดยเซสชันจะเริ่มขึ้นเมื่อผู้ใช้เลือกอุปกรณ์แคสต์ในกล่องโต้ตอบแคสต์ และจะสิ้นสุดลงเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบแคสต์ หรือเมื่อแอปผู้ส่งสิ้นสุดลง แอปพลิเคชันผู้ส่งจะได้รับการแจ้งเตือนเกี่ยวกับเหตุการณ์ในวงจรของเซสชันได้โดยการลงทะเบียน SessionManagerListener กับ SessionManager SessionManagerListener callbacks จะกำหนดเมธอด Callback สำหรับเหตุการณ์ในวงจรของเซสชันทั้งหมด
คลาส CastSession แสดงถึงเซสชันที่มีอุปกรณ์แคสต์ คลาสนี้มีเมธอดสำหรับควบคุมระดับเสียงของอุปกรณ์และสถานะการปิดเสียง ซึ่งก่อนหน้านี้ทำใน v2 โดยใช้เมธอดใน Cast.CastApi
ใน v2
Cast.Listener
Callback จะแจ้งเตือนการเปลี่ยนแปลงสถานะของอุปกรณ์ ซึ่งรวมถึงระดับเสียง สถานะปิดเสียง สถานะสแตนด์บาย และอื่นๆ
ใน CAF การแจ้งเตือนการเปลี่ยนแปลงสถานะระดับเสียง/ปิดเสียงจะยังคงส่งผ่านเมธอด Callback ใน Cast.Listener โดย Listener เหล่านี้จะลงทะเบียนกับ CastSession
การแจ้งเตือนสถานะอุปกรณ์ที่เหลือทั้งหมดจะส่งผ่านการเรียกกลับ CastStateListener โดย Listener เหล่านี้จะลงทะเบียนกับ CastSession ตรวจสอบว่าคุณยังคงยกเลิกการลงทะเบียน Listener เมื่อ Fragment, กิจกรรม หรือแอปที่เกี่ยวข้องทำงานอยู่เบื้องหลัง
ตรรกะการเชื่อมต่อใหม่
เช่นเดียวกับ v2 CAF จะพยายามสร้างการเชื่อมต่อเครือข่ายที่ขาดหายไปเนื่องจากสัญญาณ Wi-Fi ขาดหายชั่วคราวหรือข้อผิดพลาดเกี่ยวกับเครือข่ายอื่นๆ ขึ้นมาใหม่ ซึ่งตอนนี้จะดำเนินการที่ระดับเซสชัน โดยเซสชันจะเข้าสู่สถานะ "ถูกระงับ" เมื่อขาดการเชื่อมต่อ และจะเปลี่ยนกลับไปเป็นสถานะ "เชื่อมต่อแล้ว" เมื่อการเชื่อมต่อกลับมาเป็นปกติ เฟรมเวิร์กจะดูแลการเชื่อมต่อกับแอปพลิเคชัน Web Receiver อีกครั้งและเชื่อมต่อช่อง Cast อีกครั้งโดยเป็นส่วนหนึ่งของกระบวนการนี้
นอกจากนี้ CAF ยังเพิ่มการกลับมาทำงานของเซสชันโดยอัตโนมัติซึ่งเปิดใช้โดยค่าเริ่มต้น (และปิดใช้งานได้ผ่าน CastOptions)
หากแอปพลิเคชันผู้ส่งถูกส่งไปยังเบื้องหลังหรือสิ้นสุดลง (โดยการปัดออกหรือเนื่องจากข้อขัดข้อง) ขณะที่เซสชัน Cast กำลังดำเนินอยู่ เฟรมเวิร์กจะพยายามกลับมาทำงานต่อในเซสชันนั้นเมื่อแอปพลิเคชันผู้ส่งกลับมาทำงานในเบื้องหน้าหรือเปิดอีกครั้ง ซึ่งจะจัดการโดยอัตโนมัติโดย SessionManager ซึ่งจะออก Callback ที่เหมาะสมในอินสแตนซ์ 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 ผ่าน Callback PendingResult
ใน CAF คำขอสื่อทั้งหมดที่ส่งใน RemoteMediaClient จะแสดงผลเป็น RemoteMediaClient.MediaChannelResult ผ่าน Callback PendingResult ซึ่งใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของคำขอได้
RemoteMediaPlayer v2 จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของมีเดียเพลเยอร์ใน Web Receiver ผ่าน RemoteMediaPlayer.OnStatusUpdatedListener
ใน CAF RemoteMediaClient จะให้ Callback ที่เทียบเท่าผ่านอินเทอร์เฟซ RemoteMediaClient.Listener คุณสามารถลงทะเบียน Listener จำนวนเท่าใดก็ได้กับ RemoteMediaClient ซึ่งช่วยให้คอมโพเนนต์ผู้ส่งหลายรายการแชร์อินสแตนซ์เดียวของ RemoteMediaClient ที่เชื่อมโยงกับเซสชันได้
ใน v2 แอปพลิเคชันผู้ส่งต้องรับภาระในการซิงค์อินเทอร์เฟซผู้ใช้กับสถานะมีเดียเพลเยอร์ใน Web Receiver
ใน CAF คลาส
UIMediaController
จะรับผิดชอบส่วนนี้เป็นส่วนใหญ่
ภาพซ้อนทับเพื่อแนะนำ
V2 ไม่มี UI การวางซ้อนช่วงแนะนำ
CAF มีมุมมองที่กำหนดเอง
IntroductoryOverlay
เพื่อไฮไลต์ปุ่มแคสต์เมื่อแสดงต่อผู้ใช้เป็นครั้งแรก
มินิคอนโทรลเลอร์
ใน v2 คุณต้องใช้ตัวควบคุมขนาดเล็กตั้งแต่ต้นในแอปผู้ส่ง
ใน CAF นั้น SDK จะมีมุมมองที่กำหนดเอง MiniControllerFragment ซึ่งคุณสามารถเพิ่มลงในไฟล์เลย์เอาต์แอปของกิจกรรมที่ต้องการแสดงตัวควบคุมขนาดเล็กได้
การแจ้งเตือนและหน้าจอล็อก
ใน v2 SDK จะไม่มีตัวควบคุมสำหรับการแจ้งเตือนและหน้าจอล็อก สำหรับ 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