[英]Android video as a 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();
}
而不是使用**mediaPlayer.setDisplay(surfaceHolder)**
你可以使用**mediaPlayer.setSurface(surfaceHolder.getSurface())**
..
它不會與KeepScreenOn屬性產生任何沖突。
NJOY .. :)
我的猜測是,目前流通的視頻動態壁紙采用了一種完全不同的方法:手動解碼媒體並逐幀繪制。 我不認為使用您的簡單方法可以解決這個問題 - 否則更多的人會已經做到了。
我假設你有這個參考,但以防萬一: http : //forum.xda-developers.com/showthread.php?t = 804720明確提到不同的視頻格式讓我相信開發人員正在進行自己的解碼。祝你好運,喬治
發生這種情況的原因是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中調用它那么為時已晚。 我自己還沒解決過那個,但我會告訴你。
這個錯誤聽起來就像你設置了屬性KeepScreenOn。 它可以在您的清單中,xml定義您的布局或主代碼中的某個位置。 按照logcat輸出找到它並嘗試刪除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.