2016-07-08 12 views
1

Chromecastを制御するアプリなどで再生しているアプリで作業しています。Android:Chromecastで現在の再生メディアを入手しますか?

私は送信者アプリを望んでいません。私はAPIキーを取得するために何も登録したくない、そのものはありません。

私はこれまでボリュームを制御し、何かに接続しているかどうかを確認するためにMediaRouterを使用しています。

しかし、私は、Googleのキャストアプリのようなものとします

Google Cast android

再生状態を再生しているものを知っていると(あるいは少なくとも)。

私はGoogleプレイサービスを使いたくないのが理想ですが、それが唯一の方法だとしたら、私はあなたと結びついています。

答えて

3

私はついにそれを理解しました。私は、アプリケーションを登録せずに、Googleの再生サービスとGoogleのキャストSDKのv2を使用しなければならなかった。

ライブラリは、プロジェクトに含ま:

compile 'com.android.support:mediarouter-v7:24.0.0' 
compile 'com.google.android.gms:play-services-cast-framework:9.2.0' 

は)のonCreate()とonDestroy(以下のコードでは、フラグメントまたはサービス活動のメソッドではないので、コピーしない/貼り付けることに注意してくださいコードと期待して動作します。これらのメソッドのコードは、独自のメソッドでコピー/貼り付けする必要があります。どちらかのChromecastは(それは誰もあればアクティブ動作しませんしているかどうかをチェックgetActiveMediaRoute()を呼び出すことによって、あなたはキャストボタンを経由する経路のいずれかを選択

  1. :ここ

    は何が起こっているかのステップでありますChromecastに接続されています)。 onRouteSelectedとき、あなたの好み
  2. に基づいて選択するために、メソッドまたはgetActiveChromecastRoute()をオーバーライドします()(onApplicationMetadataChangedときGoogleApiClientが選択Chromecastの
  3. ためのオプションでインスタンス化された新キャストと呼ばれている)のコードは、現在に接続されますと呼ばれていますアプリケーションが正常に接続された後、アプリケーションが新しいRemoteMediaPlayerがインスタンス化され、mediaStatusはあなたがonStatusUpdated(でコールバックを取得する必要があります
  4. を要求された)、その後、あなたがmRemoteMediaPlayer.getMediaStatusを(呼び出すことができます)、それは意志のChromecast
  5. 上で実行されていますChromecastで再生されているコンテンツに関するデータが含まれています。

public static final String CHROMECAST_SIGNATURE = "cast.media.CastMediaRouteProviderService"; 

private final MediaRouteSelector mSelector; 
private final MediaRouter mMediaRouter; 
private CastDevice mSelectedDevice; 
private Cast.Listener mCastClientListener; 
private RemoteMediaPlayer mRemoteMediaPlayer; 

@Override 
public void onCreate() { 
    mMediaRouter = MediaRouter.getInstance(context); 

    mSelector = new MediaRouteSelector.Builder() 
      // These are the framework-supported intents 
      .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO) 
      .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO) 
      .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) 
      .build(); 

    mMediaRouter.addCallback(mSelector, mMediaRouterCallback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY | MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS); 
} 

@Override 
public void onDestroy() { 
    mMediaRouter.removeCallback(mMediaRouterCallback); 
} 

@UiThread 
private boolean isChromecastActive() { 
    return getActiveChromecastRoute() != null; 
} 

@UiThread 
private Boolean isChromecastPlaying() { 
    if (mRemoteMediaPlayer == null || mRemoteMediaPlayer.getMediaStatus() == null) { 
     return null; 
    } 

    // Here you can get the playback status and the metadata for what's playing 
    // But only after the onStatusUpdated() method is called in the mRemoteMediaPlayer callback 
    int state = mRemoteMediaPlayer.getMediaStatus().getPlayerState(); 
    return (state == MediaStatus.PLAYER_STATE_BUFFERING || state == MediaStatus.PLAYER_STATE_PLAYING); 
} 

@UiThread 
private MediaRouter.RouteInfo getActiveChromecastRoute() { 
    for (MediaRouter.RouteInfo route : mMediaRouter.getRoutes()) { 
     if (isCastDevice(route)) { 
      if (route.getConnectionState() == MediaRouter.RouteInfo.CONNECTION_STATE_CONNECTED) { 
       return route; 
      } 
     } 
    } 

    return null; 
} 

private int getMediaRouteVolume(@NonNull MediaRouter.RouteInfo route) { 
    return route.getVolume(); 
} 

private void setMediaRouteVolume(@NonNull MediaRouter.RouteInfo route, int volume) { 
    route.requestSetVolume(volume); 
} 

private int getMediaRouteMaxVolume(@NonNull MediaRouter.RouteInfo route) { 
    return route.getVolumeMax(); 
} 

@UiThread 
private MediaRouter.RouteInfo getActiveMediaRoute() { 
    if (isChromecastActive()) { 
     MediaRouter.RouteInfo route = getActiveChromecastRoute(); 

     if (route != null) { 
      if (!route.isSelected()) { 
       mMediaRouter.selectRoute(route); 
      } 
     } 
     else if (mSelectedDevice != null) { 
      mSelectedDevice = null; 
     } 

     return route; 
    } 

    return null; 
} 

private boolean isCastDevice(MediaRouter.RouteInfo routeInfo) { 
    return routeInfo.getId().contains(CHROMECAST_SIGNATURE); 
} 

