ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปตัวส่ง 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
ของแต่ละ Activity
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
แสดงเซสชันที่มีอุปกรณ์ 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
แทน คุณลงทะเบียนได้ในเมธอด
SessionManagerListener.onSessionStarted
การเรียกกลับ สำหรับแอปพลิเคชันสื่อ คุณไม่จำเป็นต้องลงทะเบียนช่องควบคุมสื่ออย่างชัดเจนผ่าน Cast.CastApi.setMessageReceivedCallbacks
อีกต่อไป โปรดดูรายละเอียดเพิ่มเติมในส่วนต่อไปนี้
ส่วนควบคุมสื่อ
คลาส v2
RemoteMediaPlayer
เลิกใช้งานแล้วและไม่ควรใช้ ใน CAF คลาสใหม่
RemoteMediaClient
จะแทนที่คลาสนี้ ซึ่งมีฟังก์ชันการทำงานเทียบเท่าใน API ที่สะดวกกว่า คุณ
ไม่จำเป็นต้องเริ่มต้นหรือลงทะเบียนออบเจ็กต์นี้อย่างชัดเจน เนื่องจากเฟรมเวิร์ก
จะสร้างอินสแตนซ์ออบเจ็กต์และลงทะเบียนช่องสื่อพื้นฐานโดยอัตโนมัติ
เมื่อเซสชันเริ่มต้น หากแอปพลิเคชัน Web Receiver ที่เชื่อมต่ออยู่
รองรับเนมสเปซสื่อ
RemoteMediaClient
สามารถเข้าถึงได้ในฐานะเมธอด getRemoteMediaClient
ของออบเจ็กต์ CastSession
ในเวอร์ชัน 2 คำขอสื่อทั้งหมดที่ออกใน 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
ซึ่งคุณสามารถเพิ่มลงในไฟล์เลย์เอาต์ของแอปของกิจกรรมที่คุณต้องการ
แสดงมินิคอนโทรลเลอร์ได้
การแจ้งเตือนและหน้าจอล็อก
ใน 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 มี
UIMediaController
คลาสตัวช่วยที่ช่วยให้คุณสร้างตัวควบคุมที่ขยายได้ด้วยตนเองได้ง่ายๆ
CAF เพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า
ExpandedControllerActivity
ซึ่งคุณสามารถเพิ่มลงในแอปได้อย่างง่ายดาย คุณไม่จำเป็นต้อง
ใช้ตัวควบคุมแบบขยายที่กำหนดเองโดยใช้ UIMediaController
อีกต่อไป
โฟกัสอัตโนมัติ
ใน v2 คุณต้องใช้ MediaSessionCompat
เพื่อจัดการโฟกัสเสียง
ใน CAF ระบบจะจัดการโฟกัสเสียงโดยอัตโนมัติ
การบันทึกการแก้ไขข้อบกพร่อง
ใน CAF จะไม่มีตัวเลือกการบันทึก
แอปตัวอย่าง
เรามีบทแนะนำ Codelab และแอปตัวอย่าง ที่ใช้ CAF