ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปผู้ส่ง Android จาก Cast SDK v2 เป็นผู้ส่ง CAF ซึ่งอิงตาม 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 ซึ่งรวมถึงการเริ่มต้น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 ภายในแท็ก "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
ปุ่มแคสต์และกล่องโต้ตอบแคสต์
คอมโพเนนต์เหล่านี้มาจากไลบรารีการรองรับ MediaRouter เช่นเดียวกับใน v2
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
แสดงถึงเซสชันที่มีอุปกรณ์ Cast คลาสมีเมธอดสำหรับ
ควบคุมระดับเสียงของอุปกรณ์และสถานะปิดเสียง ซึ่งก่อนหน้านี้ทำใน 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
หากแอปพลิเคชันผู้ส่งถูกส่งไปยังเบื้องหลังหรือสิ้นสุด (โดยการปัดออกหรือเนื่องจากแอปขัดข้อง) ขณะที่เซสชันการแคสต์กำลังดำเนินอยู่ เฟรมเวิร์กจะพยายามกลับมาใช้เซสชันนั้นต่อเมื่อแอปพลิเคชันผู้ส่งกลับมาอยู่เบื้องหน้าหรือเปิดขึ้นอีกครั้ง โดย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
ผ่านการเรียกกลับ
PendingResult
ซึ่งใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของ
คำขอได้
v2 RemoteMediaPlayer จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของโปรแกรมเล่นสื่อใน Web Receiver ผ่าน RemoteMediaPlayer.OnStatusUpdatedListener
ใน CAF RemoteMediaClient จะให้การเรียกกลับที่เทียบเท่าผ่านอินเทอร์เฟซ
RemoteMediaClient.Listener
คุณลงทะเบียนผู้ฟังได้จำนวนเท่าใดก็ได้ด้วย
RemoteMediaClient ซึ่งจะช่วยให้คอมโพเนนต์ผู้ส่งหลายรายการแชร์
อินสแตนซ์เดียวของ RemoteMediaClient ที่เชื่อมโยงกับเซสชันได้
ใน v2 แอปพลิเคชันตัวส่งต้องรับภาระในการซิงค์อินเทอร์เฟซผู้ใช้กับสถานะของเครื่องเล่นสื่อใน Web Receiver
ใน CAF คลาส
UIMediaController
จะรับผิดชอบในส่วนนี้เป็นส่วนใหญ่
การซ้อนทับช่วงแนะนำ
V2 ไม่มี UI การซ้อนทับเบื้องต้น
CAF มีมุมมองที่กำหนดเอง
IntroductoryOverlay
เพื่อไฮไลต์ปุ่มแคสต์เมื่อแสดงต่อผู้ใช้เป็นครั้งแรก
มินิคอนโทรลเลอร์
ใน v2 คุณต้องติดตั้งใช้งานมินิคอนโทรลเลอร์ตั้งแต่ต้นในแอปผู้ส่ง
ใน 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();
}
ตัวควบคุมแบบขยาย
ใน v2 คุณต้องใช้ตัวควบคุมที่ขยายจากศูนย์ในแอปผู้ส่ง
CAF มีคลาสตัวช่วย
UIMediaController
ที่ช่วยให้คุณสร้างตัวควบคุมแบบขยายของคุณเองได้ง่ายๆ
CAF เพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า
ExpandedControllerActivity
ซึ่งคุณสามารถเพิ่มลงในแอปได้อย่างง่ายดาย คุณไม่จำเป็นต้อง
ใช้ตัวควบคุมแบบขยายที่กำหนดเองโดยใช้ UIMediaController อีกต่อไป
โฟกัสอัตโนมัติ
ใน v2 คุณต้องใช้ MediaSessionCompat เพื่อจัดการโฟกัสเสียง
ใน CAF ระบบจะจัดการโฟกัสเสียงโดยอัตโนมัติ
การบันทึกการแก้ไขข้อบกพร่อง
ใน CAF จะไม่มีตัวเลือกการบันทึก
แอปตัวอย่าง
เรามีบทแนะนำ Codelab และแอปตัวอย่าง ที่ใช้ CAF