private MediaRouter.Callback mMediaRouterCallback = new MediaRouter.Callback() { 
    @Override 
    public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) { 
     if (isCastDevice(route)) { 
      Log.i("MediaRouter", "Chromecast found: " + route); 
     } 
    } 

    @Override 
    public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) { 
     if (isCastDevice(route)) { 
      Log.i("MediaRouter", "Chromecast changed: " + route); 
     } 
    } 

    @Override 
    public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) { 
     if (mSelectedDevice == null && isCastDevice(route)) { 
      Log.i("MediaRouter", "Chromecast selected: " + route); 

      mSelectedDevice = CastDevice.getFromBundle(route.getExtras()); 
      mCastClientListener = new Cast.Listener() { 
       @Override 
       public void onApplicationStatusChanged() { 
        Log.i("MediaRouter", "Cast.Listener.onApplicationStatusChanged()"); 
       } 

       @Override 
       public void onApplicationMetadataChanged(ApplicationMetadata applicationMetadata) { 
        Log.i("MediaRouter", "Cast.Listener.onApplicationMetadataChanged(" + applicationMetadata + ")"); 

        if (applicationMetadata != null) { 
         LaunchOptions launchOptions = new LaunchOptions.Builder().setRelaunchIfRunning(false).build(); 
         Cast.CastApi.launchApplication(mApiClient, applicationMetadata.getApplicationId(), launchOptions).setResultCallback(new ResultCallback<Cast.ApplicationConnectionResult>() { 
          @Override 
          public void onResult(@NonNull Cast.ApplicationConnectionResult applicationConnectionResult) { 
           Log.i("MediaRouter", "Cast.CastApi.joinApplication.onResult() " + applicationConnectionResult.getSessionId()); 

           mRemoteMediaPlayer = new RemoteMediaPlayer(); 
           mRemoteMediaPlayer.setOnStatusUpdatedListener(new RemoteMediaPlayer.OnStatusUpdatedListener() { 
            @Override 
            public void onStatusUpdated() { 
             MediaStatus mediaStatus = mRemoteMediaPlayer.getMediaStatus(); 
             Log.i("MediaRouter", "Remote media player status " + mediaStatus.getPlayerState()); 
             // TODO: you can call isChromecastPlaying() now 
            } 
           }); 

           try { 
            Cast.CastApi.setMessageReceivedCallbacks(mApiClient, mRemoteMediaPlayer.getNamespace(), mRemoteMediaPlayer); 
           } catch(IOException e) { 
            Log.e("MediaRouter", "Exception while creating media channel ", e); 
           } catch(NullPointerException e) { 
            Log.e("MediaRouter", "Something wasn't reinitialized for reconnectChannels", e); 
           } 


           mRemoteMediaPlayer.requestStatus(mApiClient).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() { 
            @Override 
            public void onResult(@NonNull RemoteMediaPlayer.MediaChannelResult mediaChannelResult) { 
             Log.i("MediaRouter", "requestStatus() " + mediaChannelResult); 
            } 
           }); 

           try { 
            Cast.CastApi.requestStatus(mApiClient); 
           } catch (IOException e) { 
            Log.e("MediaRouter", "Couldn't request status", e); 
           } 
          } 
         }); 
        } 
       } 

       @Override 
       public void onApplicationDisconnected(int i) { 
        Log.i("MediaRouter", "Cast.Listener.onApplicationDisconnected(" + i + ")"); 
       } 

       @Override 
       public void onActiveInputStateChanged(int i) { 
        Log.i("MediaRouter", "Cast.Listener.onActiveInputStateChanged(" + i + ")"); 
       } 

       @Override 
       public void onStandbyStateChanged(int i) { 
        Log.i("MediaRouter", "Cast.Listener.onStandbyStateChanged(" + i + ")"); 
       } 

       @Override 
       public void onVolumeChanged() { 
        Log.i("MediaRouter", "Cast.Listener.onVolumeChanged()"); 
       } 
      }; 

      Cast.CastOptions.Builder apiOptionsBuilder = new Cast.CastOptions.Builder(mSelectedDevice, mCastClientListener); 

      mApiClient = new GoogleApiClient.Builder(getContext()) 
        .addApi(Cast.API, apiOptionsBuilder.build()) 
        .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
         @Override 
         public void onConnected(@Nullable Bundle bundle) { 
          Log.i("MediaRouter", "GoogleApiClient.onConnected()"); 
          Log.i("MediaRouter", "Bundle " + bundle); 
         } 

         @Override 
         public void onConnectionSuspended(int i) { 
          Log.i("MediaRouter", "GoogleApiClient.onConnectionSuspended(" + i + ")"); 
         } 
        }) 
        .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
         @Override 
         public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
          Log.i("MediaRouter", "GoogleApiClient.onConnectionFailed()"); 
         } 
        }) 
        .build(); 

      mApiClient.connect(); 
     } 
     else { 
      mSelectedDevice = null; 
      mRemoteMediaPlayer = null; 
     } 
    } 

    @Override 
    public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo route) { 
     if (isCastDevice(route)) { 
      if (mSelectedDevice != null && mSelectedDevice.isSameDevice(CastDevice.getFromBundle(route.getExtras()))) { 
       mSelectedDevice = null; 
      } 
      Log.i("MediaRouter", "Chromecast lost: " + route); 
     } 
    } 
}; 
+0

このコードはhttps://www.binpress.com/tutorial/building-an-android-google-cast-sender-app/161に触発代わりのビデオを立ち上げたI mRemoteMediaPlayer.requestStatus(mApiClient)を呼び出さなければならなかった – Auras

関連する問題