转换控件不会出现在V3中的状态栏和应用程序锁定中

时间:2016-10-17 08:09:55

标签: android

我正在我的应用程序中集成V3版本..启动转换的设备不会出现通知控件和应用程序锁定控件。如果我从其他设备连接,我可以看到控件..

我的演员提供者如下

 public class CastOptionsProvider implements OptionsProvider {
        public static final String CUSTOM_NAMESPACE = "urn:x-cast:com.test.cast.player";

    //    @Override
    //    public CastOptions getCastOptions(Context context) {
    //        List<String> supportedNamespaces = new ArrayList<>();
    //        supportedNamespaces.add(CUSTOM_NAMESPACE);
    //        CastOptions castOptions = new CastOptions.Builder()
    //                .setReceiverApplicationId(context.getString(R.string.app_id))
    //                .setSupportedNamespaces(supportedNamespaces)
    //                .build();
    //        return castOptions;
    //    }


        @Override
        public CastOptions getCastOptions(Context context) {
            List<String> supportedNamespaces = new ArrayList<>();
            supportedNamespaces.add(CUSTOM_NAMESPACE);

            NotificationOptions notificationOptions = new NotificationOptions.Builder()
                    .setActions(Arrays.asList(MediaIntentReceiver.ACTION_SKIP_NEXT,
                            MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
                            MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{1, 2})
                    .setTargetActivityClassName(CustomExpandedControlsActivity.class.getName())
                    .build();

            CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
                    .setImagePicker(new ImagePickerImpl())
                    .setNotificationOptions(notificationOptions)
                    .setExpandedControllerActivityClassName(CustomExpandedControlsActivity.class.getName())
                    .build();

            return new CastOptions.Builder()
                    .setReceiverApplicationId(context.getString(R.string.app_id))
                    //.setSupportedNamespaces(supportedNamespaces)
                    .setCastMediaOptions(mediaOptions)
                    .build();
        }

        @Override
        public List<SessionProvider> getAdditionalSessionProviders(Context appContext) {
            return null;
        }

        private static class ImagePickerImpl extends ImagePicker {

            @Override
            public WebImage onPickImage(MediaMetadata mediaMetadata, int type) {
                if ((mediaMetadata == null) || !mediaMetadata.hasImages()) {
                    return null;
                }
                List<WebImage> images = mediaMetadata.getImages();
                if (images.size() == 1) {
                    return images.get(0);
                } else {
                    if (type == ImagePicker.IMAGE_TYPE_MEDIA_ROUTE_CONTROLLER_DIALOG_BACKGROUND) {
                        return images.get(0);
                    } else {
                        return images.get(1);
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

可能有点晚来帮助你,但我会回答,以防其他人帮忙。我和这个问题搏斗了好几天。最后,问题变成了我们开发的自定义接收器应用程序,而不是Android应用程序。发件人应用程序(Android端)中播放控件的存在取决于在媒体命名空间(urn:x-cast:com.google.cast.media)中通过消息总线发送的消息中准确接收正确的有效负载。因此,如果您的接收器应用程序未提供所有正确的数据结构,或者以意外的顺序发送内容,则播放控件将不会显示在Android端。要对此进行调试,您需要比较应用程序中的日志以及不适用的日志。您可以通过为媒体命名空间频道添加侦听器来查看哪些消息将返回给Android发件人:

public static final String MEDIA_NAMESPACE = "urn:x-cast:com.google.cast.media";

private Cast.MessageReceivedCallback messageReceivedCallback = new Cast.MessageReceivedCallback() {
    @Override
    public void onMessageReceived(CastDevice castDevice, String namespace, String message) {
        Log.d(TAG, "Received message (" + namespace + "): " + message);
    }
};

castSession.setMessageReceivedCallbacks(MEDIA_NAMESPACE, messageReceivedCallback);

就我而言,有两个问题。接收器应用程序没有以正确的格式发送音量,我们也没有发送一个初始的ID&#39;包含所有正确媒体信息的消息。与预期的消息格式的任何偏差都可能导致发送方的解析错误破坏正常流。如果发生这种情况,您在开始投射时将无法看到加载的媒体或播放控件的任何信息。发出的第一条消息似乎总是一个空闲的消息。消息,它在我们的应用程序中看起来像这样:

{
   "type":"MEDIA_STATUS",
   "status":[
      {
         "mediaSessionId":1,
         "playbackRate":1,
         "playerState":"IDLE",
         "currentTime":0,
         "supportedMediaCommands":15,
         "volume":{
            "level":1,
            "muted":false
         },
         "media":{
            "contentId":"http://your.server/movie.mp4",
            "streamType":"BUFFERED",
            "contentType":"application/x-mpegurl",
            "metadata":{
               "metadataType":1,
               "images":[
                  {
                     "url":"http://your.server/some.jpg",
                     "width":200,
                     "height":200
                  }
               ],
               "title":"The Movie",
               "subtitle":"The Thing Worth Watching"
            },
            "duration":0,
            "customData":{
               "description":"A very cool movie that you will probably want to see."
            }
         },
         "currentItemId":1,
         "extendedStatus":{
            "playerState":"LOADING",
            "media":{
               "contentId":"http://your.server/movie.mp4",
               "streamType":"BUFFERED",
               "contentType":"application/x-mpegurl",
               "metadata":{
                  "metadataType":1,
                  "images":[
                     {
                        "url":"http://your.server/some.jpg",
                        "width":200,
                        "height":200
                     }
                  ],
                  "title":"The Movie",
                  "subtitle":"The Thing Worth Watching"
               },
               "duration":0,
               "customData":{
                  "description":"A very cool movie that you will probably want to see."
               }
            }
         },
         "repeatMode":"REPEAT_OFF"
      }
   ],
   "requestId":0
}

您的应用可能无法提供所有相同的数据,因此您的消息看起来会有所不同,但您应该确保所需的所有字段都在那里,并且具有正确的成员和数据类型。