Ich arbeite mit App, die Live-Video-Steams anzeigen. Und ich möchte, dass die App Video auf Chromacast streamen kann. Ich kann nicht cast method verwenden, weil ich Header auf Fliege ändern muss (für Sicherheit, und ich fand nicht, wie ich es tun kann). Also musste ich diese Methode ablehnen und entschied mich, remote display method auszuprobieren, um mein Video auf GlSurfaceView zu übertragen. Aber ich habe damit konfrontiert, dass CastRemoteDisplayLocalService onCreatePresentation nicht aufruft, sodass meine CastPresentation nicht erstellt wird. Laut Protokollen erstellt PresentationService, aber nicht auf CreatePresentation aufrufen und ich verstehe nicht warum. Außerdem ruft es onDismissPresentation auf, wenn ich mit dem Streaming aufhöre.Chromcast. CastRemoteDisplayLocalService ruft onCreatePresentation nicht auf
Logs:
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;
}
}
können Sie Probe von Chromcast teilen. CastRemoteDisplayLocalService – user3563954