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