Android视频作为动态壁纸

时间:2011-01-28 07:36:25

标签: android live-wallpaper

我正在尝试将视频作为动态壁纸。 我正在使用媒体播放器。我可以获得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 个答案:

答案 0 :(得分:4)

您可以使用**mediaPlayer.setDisplay(surfaceHolder)** ..

,而不是使用**mediaPlayer.setSurface(surfaceHolder.getSurface())**

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

NJOY ..:)

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

发生这种情况的原因是MediaPlayer正在调用您传递给它的SurfaceHolder的setKeepScreenOn方法。你可以通过创建一个实现Class的自定义SurfaceHolder并覆盖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中调用它那么为时已晚。我自己还没解决过那个,但我会告诉你。

答案 3 :(得分:0)

错误听起来就像您设置了属性KeepScreenOn。它可以在您的清单中,xml定义您的布局或主代码中的某个位置。按照logcat输出找到它并尝试删除它。