2016-10-17 29 views
0

アプリでV3バージョンを統合しています。キャストを開始したデバイスの通知コントロールとアプリロックコントロールが表示されません。私は他のデバイスから接続する場合、私はあなたを助けるためにおそらく少し遅れキャストコントロールがステータスバーに表示されず、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

を次のように

マイキャストプロバイダが..ですコントロールを見ることができましたが、私は場合には、これは他の人を助けお答えします。私はこの問題を数日間取り組んだ。結局のところ、問題は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); 

私の場合、2つの問題がありました。レシーバアプリはボリュームを正しい形式で送信していないため、すべての正しいメディア情報を含む最初の「IDLE」メッセージを送信していませんでした。予期されたメッセージ形式からの逸脱があれば、正常なフローを壊す送信側で解析エラーが発生する可能性があります。その場合、キャストを開始するときに、読み込まれたメディアや再生コントロールの情報は表示されません。送り出された最初のメッセージは、常に「IDLE」というメッセージであるように思われ、それが私たちのアプリで次のようになります。

{ 
    "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 
} 

あなたのメッセージはビットを見ていきますので、あなたのアプリが、同じデータのすべてを提供していない可能性があります異なるが、必要なフィールドがすべて存在し、正しいメンバーとデータ型を持つことを確認する必要があります。

+0

私は、メディア名前空間の監視に副作用があることも発見しました。再生コントロールを使用したダイアログでは、メディアがロードされていないことがわかり、コントロールが表示されず、通知とロック画面に再生コントロールが動作していました。メディア名前空間のコールバックを登録していないと、この問題が修正されたようです。メディアネームスペース自体を監視していたのか、それとも1つ以上のネームスペースを監視していたのかはわかりませんが、再生コントロールに問題があるかどうかは分かりません。 –

関連する問題