我正在尝试将视频作为动态壁纸。 我正在使用媒体播放器。我可以获得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();
}
答案 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输出找到它并尝试删除它。