【问题标题】:Chromecast Sender v2.7.0 lockscreen imageChromecast Sender v2.7.0 锁屏图片
【发布时间】:2016-12-09 16:23:02
【问题描述】:

我们如何为运行v2.7.0chromecast sender 应用程序显示锁屏插图。我花了大约 2 天的时间来解决这个问题,但没有任何解决办法。

v2.7.0 库目前在VideoCastManager.java 类中有如下方法:

private void setBitmapForLockScreen(MediaInfo video) {
    if (video == null || mMediaSessionCompat == null) {
        return;
    }
    Uri imgUrl = null;
    Bitmap bm = null;
    List<WebImage> images = video.getMetadata().getImages();
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
        if (images.size() > 1) {
            imgUrl = images.get(1).getUrl();
        } else if (images.size() == 1) {
            imgUrl = images.get(0).getUrl();
        } else if (mContext != null) {
            // we don't have a url for image so get a placeholder image from resources
            bm = BitmapFactory.decodeResource(mContext.getResources(),
                    R.drawable.album_art_placeholder_large);
        }
    } else if (!images.isEmpty()) {
        imgUrl = images.get(0).getUrl();
    } else {
        // we don't have a url for image so get a placeholder image from resources
        bm = BitmapFactory.decodeResource(mContext.getResources(),
                R.drawable.album_art_placeholder);
    }
    if (bm != null) {
        MediaMetadataCompat currentMetadata = mMediaSessionCompat.getController().getMetadata();
        MediaMetadataCompat.Builder newBuilder = currentMetadata == null
                ? new MediaMetadataCompat.Builder()
                : new MediaMetadataCompat.Builder(currentMetadata);
        mMediaSessionCompat.setMetadata(newBuilder
                .putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bm)
                .build());
    } else {
        if (mLockScreenFetchTask != null) {
            mLockScreenFetchTask.cancel(true);
        }
        mLockScreenFetchTask = new FetchBitmapTask() {
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                if (mMediaSessionCompat != null) {
                    MediaMetadataCompat currentMetadata = mMediaSessionCompat.getController()
                            .getMetadata();
                    MediaMetadataCompat.Builder newBuilder = currentMetadata == null
                            ? new MediaMetadataCompat.Builder()
                            : new MediaMetadataCompat.Builder(currentMetadata);
                    mMediaSessionCompat.setMetadata(newBuilder
                            .putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap)
                            .build());
                }
                mLockScreenFetchTask = null;
            }
        };
        mLockScreenFetchTask.execute(imgUrl);
    }
}

我尝试将album_art_placeholder_large drawable 与我自己的自定义图像交换,但没有结果。还尝试通过以下行添加位图:

putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bm)

但没有任何效果。我到底在这里想念什么?需要使用什么MediaMetadataCompat 键来显示锁屏图稿? 还是我从错误的地方开始?

我尝试了其他一些链接但无济于事:

Android MediaMetadata image on lockscreen is zoomed

Adding more fields in MediaMetada GoogleCast

截至目前,网上的文档非常糟糕,并没有太大帮助。

谢谢!

编辑:经过进一步调查,锁定设备后似乎需要 15-20 分钟才能显示锁屏图像。不知道为什么。

编辑 2:setupMediaSession 方法。

private void setUpMediaSession(final MediaInfo info) {
        if (!isFeatureEnabled(CastConfiguration.FEATURE_LOCKSCREEN)) {
            return;
        }
        if (mMediaSessionCompat == null) {
            ComponentName mediaEventReceiver = new ComponentName(mContext,
                    VideoIntentReceiver.class.getName());
            mMediaSessionCompat = new MediaSessionCompat(mContext, "TAG", mediaEventReceiver,
                    null);
            mMediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
                    | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
            mMediaSessionCompat.setActive(true);
            mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
                @Override
                public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
                    KeyEvent keyEvent = mediaButtonIntent
                            .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                    if (keyEvent != null && (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PAUSE
                            || keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY)) {
                        toggle();
                    }
                    return true;
                }

                @Override
                public void onPlay() {
                    toggle();
                }

                @Override
                public void onPause() {
                    toggle();
                }

                private void toggle() {
                    try {
                        togglePlayback();
                    } catch (CastException | TransientNetworkDisconnectionException |
                        NoConnectionException e) {
                        LOGE(TAG, "MediaSessionCompat.Callback(): Failed to toggle playback", e);
                    }
                }
            });
        }

        mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC,
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);

        PendingIntent pi = getCastControllerPendingIntent();
        if (pi != null) {
            mMediaSessionCompat.setSessionActivity(pi);
        }
        if (info == null) {
            mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder()
                .setState(PlaybackStateCompat.STATE_NONE, 0, 1.0f).build());
        } else {
            mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder()
                .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1.0f)
                .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE).build());
        }

        // Update the media session's image
        updateLockScreenImage(info);

        // update the media session's metadata
        updateMediaSessionMetadata();

        mMediaRouter.setMediaSessionCompat(mMediaSessionCompat);
    }

【问题讨论】:

  • 你在哪里打电话给mMediaSessionCompat.setActive(true)
  • @ianhanniballake 在 setupMediaSession 方法中。我按原样使用默认的 2.7.0 库。我已经用上述方法更新了问题。

标签: java android chromecast google-cast


【解决方案1】:

您在定义 MediaInfo 时是否定义了“更大”的专辑封面? CCL 假设您有一个较小的,设置为 index=0,它将用于通知和迷你控制器和媒体路由器控制器对话框,以及一个较大的(MediaInfo 中的第二个图像,索引=1)将用于锁屏和全屏遥控器。如果这些图像存在,CCL 会自动使用它们。作为测试,运行 CastVideos-android (v2) 并查看它是否适合您。

【讨论】:

  • 我们是在讨论 setBitmapForLockScreen 方法中的 getMetaData().getImages() 调用吗?我正在调试该方法,显然网络图像列表返回为 0。但是,扩展控件、通知、迷你控制器都显示正确的图像
  • 要添加,即使图像为空,查看逻辑实现它仍然应该拾取默认的 album_art_placeholder_large 并显示如果没有其他可用的,不是吗?
  • 按照我的建议,请尝试 CastVideos-v2 看看是否存在此问题。
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2018-02-09
  • 2014-05-14
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多