2016-05-16 14 views
1

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; 
} 

} 

Antwort

2

Problem war, dass ich falsche Besetzung hatte id

+0

können Sie Probe von Chromcast teilen. CastRemoteDisplayLocalService – user3563954