ขั้นตอนต่อไปนี้จะช่วยให้คุณแปลงแอปส่งของ Android จาก Cast SDK v2 เป็นแอปส่ง CAF ซึ่งอิงตาม CastContext แบบ Singleton
Cast CAF Sender SDK ใช้ CastContext เพื่อจัดการ GoogleAPIClient ในนามของคุณ CastContext จะจัดการวงจร ข้อผิดพลาด และการเรียกกลับให้คุณ ซึ่งทำให้การพัฒนาแอป Cast ง่ายขึ้นอย่างมาก
บทนำ
- CAF Sender จะยังคงจัดจำหน่ายเป็นส่วนหนึ่งของบริการ Google Play โดยใช้เครื่องมือจัดการ SDK ของ Android
- เราได้เพิ่มแพ็กเกจใหม่ที่รับผิดชอบในการปฏิบัติตามรายการตรวจสอบการออกแบบ Google Cast (
com.google.android.gms.cast.framework.*
) - ตัวส่ง CAF มีวิดเจ็ตที่เป็นไปตามข้อกำหนด 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
แบบสแตนด์อโลนเพื่อระบุรหัสแอปพลิเคชันตัวรับเว็บและตัวเลือกส่วนกลางอื่นๆOptionsProvider
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" ของไฟล์ app
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);
}
ซึ่งในเวอร์ชัน 2 ขั้นตอนเหล่านี้ไม่จำเป็น
การค้นหาอุปกรณ์
ใน 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 เฟรมเวิร์กจะจัดการการควบคุมอุปกรณ์ส่วนใหญ่ แอปพลิเคชันฝั่งผู้ส่งไม่จําเป็นต้องจัดการ (และไม่ควรพยายามจัดการ) การเชื่อมต่อกับอุปกรณ์และการเปิดแอปพลิเคชันตัวรับเว็บโดยใช้ GoogleApiClient
ตอนนี้การโต้ตอบระหว่างผู้ส่งและผู้รับเว็บจะแสดงเป็น "เซสชัน" คลาส SessionManager
จะจัดการวงจรของเซสชัน รวมถึงเริ่มและหยุดเซสชันโดยอัตโนมัติเพื่อตอบสนองต่อท่าทางสัมผัสของผู้ใช้ โดยเซสชันจะเริ่มขึ้นเมื่อผู้ใช้เลือกอุปกรณ์แคสต์ในกล่องโต้ตอบแคสต์ และสิ้นสุดลงเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบแคสต์หรือเมื่อแอปผู้ส่งสิ้นสุดการทำงาน แอปพลิเคชันของผู้ส่งจะได้รับการแจ้งเตือนเหตุการณ์ในวงจรชีวิตของเซสชันโดยการลงทะเบียน SessionManagerListener
กับ SessionManager
SessionManagerListener
callbacks define
callback methods for all session lifecycle events.
คลาส
CastSession
แสดงถึงเซสชันที่มีอุปกรณ์ Cast คลาสนี้มีเมธอดสำหรับการควบคุมระดับเสียงของอุปกรณ์และสถานะปิดเสียง ซึ่งก่อนหน้านี้ทำได้ใน v2 โดยใช้เมธอดใน Cast.CastApi
ใน v2 นั้น Callbacks ของ Cast.Listener
จะแจ้งเตือนการเปลี่ยนแปลงสถานะของอุปกรณ์ ซึ่งรวมถึงระดับเสียง สถานะปิดเสียง สถานะสแตนด์บาย และอื่นๆ
ใน CAF การแจ้งเตือนการเปลี่ยนแปลงสถานะระดับเสียง/ปิดเสียงจะยังคงส่งผ่านเมธอดการเรียกกลับใน Cast.Listener
โดยระบบจะลงทะเบียนโปรแกรมฟังเหล่านี้กับ CastSession
การแจ้งเตือนสถานะอุปกรณ์ที่เหลือทั้งหมดจะส่งผ่านผ่าน callbacks ของ CastStateListener
โดยระบบจะลงทะเบียนตัวฟังเหล่านี้กับ CastSession
ตรวจสอบว่าคุณยังคงยกเลิกการลงทะเบียนตัวรับฟังเมื่อมีการเรียกใช้ข้อมูลโค้ดที่เชื่อมโยง กิจกรรม หรือแอปในเบื้องหลัง
ตรรกะการเชื่อมต่ออีกครั้ง
เช่นเดียวกับ v2 นั้น CAF จะพยายามสร้างการเชื่อมต่อเครือข่ายอีกครั้งหากขาดหายไปเนื่องจากสัญญาณ Wi-Fi ขาดหายไปชั่วคราวหรือข้อผิดพลาดอื่นๆ ของเครือข่าย ตอนนี้การดำเนินการนี้ทำในระดับเซสชันแล้ว โดยเซสชันจะเข้าสู่สถานะ "หยุดชั่วคราว" เมื่อขาดการเชื่อมต่อ และจะเปลี่ยนกลับไปเป็นสถานะ "เชื่อมต่อแล้ว" เมื่อการเชื่อมต่อได้รับการคืนค่า เฟรมเวิร์กจะดูแลการเชื่อมต่อกับแอปพลิเคชันตัวรับเว็บอีกครั้งและเชื่อมต่อช่องแคสต์อีกครั้งในกระบวนการนี้
นอกจากนี้ 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
callback
ใน CAF คำขอสื่อทั้งหมดที่ออกใน RemoteMediaClient
จะแสดงผลเป็น RemoteMediaClient.MediaChannelResult
ผ่าน PendingResult
callback ซึ่งสามารถใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของคำขอ
RemoteMediaPlayer
v2 จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะโปรแกรมเล่นสื่อในเว็บรีซีฟเวอร์ผ่าน RemoteMediaPlayer.OnStatusUpdatedListener
ใน CAF RemoteMediaClient
จะให้การเรียกกลับที่เทียบเท่าผ่านอินเทอร์เฟซ RemoteMediaClient.Listener
คุณสามารถลงทะเบียนตัวฟังกับ RemoteMediaClient
กี่ตัวก็ได้ ซึ่งจะช่วยให้คอมโพเนนต์ผู้ส่งหลายรายการแชร์อินสแตนซ์ RemoteMediaClient
รายการเดียวที่เชื่อมโยงกับเซสชันได้
ในเวอร์ชัน 2 แอปพลิเคชันผู้ส่งต้องแบกรับภาระในการรักษาให้อินเทอร์เฟซผู้ใช้ซิงค์กับสถานะโปรแกรมเล่นสื่อในเว็บรีซีฟเวอร์
ใน CAF คลาส UIMediaController
จะเป็นผู้รับผิดชอบส่วนใหญ่
การซ้อนทับช่วงแนะนำ
V2 ไม่มี UI การวางซ้อนช่วงแนะนำ
CAF มีมุมมองที่กำหนดเอง
IntroductoryOverlay
เพื่อไฮไลต์ปุ่มแคสต์เมื่อแสดงต่อผู้ใช้เป็นครั้งแรก
รีโมตคอนโทรลเลอร์ขนาดเล็ก
ในเวอร์ชัน 2 คุณต้องใช้ตัวควบคุมขนาดเล็กตั้งแต่ต้นในแอปผู้ส่ง
ใน 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();
}
ตัวควบคุมแบบขยาย
ในเวอร์ชัน 2 คุณต้องติดตั้งใช้งานตัวควบคุมแบบขยายตั้งแต่ต้นในแอปผู้ส่ง
CAF มีคลาสตัวช่วย UIMediaController
ที่จะช่วยให้คุณสร้างตัวควบคุมแบบขยายได้ง่ายๆ
CAF จะเพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า ExpandedControllerActivity
ซึ่งคุณเพิ่มลงในแอปได้ง่ายๆ คุณจึงไม่จำเป็นต้องติดตั้งใช้งานตัวควบคุมแบบขยายที่กําหนดเองโดยใช้ UIMediaController
อีกต่อไป
โฟกัสอัตโนมัติ
ในเวอร์ชัน 2 คุณต้องใช้ MediaSessionCompat
เพื่อจัดการโหมดโฟกัสเสียง
ใน CAF ระบบจะจัดการโฟกัสเสียงโดยอัตโนมัติ
การบันทึกการแก้ไขข้อบกพร่อง
ใน CAF ไม่มีตัวเลือกการบันทึก
ตัวอย่างแอป
เรามีบทแนะนํา Codelab และตัวอย่างแอปที่ใช้ CAF