2011-01-28 5 views
6

Próbuję umieścić wideo jako tapetę na żywo. Używam do tego odtwarzacza multimedialnego. Mogę zdobyć SurfaceHolder i mogę dać tego posiadacza odtwarzaczowi multimedialnemu. Ale jej nie działa na mnie, jego dając mnie następujący wyjątekFilm z Androidem jako tapeta na żywo

LogCat wyjątkiem detal

ERROR/AndroidRuntime(302): java.lang.UnsupportedOperationException: Wallpapers do not support keep screen on 

jeśli ja nie daję uchwyt do odtwarzacza multimedialnego to działa, ale ja słyszę tylko dźwięk. Widziałem jedną aplikację VideoLiveWallpaper, która ustawiła wideo jako tapetę na żywo, więc może być możliwe, może być coś, czego mi brakuje. Wklejam kod, każda pomoc na ten temat będzie doceniona.

Code Snippet

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

jak rozwiązać ten problem? –

+0

@ user593443 Czy byłeś w stanie rozwiązać ten problem? Walczę z tym, otworzyłem nagrodę. LISA http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

Odpowiedz

3

Domyślam się, że wideo na żywo Tapety aktualnie w obiegu stosuje całkowicie odmienne podejście: ręcznie dekodowania multimediów i rysunek to klatka po klatce. Nie sądzę, że ten problem można rozwiązać za pomocą prostej metody - w przeciwnym razie więcej osób już by to zrobiło.

Zakładam, że masz to odniesienie, ale na wszelki wypadek: http://forum.xda-developers.com/showthread.php?t=804720 Wyraźna wzmianka o odmiennych formatów wideo, pozwala mi wierzyć, deweloper robi swoje własne dekodowanie ... Powodzenia George

0

błąd brzmi jak gdzieś ustawiłeś atrybut, KeepScreenOn. Może być w twoim manifeście, xml definiującym twój układ lub gdzieś w twoim głównym kodzie. Śledź wynik logcat, aby go znaleźć i spróbuj go usunąć.

+0

Wierzę, że KeepScreenOn jest dorozumiany podczas korzystania z MediaPlayer i można go usunąć za pomocą mp.setScreenOnWhilePlaying (false); lub wideoHolder.setKeepScreenOn (false); Jednak obie te metody z livewallpapers doprowadzą do błędu "Tapety nie obsługują ekranu". – stealthcopter

3

Powodem tego jest to, że MediaPlayer wywołuje metodę setKeepScreenOn z SurfaceHolder, który do niej przechodzisz. Można obejść ten problem poprzez stworzenie niestandardowego SurfaceHolder wykonawczych klasy i zastąpić setKeepScreenOn tak:

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); 
    } 
} 

następnie, gdy trzeba tylko dokonać drobnych zmian w kodzie zamieszczonych powyżej, czyli:

mp.setDisplay(new VideoSurfaceHolder(holder)); 

Problemem, który będzie następować, będzie to, że wideo będzie odtwarzane, ale usłyszysz tylko dźwięk. Po kilku godzinach udręczonego ciągnięcia włosów itd. ... zdajesz sobie sprawę, że z jakiegokolwiek powodu setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) nie będzie działać poprawnie. Jeśli wywołasz to w onCreate, to działa, ale surfaceCreated etc ... nigdy nie zostanie wywołany, jeśli wywołasz go na SurfaceFreated, wtedy jest już za późno. Nie rozwiązałem jeszcze tego, ale będę Cię informował.

+0

Czy byłeś w stanie rozwiązać ten problem? Walczę z tym, otworzyłem nagrodę http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

4

Zamiast **mediaPlayer.setDisplay(surfaceHolder)** można użyć **mediaPlayer.setSurface(surfaceHolder.getSurface())** ..

Nie da jakichkolwiek konfliktów z atrybutem KeepScreenOn.

NJOY .. :)

+0

Oh yesss !!! To działało słodko !!! –

+0

To powinna być odpowiedź. Działa, chociaż nie jestem pewien dlaczego, ponieważ setSurface kończy również wywoływanie setKeepScreenOn w SurfaceHolder przez pierwsze wywołanie updateSurfaceScreenOn w MediaPlayer. – Flyview

+0

Właściwie od dłuższego czasu setKeepScreenOn nigdy nie jest wywoływany jako mSurfaceHolder jest ustawiony na null przez setSurface. – Flyview