@Override public void onCreate(){ registerReceiver(button,new IntentFilter(MEDIA_ACTION)); mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE); try { mediaSessionManager.addOnActiveSessionsChangedListener(sessionListener, componentName); List<MediaController> controllers = mediaSessionManager.getActiveSessions(componentName); mediaController = pickController(controllers); if (mediaController != null) { mediaController.registerCallback(callback); meta = mediaController.getMetadata(); updateMetadata(); } online = true; } catch (SecurityException e) { } }
@Override public int onStartCommand(Intent i, int startId, int i2){ if(mediaController==null){ try { List<MediaController> controllers = mediaSessionManager.getActiveSessions(componentName); mediaController = pickController(controllers); if (mediaController != null) { mediaController.registerCallback(callback); meta = mediaController.getMetadata(); updateMetadata(); } } catch (SecurityException e) { } } return START_STICKY; }
static List<MediaAppEntry> getMediaAppsFromControllers( Collection<MediaController> controllers, PackageManager packageManager) { final List<MediaAppEntry> mediaApps = new ArrayList<>(); for (final MediaController controller : controllers) { String packageName = controller.getPackageName(); ApplicationInfo info; try { info = packageManager.getApplicationInfo(packageName, 0); } catch (NameNotFoundException e) { // This should not happen. If we get a media session for a package, then the // package must be installed on the device. Log.e(TAG, "Unable to load package details", e); continue; } final Drawable icon = info.loadIcon(packageManager); final String name = info.loadLabel(packageManager).toString(); mediaApps.add(MediaAppEntry.fromSessionToken( controller.getSessionToken(), name, packageName, icon )); } return mediaApps; }
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.startsWith("player.")) { final String packageName = key.substring(7); if (sharedPreferences.getBoolean(key, true)) { Log.d(TAG, "Player enabled, re-registering callbacks"); onActiveSessionsChanged(mediaControllers); } else { Log.d(TAG, "Player disabled, stopping any current tracking"); final Optional<MediaController> optionalController = Iterables.tryFind( mediaControllers, input -> input.getPackageName().equals(packageName)); if (optionalController.isPresent() && controllerCallbacks.containsKey(optionalController.get())) { MediaController controller = optionalController.get(); controller.unregisterCallback(controllerCallbacks.get(controller)); playbackTracker.handleSessionTermination(controller.getPackageName()); controllerCallbacks.remove(controller); } } } }
@Override public View getView(int position, View convertView, ViewGroup parent) { MediaBrowser.MediaItem item = getItem(position); int itemState = MediaItemViewHolder.STATE_NONE; if (item.isPlayable()) { itemState = MediaItemViewHolder.STATE_PLAYABLE; MediaController controller = ((Activity) getContext()).getMediaController(); if (controller != null && controller.getMetadata() != null) { String currentPlaying = controller.getMetadata().getDescription().getMediaId(); String musicId = MediaIDHelper.extractMusicIDFromMediaID( item.getDescription().getMediaId()); if (currentPlaying != null && currentPlaying.equals(musicId)) { PlaybackState pbState = controller.getPlaybackState(); if (pbState == null || pbState.getState() == PlaybackState.STATE_ERROR) { itemState = MediaItemViewHolder.STATE_NONE; } else if (pbState.getState() == PlaybackState.STATE_PLAYING) { itemState = MediaItemViewHolder.STATE_PLAYING; } else { itemState = MediaItemViewHolder.STATE_PAUSED; } } } } return MediaItemViewHolder.setupView((Activity) getContext(), convertView, parent, item.getDescription(), itemState); }
/** * Check if the MediaSession is active and in a "playback-able" state * (not NONE and not STOPPED). * * @return true if the MediaSession's state requires playback controls to be visible. */ protected boolean shouldShowControls() { MediaController mediaController = getMediaController(); if (mediaController == null || mediaController.getMetadata() == null || mediaController.getPlaybackState() == null) { return false; } switch (mediaController.getPlaybackState().getState()) { case PlaybackState.STATE_ERROR: case PlaybackState.STATE_NONE: case PlaybackState.STATE_STOPPED: return false; default: return true; } }
private void connectToSession(MediaSession.Token token) { MediaController mediaController = new MediaController(this, token); setMediaController(mediaController); mediaController.registerCallback(mMediaControllerCallback); if (shouldShowControls()) { showPlaybackControls(); } else { LogHelper.d(TAG, "connectionCallback.onConnected: " + "hiding controls because metadata is null"); hidePlaybackControls(); } if (mControlsFragment != null) { mControlsFragment.onConnected(); } onMediaControllerConnected(); }
private void connectToSession(MediaSession.Token token) { MediaController mediaController = new MediaController(FullScreenPlayerActivity.this, token); if (mediaController.getMetadata() == null) { finish(); return; } setMediaController(mediaController); mediaController.registerCallback(mCallback); PlaybackState state = mediaController.getPlaybackState(); updatePlaybackState(state); MediaMetadata metadata = mediaController.getMetadata(); if (metadata != null) { updateMediaDescription(metadata.getDescription()); updateDuration(metadata); } updateProgress(); if (state != null && (state.getState() == PlaybackState.STATE_PLAYING || state.getState() == PlaybackState.STATE_BUFFERING)) { scheduleSeekbarUpdate(); } }
private void checkForUserVisibleErrors(boolean forceError) { boolean showError = forceError; // If offline, message is about the lack of connectivity: if (!NetworkHelper.isOnline(getActivity())) { mErrorMessage.setText(R.string.error_no_connection); showError = true; } else { // otherwise, if state is ERROR and metadata!=null, use playback state error message: MediaController controller = getActivity().getMediaController(); if (controller != null && controller.getMetadata() != null && controller.getPlaybackState().getState() == PlaybackState.STATE_ERROR && controller.getPlaybackState().getErrorMessage() != null) { mErrorMessage.setText(controller.getPlaybackState().getErrorMessage()); showError = true; } else if (forceError) { // Finally, if the caller requested to show error, show a generic message: mErrorMessage.setText(R.string.error_loading_media); showError = true; } } mErrorView.setVisibility(showError ? View.VISIBLE : View.GONE); LogHelper.d(TAG, "checkForUserVisibleErrors. forceError=", forceError, " showError=", showError, " isOnline=", NetworkHelper.isOnline(getActivity())); }
@Override public View getView(int position, View convertView, ViewGroup parent) { MediaBrowser.MediaItem item = getItem(position); int state = MediaItemViewHolder.STATE_NONE; if (item.isPlayable()) { state = MediaItemViewHolder.STATE_PLAYABLE; MediaController controller = ((Activity) getContext()).getMediaController(); if (controller != null && controller.getMetadata() != null) { String currentPlaying = controller.getMetadata().getDescription().getMediaId(); String musicId = MediaIDHelper.extractMusicIDFromMediaID( item.getDescription().getMediaId()); if (currentPlaying != null && currentPlaying.equals(musicId)) { if (controller.getPlaybackState().getState() == PlaybackState.STATE_PLAYING) { state = MediaItemViewHolder.STATE_PLAYING; } else if (controller.getPlaybackState().getState() != PlaybackState.STATE_ERROR) { state = MediaItemViewHolder.STATE_PAUSED; } } } } return MediaItemViewHolder.setupView((Activity) getContext(), convertView, parent, item.getDescription(), state); }
@Override public void onActiveSessionsChanged(List<MediaController> controllers) { MediaController2Lollipop p = mMediaControllerRef.get(); if (p == null) return; if (p.mMediaController != null) { for (MediaController controller : controllers) { if (p.mMediaController == controller) { // Current media controller is still alive. return; } } } MediaController mc = pickBestMediaController(controllers); if (mc != null) { p.setMediaController(mc); } else { p.clearMediaController(true); } }
@Override public void run(@NonNull MediaController2 mc) { final MediaController2Lollipop mcl = (MediaController2Lollipop) mc; final MediaController source = mcl.mMediaController; if (source != null && mToken.equals(source.getSessionToken())) { long now = SystemClock.elapsedRealtime(); final MediaMetadata metadata = source.getMetadata(); final PlaybackState playbackState = source.getPlaybackState(); long delta = SystemClock.elapsedRealtime() - now; Log.i(TAG, "Got the new metadata & playback state in " + delta + " millis. " + "The media controller is " + source.getPackageName()); mHandler.post(new Runnable() { @Override public void run() { mcl.updateMetadata(metadata); mcl.updatePlaybackState(playbackState); } }); } }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private void answerUsingMediaServer() { Timber.d("Answering using media server method..."); MediaSessionManager mediaSessionManager = (MediaSessionManager) getCallModule().getService().getSystemService(Context.MEDIA_SESSION_SERVICE); try { List<MediaController> mediaControllerList = mediaSessionManager.getActiveSessions (new ComponentName(getCallModule().getService(), JellybeanNotificationListener.class)); for (MediaController m : mediaControllerList) { if ("com.android.server.telecom".equals(m.getPackageName())) { Timber.d("Found telephony media controller!"); m.dispatchMediaButtonEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK)); break; } } } catch (SecurityException e) { Timber.e("Notification service not running!"); } }
private MediaController pickController(List<MediaController> controllers){ for(int i=0;i<controllers.size();i++){ MediaController mc = controllers.get(i); if(mc!=null&&mc.getPlaybackState()!=null&& mc.getPlaybackState().getState()==PlaybackState.STATE_PLAYING){ return mc; } } if(controllers.size()>0) return controllers.get(0); return null; }
@Override public void onActiveSessionsChanged(List<MediaController> controllers) { mediaController = pickController(controllers); if(mediaController==null)return; mediaController.registerCallback(callback); meta = mediaController.getMetadata(); updateMetadata(); }
@Override public void onCreate(){ registerReceiver(button,new IntentFilter(StandardWidget.WIDGET_ACTION)); mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE); mediaSessionManager.addOnActiveSessionsChangedListener(sessionListener, componentName); List<MediaController> controllers = mediaSessionManager.getActiveSessions(componentName); mediaController = pickController(controllers); if(mediaController!=null) { mediaController.registerCallback(callback); meta = mediaController.getMetadata(); updateMetadata(); } online = true; sendBroadcast(new Intent(StandardWidget.WIDGET_UPDATE)); }
@Override public int onStartCommand(Intent i, int startId, int i2){ if(mediaController==null){ List<MediaController> controllers = mediaSessionManager.getActiveSessions(componentName); mediaController = pickController(controllers); if(mediaController!=null) { mediaController.registerCallback(callback); meta = mediaController.getMetadata(); updateMetadata(); } sendBroadcast(new Intent(StandardWidget.WIDGET_UPDATE)); } return START_STICKY; }
@Override public void onActiveSessionsChanged(List<MediaController> controllers) { mediaController = pickController(controllers); if(mediaController==null)return; mediaController.registerCallback(callback); meta = mediaController.getMetadata(); updateMetadata(); sendBroadcast(new Intent(StandardWidget.WIDGET_UPDATE)); }
public static List<Object> getQueue(Object controllerObj) { List<QueueItem> queue = ((MediaController) controllerObj).getQueue(); if (queue == null) { return null; } return new ArrayList(queue); }
public void sync() { mDevice.enableNotify(mediaCommandsCharac, commandsListener); try { mMediaSessionManager = (MediaSessionManager) mCtx.getSystemService(Context.MEDIA_SESSION_SERVICE); List<MediaController> controllers = mMediaSessionManager.getActiveSessions(new ComponentName(mCtx, NLService.class)); onActiveSessionsChanged(controllers); mMediaSessionManager.addOnActiveSessionsChangedListener(this, new ComponentName(mCtx, NLService.class)); } catch (SecurityException e) { Log.w("MediaService", "No Notification Access"); } }
@Override public void onActiveSessionsChanged(List<MediaController> controllers) { if (controllers.size() > 0) { if (mMediaController != null) { if (!controllers.get(0).getSessionToken().equals(mMediaController.getSessionToken())) { // Detach current controller mMediaController.unregisterCallback(mMediaCallback); Log.d("MediaService", "MediaController removed"); mMediaController = null; // Attach new controller mMediaController = controllers.get(0); mMediaController.registerCallback(mMediaCallback); mMediaCallback.onMetadataChanged(mMediaController.getMetadata()); if(mMediaController.getPlaybackState() != null) mMediaCallback.onPlaybackStateChanged(mMediaController.getPlaybackState()); Log.d("MediaService", "MediaController set: " + mMediaController.getPackageName()); } } else { // Attach new controller mMediaController = controllers.get(0); mMediaController.registerCallback(mMediaCallback); mMediaCallback.onMetadataChanged(mMediaController.getMetadata()); if(mMediaController.getPlaybackState() != null) mMediaCallback.onPlaybackStateChanged(mMediaController.getPlaybackState()); Log.d("MediaService", "MediaController set: " + mMediaController.getPackageName()); } } else { byte[] data = new byte[]{0}; mDevice.write(mediaArtistCharac, data, MediaService.this); mDevice.write(mediaAlbumCharac, data, MediaService.this); mDevice.write(mediaTitleCharac, data, MediaService.this); } }
private void initializeMediaSession(String mediaSessionTag) { mMediaSession = new MediaSession(mActivity, mediaSessionTag); mMediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); mNowPlayingCardWidth = mActivity.getResources() .getDimensionPixelSize(R.dimen.notif_card_img_max_width); mNowPlayingCardHeight = mActivity.getResources() .getDimensionPixelSize(R.dimen.notif_card_img_height); mMediaSession.setCallback(new MediaSessionCallback()); mActivity.setMediaController( new MediaController(mActivity, mMediaSession.getSessionToken())); updateMediaSessionPlaybackState(); }
@Override public void onCreate() { ScroballApplication application = (ScroballApplication) getApplication(); sharedPreferences = application.getSharedPreferences(); ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); ScroballDB scroballDB = application.getScroballDB(); ScrobbleNotificationManager scrobbleNotificationManager = new ScrobbleNotificationManager(this, sharedPreferences); LastfmClient lastfmClient = application.getLastfmClient(); Scrobbler scrobbler = new Scrobbler(lastfmClient, scrobbleNotificationManager, scroballDB, connectivityManager); playbackTracker = new PlaybackTracker(scrobbleNotificationManager, scrobbler); Log.d(TAG, "NotificationListenerService started"); MediaSessionManager mediaSessionManager = (MediaSessionManager) getApplicationContext().getSystemService(Context.MEDIA_SESSION_SERVICE); ComponentName componentName = new ComponentName(this, this.getClass()); mediaSessionManager.addOnActiveSessionsChangedListener(this, componentName); NetworkStateReceiver networkStateReceiver = new NetworkStateReceiver(scrobbler); IntentFilter filter = new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION); this.registerReceiver(networkStateReceiver, filter); // Trigger change event with existing set of sessions. List<MediaController> initialSessions = mediaSessionManager.getActiveSessions(componentName); onActiveSessionsChanged(initialSessions); sharedPreferences.registerOnSharedPreferenceChangeListener(this); }
@Override public void onConnected() { LogHelper.d(TAG, "onConnected: session token ", mMediaBrowser.getSessionToken()); MediaController mediaController = new MediaController( TvVerticalGridActivity.this, mMediaBrowser.getSessionToken()); setMediaController(mediaController); browse(); }
@Override public void onConnected() { LogHelper.d(TAG, "onConnected: session token ", mMediaBrowser.getSessionToken()); MediaController mediaController = new MediaController( TvBrowseActivity.this, mMediaBrowser.getSessionToken()); setMediaController(mediaController); navigateToBrowser(mMediaId); }
@Override public void onMetadataChanged(MediaMetadata metadata) { if (metadata != null) { MediaController mediaController = getActivity().getMediaController(); long activeQueueId; if (mediaController.getPlaybackState() == null) { activeQueueId = QueueItem.UNKNOWN_ID; } else { activeQueueId = mediaController.getPlaybackState().getActiveQueueItemId(); } updateNowPlayingList(mediaController.getQueue(), activeQueueId); mRowsAdapter.notifyArrayItemRangeChanged(0, mRowsAdapter.size()); } }
@Override public void onQueueChanged(List<QueueItem> queue) { // queue has changed somehow MediaController mediaController = getActivity().getMediaController(); long activeQueueId; if (mediaController.getPlaybackState() == null) { activeQueueId = QueueItem.UNKNOWN_ID; } else { activeQueueId = mediaController.getPlaybackState().getActiveQueueItemId(); } updateNowPlayingList(queue, activeQueueId); mRowsAdapter.notifyArrayItemRangeChanged(0, mRowsAdapter.size()); }