ขั้นตอนต่อไปนี้ช่วยให้คุณแปลงแอปผู้ส่ง Android จาก Cast SDK v2 เป็น CAF Sender ได้โดยอิงตามซิงเกิล CastContext
Cast CAF Sender SDK ใช้ CastContext เพื่อจัดการ GoogleAPIClient ในนามของคุณ CastContext จะจัดการวงจร ข้อผิดพลาด และการติดต่อกลับให้คุณ ซึ่งช่วยให้พัฒนาแอปแคสต์ได้ง่ายขึ้น
บทนำ
- ผู้ส่ง CAF ยังคงกระจายอยู่ในบริการ Google Play โดยใช้ตัวจัดการ SDK ของ Android
- มีการเพิ่มแพ็กเกจใหม่ที่มีความรับผิดชอบในการปฏิบัติตามรายการตรวจสอบของการออกแบบ Google Cast (
com.google.android.gms.cast.framework.*
) - ผู้ส่ง CAF มีวิดเจ็ตที่สอดคล้องกับข้อกําหนดของ Cast UX v2 ไม่มีองค์ประกอบ UI ที่จําเป็นและกําหนดให้คุณต้องใช้วิดเจ็ตเหล่านี้
- ไม่จําเป็นต้องใช้ GoogleApiClient ในการใช้ Cast API อีกต่อไป
- คําบรรยายในผู้ส่ง CAF คล้ายกับ v2
การอ้างอิง
V2 และ CAF ใช้ทรัพยากร Dependency ในไลบรารีและบริการ Google Play (9.2.0 ขึ้นไป) เหมือนกันตามที่อธิบายไว้ในคู่มือฟีเจอร์ไลบรารีการสนับสนุน
Android SDK เวอร์ชันขั้นต่ําที่ CAF รองรับคือ 9 (Gingerburger)
การเริ่มต้น
ใน CAF คุณจําเป็นต้องระบุขั้นตอนการแคสต์อย่างชัดเจนสําหรับเฟรมเวิร์ก "แคสต์" ซึ่งรวมถึงการเริ่มต้น
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
ภายในแท็ก "แอปพลิเคชัน" ของไฟล์ 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
ปุ่ม "แคสต์" และกล่องโต้ตอบการแคสต์
เช่นเดียวกับเวอร์ชัน 2 คอมโพเนนต์เหล่านี้มาจากไลบรารีการสนับสนุนของ 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
กับเฟรมเวิร์กแคสต์
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
การโต้ตอบระหว่างผู้ส่งกับผู้รับเว็บจะแสดงเป็น "เซสชัน" คลาส SessionManager
จัดการวงจรเซสชันและเริ่มต้นและหยุดเซสชันตามท่าทางสัมผัสของผู้ใช้โดยอัตโนมัติ นั่นคือเซสชันจะเริ่มต้นเมื่อผู้ใช้เลือกอุปกรณ์แคสต์ในกล่องโต้ตอบแคสต์ และจะสิ้นสุดเมื่อผู้ใช้แตะปุ่ม "หยุดแคสต์" ในกล่องโต้ตอบแคสต์หรือเมื่อแอปผู้ส่งสิ้นสุดลง แอปพลิเคชันของผู้ส่งจะรับการแจ้งเตือนเกี่ยวกับเหตุการณ์ในวงจรของเซสชันได้โดยลงทะเบียน SessionManagerListener
กับ SessionManager
โค้ดเรียกกลับ SessionManagerListener
กําหนดวิธีเรียกกลับสําหรับเหตุการณ์ในวงจรของเซสชันทั้งหมด
คลาส CastSession
แสดงถึงเซสชันที่มีอุปกรณ์แคสต์ ชั้นเรียนมีวิธีการควบคุมระดับเสียงของอุปกรณ์และปิดเสียงสถานะต่างๆ ซึ่งก่อนหน้านี้ทําแบบ v2 โดยใช้เมธอดใน Cast.CastApi
ในเวอร์ชัน 2 การเรียกกลับ Cast.Listener
จะแสดงการแจ้งเตือนการเปลี่ยนแปลงสถานะอุปกรณ์ ซึ่งรวมถึงระดับเสียง สถานะปิดเสียง สถานะสแตนด์บาย และอื่นๆ
ใน CAF การแจ้งเตือนการเปลี่ยนแปลงระดับเสียง/ปิดเสียงจะยังส่งผ่านเมธอดเรียกกลับใน Cast.Listener
โดยผู้ฟังเหล่านี้ลงทะเบียนกับ CastSession
การแจ้งเตือนสถานะอุปกรณ์ที่เหลือทั้งหมดจะส่งผ่านการติดต่อกลับ
CastStateListener
ผู้ฟังเหล่านี้ลงทะเบียนกับ CastSession
ตรวจสอบว่าคุณยังคงยกเลิกการลงทะเบียน Listener อยู่เมื่อส่วน กิจกรรม หรือแอปที่เชื่อมโยงอยู่เบื้องหลัง
ตรรกะการเชื่อมต่ออีกครั้ง
CAV จะพยายามเชื่อมต่อเครือข่ายที่สูญหายอีกครั้งเนื่องจากสัญญาณ Wi-Fi ชั่วคราวหรือข้อผิดพลาดเกี่ยวกับเครือข่ายอื่นๆ เช่นเดียวกับ v2 ซึ่งตอนนี้ จะทําได้ที่ระดับเซสชัน เซสชันสามารถเข้าสู่สถานะ "ถูกระงับ" เมื่อการเชื่อมต่อขาดหาย และจะเปลี่ยนกลับไปเป็นสถานะ "เชื่อมต่อแล้ว" เมื่อกู้คืนการเชื่อมต่อแล้ว เฟรมเวิร์กจะทําหน้าที่เชื่อมต่อแอปพลิเคชัน Web Receiver อีกครั้งและเชื่อมต่อช่องทางการแคสต์อีกครั้ง ซึ่งเป็นส่วนหนึ่งของกระบวนการนี้
นอกจากนี้ CAF ยังเพิ่มการแสดงเซสชันอัตโนมัติซึ่งเปิดใช้โดยค่าเริ่มต้นด้วย (และปิดใช้งานได้ผ่าน CastOptions
หากแอปพลิเคชันของผู้ส่งส่งไปยังเบื้องหลังหรือถูกสิ้นสุดการใช้งาน (ด้วยการปัดออกหรือเนื่องจากมีข้อขัดข้อง) ในระหว่างเซสชันการแคสต์ เฟรมเวิร์กจะพยายามดําเนินการต่อในเซสชันนั้นเมื่อแอปพลิเคชันของผู้ส่งกลับไปทํางานเบื้องหน้าหรือเปิดใช้อีกครั้ง ซึ่งจะจัดการโดยอัตโนมัติด้วย SessionManager
ซึ่งจะออกการเรียกกลับที่เหมาะสมในอินสแตนซ์ที่ลงทะเบียนไว้ SessionManagerListener
การลงทะเบียนแชแนลที่กําหนดเอง
ในเวอร์ชัน 2 แชแนลที่กําหนดเอง (ใช้งานโดยใช้ 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
ซึ่งใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของคําขอได้
RemoteMediaPlayer
v2 จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะโปรแกรมเล่นสื่อบนตัวรับเว็บผ่าน RemoteMediaPlayer.OnStatusUpdatedListener
ใน CAF RemoteMediaClient
จะแสดงโค้ดเรียกกลับที่เทียบเท่า RemoteMediaClient.Listener
บนอินเทอร์เฟซ จํานวน Listener จํานวนมากจะลงทะเบียนกับ RemoteMediaClient
ได้ ซึ่งช่วยให้คอมโพเนนต์ของผู้ส่งหลายรายแชร์อินสแตนซ์ของ RemoteMediaClient
รายการเดียวที่เชื่อมโยงกับเซสชันได้
ใน v2 แอปพลิเคชันผู้ส่งมีหน้าที่ต้องดูแลให้อินเทอร์เฟซผู้ใช้ซิงค์กับสถานะโปรแกรมเล่นสื่อในเครื่องรับเว็บ
ใน CAF ชั้นเรียน
UIMediaController
เป็นผู้รับผิดชอบสูงสุด
การวางซ้อนที่แนะนํา
V2 ไม่มี UI การวางซ้อนที่แนะนํา
CAF แสดงมุมมองที่กําหนดเอง
IntroductoryOverlay
เพื่อไฮไลต์ปุ่ม "แคสต์" เมื่อแสดงให้ผู้ใช้เห็นเป็นครั้งแรก
ตัวควบคุมขนาดเล็ก
ใน v2 คุณต้องใช้ตัวควบคุมขนาดเล็กตั้งแต่ต้นในแอปผู้ส่ง
ใน CAF SDK จะให้มุมมองที่กําหนดเอง MiniControllerFragment
ซึ่งคุณเพิ่มไปยังไฟล์เลย์เอาต์แอปของกิจกรรมที่คุณต้องการแสดงตัวควบคุมขนาดเล็กได้
การแจ้งเตือนและหน้าจอล็อก
SDK ใน v2 ไม่มีตัวควบคุมสําหรับการแจ้งเตือนและหน้าจอล็อก สําหรับ 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();
}
ตัวควบคุมแบบขยาย
ใน v2 คุณต้องใช้ตัวควบคุมแบบขยายตั้งแต่ต้นในแอปผู้ส่ง
CAF มีคลาสผู้ช่วย
UIMediaController
ที่ช่วยให้คุณสร้างตัวควบคุมขยาย
ของตัวเองได้อย่างง่ายดาย
CAF จะเพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า
ExpandedControllerActivity
ซึ่งเพียงแค่เพิ่มไปยังแอป โดยคุณไม่จําเป็นต้องใช้ตัวควบคุมแบบขยายที่กําหนดเองโดยใช้ UIMediaController
โฟกัสอัตโนมัติ
ใน v2 คุณต้องใช้ MediaSessionCompat
เพื่อจัดการโฟกัสเสียง
ใน CAF การจัดการโฟกัสเสียงจะจัดการโดยอัตโนมัติ
การบันทึกการแก้ไขข้อบกพร่อง
ใน CAF จะไม่มีตัวเลือกการบันทึก
แอปตัวอย่าง
เรามีบทแนะนํา Codelab และตัวอย่างแอปที่ใช้ CAF