2011-01-28 93 views
6

我正在嘗試將視頻視爲動態壁紙。 我正在使用媒體播放器。我可以獲得SurfaceHolder,並且可以將該持有者交給媒體播放器。 但它不是爲我工作,它給了我下面的異常Android視頻作爲動態壁紙

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

你是怎麼解決這個問題的? – 2013-01-10 10:19:54

+0

@ user593443你能解決這個問題嗎?我掙扎着,我已經開了一筆賞金。 LISA http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper – 2014-01-18 11:35:06

回答

3

我的猜測是,目前流通中的視頻動態壁紙是用完全不同的方法:手動解碼媒體繪製它逐幀。我不認爲這個問題可以用你簡單的方法解決 - 否則更多的人已經做到了。

我假設你有這樣的參考,但以防萬一:http://forum.xda-developers.com/showthread.php?t=804720 不同視頻格式的明確提及使我相信開發人員正在做自己的解碼... 祝你好運, 喬治

0

的錯誤聽起來像你設置了屬性KeepScreenOn。它可能在你的清單中,定義你的佈局的xml或者你的主代碼中的某個地方。按照logcat輸出找到它並嘗試刪除它。

+0

我相信KeepScreenOn在使用MediaPlayer時是隱含的,可以通過使用mp.setScreenOnWhilePlaying(false)來刪除;或videoHolder。setKeepScreenOn(假);然而,這兩種方法與活壁紙將導致「壁紙不支持保持屏幕」錯誤。 – stealthcopter 2011-11-14 22:15:57

3

發生這種情況的原因是MediaPlayer正在調用您傳遞給它的SurfaceHolder的setKeepScreenOn方法。您可以通過創建自定義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中調用它,那麼它永遠不會被調用,那就太遲了。還沒有自己解決,但我會保持你的發佈。

+0

你能解決這個問題嗎?我掙扎着,我已經打開了賞金http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper – 2014-01-18 11:34:17

4

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

它不會給任何形式的與屬性KeepScreenOn衝突。

NJOY .. :)