【问题标题】:Android video as a live wallpaperAndroid 视频作为动态壁纸
【发布时间】:2011-01-28 07:36:25
【问题描述】:

我正在尝试将视频作为动态壁纸。 我为此使用媒体播放器。我可以得到 SurfaceHolder,我可以把那个支架交给媒体播放器。 但它对我不起作用,它给了我以下例外

LogCat 异常详情

ERROR/AndroidRuntime(302): java.lang.UnsupportedOperationException: Wallpapers do not support keep screen on

如果我不给媒体播放器提供支架,它可以工作,但我只能听到音频。 我看到一个应用程序 VideoLiveWallpaper ,它将视频设置为动态壁纸,所以它是可能的,可能是我错过了一些东西。我正在粘贴代码,对此的任何帮助将不胜感激。

代码片段

public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub

 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  mp=MediaPlayer.create(getApplicationContext(), R.raw.sample);
  mp.setDisplay(holder);
  mp.start();
 }

【问题讨论】:

标签: android live-wallpaper


【解决方案1】:

你可以使用**mediaPlayer.setSurface(surfaceHolder.getSurface())**,而不是**mediaPlayer.setDisplay(surfaceHolder)**..

它不会与属性 KeepScreenOn 产生任何冲突。

NJOY.. :)

【讨论】:

  • 这应该是答案。它可以工作,虽然我不知道为什么,因为 setSurface 最终也会通过首先在 MediaPlayer 中调用 updateSurfaceScreenOn 来调用 SurfaceHolder 中的 setKeepScreenOn。
  • 实际上再三考虑,setKeepScreenOn 从未被调用,因为 mSurfaceHolder 被 setSurface 设置为 null。
【解决方案2】:

我的猜测是,目前流通的视频动态壁纸使用了一种完全不同的方法:手动解码媒体并逐帧绘制。我不认为这个问题可以用你的简单方法来解决——否则已经有更多的人这样做了。

我假设你有这个参考,但以防万一:http://forum.xda-developers.com/showthread.php?t=804720 明确提到不同的视频格式让我相信开发人员正在做他自己的解码...... 祝你好运, 乔治

【讨论】:

    【解决方案3】:

    发生这种情况的原因是 MediaPlayer 正在调用您传递给它的 SurfaceHolder 的 setKeepScreenOn 方法。您可以通过创建自定义 SurfaceHolder 实现 Class 并覆盖 setKeepScreenOn 来解决此问题,如下所示:

    package com.justinbuser.videolivewallpapers;
    
    import android.graphics.Canvas;
    import android.graphics.Rect;
    import android.view.Surface;
    import android.view.SurfaceHolder;
    
    public class VideoSurfaceHolder implements SurfaceHolder {
    
        private SurfaceHolder surfaceHolder;
    
        public VideoSurfaceHolder(SurfaceHolder holder) {
            surfaceHolder = holder;
        }
    
        @Override
        public void addCallback(Callback callback) {
            surfaceHolder.addCallback(callback);
        }
    
        @Override
        public Surface getSurface() {
            return surfaceHolder.getSurface();
        }
    
        @Override
        public Rect getSurfaceFrame() {
            return surfaceHolder.getSurfaceFrame();
        }
    
        @Override
        public boolean isCreating() {
            return surfaceHolder.isCreating();
        }
    
        @Override
        public Canvas lockCanvas() {
            return surfaceHolder.lockCanvas();
        }
    
        @Override
        public Canvas lockCanvas(Rect dirty) {
            return surfaceHolder.lockCanvas(dirty);
        }
    
        @Override
        public void removeCallback(Callback callback) {
            surfaceHolder.removeCallback(callback);
        }
    
        @Override
        public void setFixedSize(int width, int height) {
            surfaceHolder.getSurface().setSize(width, height);
            surfaceHolder.setSizeFromLayout();
        }
    
        @Override
        public void setFormat(int format) {
            surfaceHolder.setFormat(format);
        }
    
        @Override
        public void setSizeFromLayout() {
            surfaceHolder.setSizeFromLayout();
        }
    
        @Override
        public void setType(int type) {
            surfaceHolder.setType(SURFACE_TYPE_PUSH_BUFFERS);
        }
    
        @Override
        public void setKeepScreenOn(boolean bool){
            //do nothing
        }
    
        @Override
        public void unlockCanvasAndPost(Canvas canvas) {
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
    

    那么当您只需要对上面发布的代码进行微小更改时,即:

    mp.setDisplay(new VideoSurfaceHolder(holder));
    

    接下来您将遇到的问题是您的视频会播放,但您只会听到音频。经过几个小时的头发拉扯等……您会意识到无论出于何种原因 setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) 都无法正常工作。如果你在 onCreate 中调用它,那么它可以工作,但 surfaceCreated 等......永远不会被调用,如果你在 onSurfaceCreated 中调用它,那么为时已晚。我自己还没有解决这个问题,但我会及时通知你。

    【讨论】:

    【解决方案4】:

    该错误听起来像是您在某处设置了属性 KeepScreenOn。它可能在您的清单、定义布局的 xml 或主代码中的某处。按照 logcat 输出找到它并尝试将其删除。

    【讨论】:

    • 我相信 KeepScreenOn 在使用 MediaPlayer 时是隐含的,可以使用 mp.setScreenOnWhilePlaying(false);或 videoHolder.setKeepScreenOn(false);然而,这两种使用动态壁纸的方法都会导致“壁纸不支持保持屏幕开启”错误。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多