Chromecast。 CastRemoteDisplayLocalService 不调用 onCreate Presentation
Chromcast. CastRemoteDisplayLocalService doesn't call onCreatePresentation
我使用显示实时视频流的应用程序。我希望该应用程序能够在 chromcast 上流式传输视频。我无法使用 cast method because I have to change headers on fly(for security, and I didn't find how I can do it). So I had to refuse this method and I decided to try remote display method 将我的视频投射到 GlSurfaceView 上。但是我遇到了 CastRemoteDisplayLocalService 没有调用 onCreatePresentation,所以我的 CastPresentation 没有创建。
根据日志,PresentationService 创建,但不调用 onCreatePresentation,我不明白为什么。当我停止流式传输时,它还会调用 onDismissPresentation。
日志:
onRouteSelected COOL Chromecast
CHROMECAST PresentationService onCreate
CHROMECAST onServiceCreated
//I stop streaming
onRouteUnselected COOL Chromecast
CHROMECAST onDismissPresentation
MediaRouterCallback.java
public class MediaRouterCallback extends MediaRouter.Callback {
public static final String TAG = MediaRouterCallback.class.getName();
private CastDevice mSelectedDevice;
private FragmentActivity activity;
private Context mContext;
public MediaRouterCallback(FragmentActivity activity, Context context){
this.activity = activity;
mContext = context;
}
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) {
Log.d(TAG, "onRouteSelected " + info.getName());
Intent intent = new Intent(mContext,
activity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(
mContext, 0, intent, 0);
CastRemoteDisplayLocalService.NotificationSettings settings =
new CastRemoteDisplayLocalService.NotificationSettings.Builder()
.setNotificationPendingIntent(notificationPendingIntent).build();
CastRemoteDisplayLocalService.startService(
CastApplication.getContext(),
PresentationService.class, CastApplication.sApplicationId,
mSelectedDevice, settings,
new CastRemoteDisplayLocalService.Callbacks() {
@Override
public void onServiceCreated(CastRemoteDisplayLocalService castRemoteDisplayLocalService) {
Log.d(TAG, "CHROMECAST onServiceCreated");
}
@Override
public void onRemoteDisplaySessionStarted(
CastRemoteDisplayLocalService service) {
Log.d(TAG, "CHROMECAST onRemoteDisplaySessionStarted");
}
@Override
public void onRemoteDisplaySessionError(
Status errorReason){
Log.d(TAG, "CHROMECAST onRemoteDisplaySessionError");
}
});
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info ) {
Log.d(TAG, "onRouteUnselected " + info.getName());
}
}
PresentationService.java
public class PresentationService extends CastRemoteDisplayLocalService {
public static final String TAG = PresentationService.class.getName();
FirstScreenPresentation mPresentation;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "CHROMECAST PresentationService onCreate" );
}
@Override
public void onCreatePresentation(Display display) {
Log.d(TAG, "CHROMECAST onCreatePresentation");
createPresentation(display);
}
@Override
public void onDismissPresentation() {
Log.d(TAG, "CHROMECAST onDismissPresentation");
dismissPresentation();
}
private void dismissPresentation() {
if (mPresentation != null) {
mPresentation.dismiss();
mPresentation = null;
}
}
private void createPresentation(Display display) {
dismissPresentation();
mPresentation = new FirstScreenPresentation(this, display);
try {
mPresentation.show();
} catch (WindowManager.InvalidDisplayException ex) {
Log.e(TAG, "CHROMECAST Unable to show presentation, display was " +
"removed.", ex);
dismissPresentation();
}
}
}
FirstScreenPresentation.java
public class FirstScreenPresentation extends CastPresentation {
private GLSurfaceView mFirstScreenSurfaceView;
public FirstScreenPresentation(Context context,
Display display) {
super(context, display);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_screen_layout);
mFirstScreenSurfaceView = (GLSurfaceView)
findViewById(R.id.gl_surface_view);
mFirstScreenSurfaceView.setRenderer(new ClearRenderer());
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Do nothing special.
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
gl.glClearColor(1.0f, 0f, 0f, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
public void setColor(float r, float g, float b) {
mRed = r;
mGreen = g;
mBlue = b;
}
private float mRed = 1.0f;
private float mGreen;
private float mBlue;
}
}
问题是我选错演员表id
我使用显示实时视频流的应用程序。我希望该应用程序能够在 chromcast 上流式传输视频。我无法使用 cast method because I have to change headers on fly(for security, and I didn't find how I can do it). So I had to refuse this method and I decided to try remote display method 将我的视频投射到 GlSurfaceView 上。但是我遇到了 CastRemoteDisplayLocalService 没有调用 onCreatePresentation,所以我的 CastPresentation 没有创建。 根据日志,PresentationService 创建,但不调用 onCreatePresentation,我不明白为什么。当我停止流式传输时,它还会调用 onDismissPresentation。
日志:
onRouteSelected COOL Chromecast
CHROMECAST PresentationService onCreate
CHROMECAST onServiceCreated
//I stop streaming
onRouteUnselected COOL Chromecast
CHROMECAST onDismissPresentation
MediaRouterCallback.java
public class MediaRouterCallback extends MediaRouter.Callback {
public static final String TAG = MediaRouterCallback.class.getName();
private CastDevice mSelectedDevice;
private FragmentActivity activity;
private Context mContext;
public MediaRouterCallback(FragmentActivity activity, Context context){
this.activity = activity;
mContext = context;
}
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) {
Log.d(TAG, "onRouteSelected " + info.getName());
Intent intent = new Intent(mContext,
activity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent notificationPendingIntent = PendingIntent.getActivity(
mContext, 0, intent, 0);
CastRemoteDisplayLocalService.NotificationSettings settings =
new CastRemoteDisplayLocalService.NotificationSettings.Builder()
.setNotificationPendingIntent(notificationPendingIntent).build();
CastRemoteDisplayLocalService.startService(
CastApplication.getContext(),
PresentationService.class, CastApplication.sApplicationId,
mSelectedDevice, settings,
new CastRemoteDisplayLocalService.Callbacks() {
@Override
public void onServiceCreated(CastRemoteDisplayLocalService castRemoteDisplayLocalService) {
Log.d(TAG, "CHROMECAST onServiceCreated");
}
@Override
public void onRemoteDisplaySessionStarted(
CastRemoteDisplayLocalService service) {
Log.d(TAG, "CHROMECAST onRemoteDisplaySessionStarted");
}
@Override
public void onRemoteDisplaySessionError(
Status errorReason){
Log.d(TAG, "CHROMECAST onRemoteDisplaySessionError");
}
});
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info ) {
Log.d(TAG, "onRouteUnselected " + info.getName());
}
}
PresentationService.java
public class PresentationService extends CastRemoteDisplayLocalService {
public static final String TAG = PresentationService.class.getName();
FirstScreenPresentation mPresentation;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "CHROMECAST PresentationService onCreate" );
}
@Override
public void onCreatePresentation(Display display) {
Log.d(TAG, "CHROMECAST onCreatePresentation");
createPresentation(display);
}
@Override
public void onDismissPresentation() {
Log.d(TAG, "CHROMECAST onDismissPresentation");
dismissPresentation();
}
private void dismissPresentation() {
if (mPresentation != null) {
mPresentation.dismiss();
mPresentation = null;
}
}
private void createPresentation(Display display) {
dismissPresentation();
mPresentation = new FirstScreenPresentation(this, display);
try {
mPresentation.show();
} catch (WindowManager.InvalidDisplayException ex) {
Log.e(TAG, "CHROMECAST Unable to show presentation, display was " +
"removed.", ex);
dismissPresentation();
}
}
}
FirstScreenPresentation.java
public class FirstScreenPresentation extends CastPresentation {
private GLSurfaceView mFirstScreenSurfaceView;
public FirstScreenPresentation(Context context,
Display display) {
super(context, display);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_screen_layout);
mFirstScreenSurfaceView = (GLSurfaceView)
findViewById(R.id.gl_surface_view);
mFirstScreenSurfaceView.setRenderer(new ClearRenderer());
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Do nothing special.
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
gl.glClearColor(1.0f, 0f, 0f, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
public void setColor(float r, float g, float b) {
mRed = r;
mGreen = g;
mBlue = b;
}
private float mRed = 1.0f;
private float mGreen;
private float mBlue;
}
}
问题是我选错演员表id