ขั้นตอนต่อไปนี้จะช่วยให้คุณแปลงแอปผู้ส่ง Android จาก Cast ได้ SDK v2 ไปยังผู้ส่ง CAF ซึ่งอิงตาม CastContext Singleton
Cast CAF Sender SDK ใช้ CastContext เพื่อจัดการ GoogleAPIClient ในนามของคุณ CastContext จะจัดการวงจร ข้อผิดพลาด และ Callback ให้คุณ ทำให้การพัฒนาแอป Cast ง่ายขึ้น
บทนำ
- ผู้ส่ง CAF ยังคงได้รับการแจกจ่ายโดยเป็นส่วนหนึ่งของบริการ Google Play โดยใช้โปรแกรมจัดการ Android SDK
- เพิ่มแพ็กเกจใหม่ที่รับผิดชอบในการปฏิบัติตามข้อกำหนด
รายการตรวจสอบการออกแบบของ 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 หรือใหม่กว่า) ตามที่อธิบายไว้ในฟีเจอร์ Support Library คำแนะนำ
เวอร์ชัน 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
ภายใน "แอปพลิเคชัน" แท็กของแอป
ไฟล์ 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
แบบ Lazy Loading ในเมธอด 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
ไปยังเฟรมเวิร์กของ 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
Callback SessionManagerListener
จะกำหนด
เมธอด Callback สำหรับเหตุการณ์ในวงจรทั้งหมดของเซสชัน
CastSession
คลาสแสดงถึงเซสชันที่มีอุปกรณ์แคสต์ ชั้นเรียนมีวิธีการสำหรับ
การควบคุมระดับเสียงของอุปกรณ์และสถานะการปิดเสียง ซึ่งเคยทำใน v2
โดยใช้เมธอดใน Cast.CastApi
ในเวอร์ชัน 2 พารามิเตอร์
Cast.Listener
Callback มอบการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงสถานะของอุปกรณ์ รวมถึง
ระดับเสียง สถานะปิดเสียง สถานะสแตนด์บาย และอื่นๆ
ใน CAF การแจ้งเตือนการเปลี่ยนแปลงระดับเสียง/ปิดเสียงจะยังคงส่งผ่าน Callback
ใน Cast.Listener
ผู้ฟังเหล่านี้ลงทะเบียนด้วย
CastSession
การแจ้งเตือนสถานะอุปกรณ์ที่เหลืออยู่ทั้งหมดจะส่งผ่านทาง
CastStateListener
Callback Listener เหล่านี้ลงทะเบียนไว้กับ CastSession
ตรวจสอบว่าคุณ
ยังคงยกเลิกการลงทะเบียน Listener เมื่อ Fragment กิจกรรม หรือแอปที่เกี่ยวข้อง
กับพื้นหลัง
ตรรกะการเชื่อมต่ออีกครั้ง
เช่นเดียวกับเวอร์ชัน 2 CAF จะพยายามเริ่มต้นการเชื่อมต่อเครือข่ายที่ สูญหายไปเนื่องจากการสูญเสียสัญญาณ Wi-Fi ชั่วคราว หรือข้อผิดพลาดอื่นๆ ของเครือข่าย ขณะนี้คือ ทำที่ระดับเซสชัน เซสชันสามารถป้อนคำว่า "ถูกระงับ" ระบุเมื่อ การเชื่อมต่อถูกตัดและจะเปลี่ยนกลับเป็น "เชื่อมต่อแล้ว" ระบุเมื่อ กลับมาเชื่อมต่ออีกครั้ง โดยเฟรมเวิร์กจะช่วยเชื่อมต่อกับอินเทอร์เน็ต แอปพลิเคชันตัวรับเว็บและการเชื่อมต่อช่องการแคสต์อีกครั้ง ซึ่งเป็นส่วนหนึ่งของกระบวนการนี้
นอกจากนี้ CAF ยังเพิ่มการเริ่มเซสชันอัตโนมัติอีกครั้ง ซึ่งเปิดใช้งานโดย
ค่าเริ่มต้น (และสามารถปิดใช้งานได้ผ่านทาง
CastOptions
หากแอปพลิเคชันของผู้ส่งถูกส่งไปยังพื้นหลัง หรือถูกยุติการใช้งาน (โดย
การปัดออกไปหรือเกิดการขัดข้อง) ขณะที่เซสชันการแคสต์กำลังดำเนินอยู่ ฟังก์ชัน
เฟรมเวิร์กจะพยายามเซสชันนั้นต่อเมื่อแอปพลิเคชันผู้ส่ง
กลับไปที่เบื้องหน้าหรือเปิดอีกครั้ง ซึ่งจะถูกจัดการโดยอัตโนมัติโดย
SessionManager
ซึ่งจะออก Callback ที่เหมาะสมในบัญชีที่จดทะเบียน
SessionManagerListener
อินสแตนซ์
การลงทะเบียนแชแนลที่กำหนดเอง
ในเวอร์ชัน 2 แชแนลที่กำหนดเอง (ใช้งานโดยใช้
Cast.MessageReceivedCallback
)
จดทะเบียนกับ Cast.CastApi
แล้ว ใน CAF แชแนลที่กำหนดเองจะลงทะเบียนกับ
CastSession
การลงทะเบียนสามารถทำได้ใน
SessionManagerListener.onSessionStarted
Callback Method สำหรับแอปพลิเคชันสื่อ คุณไม่จำเป็นต้อง
ลงทะเบียนช่องทางควบคุมสื่อผ่าน Cast.CastApi.setMessageReceivedCallbacks
ดูรายละเอียดเพิ่มเติมได้ในส่วนต่อไปนี้
ส่วนควบคุมสื่อ
คลาส v2
RemoteMediaPlayer
เลิกใช้งานแล้วและไม่ควรนำมาใช้ ใน CAF มันจะถูกแทนที่โดย
RemoteMediaClient
ซึ่งมีฟังก์ชันการทำงานที่เทียบเท่ากันใน API ที่สะดวกกว่า ใช่เลย
ไม่จำเป็นต้องเริ่มต้นหรือลงทะเบียนออบเจ็กต์นี้อย่างชัดเจน เฟรมเวิร์ก
จะสร้างอินสแตนซ์ของออบเจ็กต์โดยอัตโนมัติและลงทะเบียนสื่อที่อยู่เบื้องหลัง
แชแนล ณ เวลาเริ่มต้นเซสชัน หากแอปพลิเคชันตัวรับเว็บที่กำลังเชื่อมต่ออยู่
รองรับเนมสเปซสื่อ
สามารถเข้าถึง RemoteMediaClient
เป็น
getRemoteMediaClient
ของออบเจ็กต์ CastSession
ในเวอร์ชัน 2 คำขอสื่อทั้งหมดที่ออกเมื่อวันที่ RemoteMediaPlayer
จะแสดงผล
RemoteMediaPlayer.MediaChannelResult
ผ่านการโทรกลับของ PendingResult
ใน CAF คำขอสื่อทั้งหมดที่ออกโดย RemoteMediaClient
จะแสดงผล
RemoteMediaClient.MediaChannelResult
ผ่าน
PendingResult
Callback ซึ่งสามารถใช้เพื่อติดตามความคืบหน้าและผลลัพธ์สุดท้ายของ
อีกครั้ง
RemoteMediaPlayer
เวอร์ชัน 2 จะส่งการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงในสื่อ
สถานะของโปรแกรมเล่นบนเว็บรีซีฟเวอร์ผ่าน
RemoteMediaPlayer.OnStatusUpdatedListener
ใน CAF RemoteMediaClient
จะให้ Callback ที่เทียบเท่ากันผ่าน
RemoteMediaClient.Listener
ของ Google ผู้ฟังทุกคนสามารถลงทะเบียนกับ
RemoteMediaClient
ซึ่งช่วยให้คอมโพเนนต์ของผู้ส่งหลายรายแชร์
อินสแตนซ์เดียวของ RemoteMediaClient
ที่เชื่อมโยงกับเซสชัน
ในเวอร์ชัน 2 แอปพลิเคชันของผู้ส่งต้องรับภาระในการรักษาผู้ใช้ ซิงค์ข้อมูลกับสถานะของมีเดียเพลเยอร์บนตัวรับเว็บ
ใน CAF คลาส
UIMediaController
จะรับผิดชอบในข้อนี้เกือบทั้งหมด
การวางซ้อนบทนำ
V2 ไม่มี UI การวางซ้อนเบื้องต้น
CAF แสดงมุมมองที่กำหนดเอง
IntroductoryOverlay
เพื่อไฮไลต์ปุ่ม "แคสต์" เมื่อแสดงต่อผู้ใช้เป็นครั้งแรก
มินิคอนโทรลเลอร์
ในเวอร์ชัน 2 คุณต้องใช้ตัวควบคุมขนาดเล็กในแอปผู้ส่งตั้งแต่ต้น
ใน 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();
}
ตัวควบคุมที่ขยาย
ในเวอร์ชัน 2 คุณต้องใช้ตัวควบคุมแบบขยายตั้งแต่ต้น แอปผู้ส่ง
CAF มีค่า
UIMediaController
ชั้นเรียน Helper ที่ทำให้คุณสามารถเรียนรู้
CAF เพิ่มวิดเจ็ตตัวควบคุมแบบขยายที่สร้างไว้ล่วงหน้า
ExpandedControllerActivity
ซึ่งคุณเพิ่มลงในแอปได้ง่ายๆ คุณไม่จำเป็นต้อง
ใช้ตัวควบคุมแบบขยายที่กำหนดเองโดยใช้ UIMediaController
โฟกัสอัตโนมัติ
ในเวอร์ชัน 2 คุณต้องใช้ MediaSessionCompat
เพื่อจัดการการโฟกัสเสียง
ใน CAF โฟกัสเสียงจะได้รับการจัดการโดยอัตโนมัติ
การบันทึกการแก้ไขข้อบกพร่อง
ใน CAF ไม่มีตัวเลือกการบันทึก
แอปตัวอย่าง
เรามี บทแนะนำ Codelab และ ตัวอย่างแอป ที่ใช้ CAF