ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปตัวส่ง 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
ปุ่มแคสต์และกล่องโต้ตอบแคสต์
เช่นเดียวกับใน 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แทน คุณลงทะเบียนได้ในเมธอด Callback ของ
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 แอปพลิเคชันตัวส่งต้องรับภาระในการซิงค์อินเทอร์เฟซผู้ใช้กับสถานะของ Media Player ใน 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