簡體   English   中英

Android視頻作為動態壁紙

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM