7

我正在尝试将视频作为动态壁纸。我为此使用媒体播放器。我可以得到 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();
 }
4

4 回答 4

5

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

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

NJOY.. :)

于 2013-04-25T07:08:39.617 回答
3

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

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

于 2011-03-17T19:39:00.977 回答
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 中调用它,那么为时已晚。我自己还没有解决这个问题,但我会及时通知你。

于 2012-03-09T23:15:47.357 回答
0

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

于 2011-03-17T19:42:38.320 回答