2011-01-28 16 views
6

estoy tratando de poner el video como fondo de pantalla en vivo. Estoy usando un reproductor multimedia para eso. Puedo obtener SurfaceHolder y puedo darle ese soporte al reproductor multimedia. Pero no su trabajo para mí, me facilita siguiente excepciónvideo de Android como fondo de pantalla en vivo

LogCat Excepción Detalle

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

i si no dar soporte al reproductor multimedia que funciona, pero puedo escuchar sólo el audio. Vi una aplicación VideoLiveWallpaper, que establece el video como fondo de pantalla en vivo, por lo que puede ser posible, me puede estar perdiendo algo. Estoy pegando el código, cualquier ayuda en esto será apreciada.

Fragmento de código

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

cómo lo resuelve? –

+0

@ user593443 ¿ha sido capaz de resolver esto? Estoy luchando con eso, he abierto una recompensa. LISA http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

Respuesta

3

Mi conjetura es que el video Live Wallpaper actualmente en circulación está utilizando un enfoque totalmente diferente: la decodificación de los medios de comunicación de forma manual y dibujo cuadro por cuadro. No creo que se pueda abordar este problema usando su método simple; de ​​lo contrario, más personas ya lo habrían hecho.

que se supone que tiene esta referencia, pero por si acaso: http://forum.xda-developers.com/showthread.php?t=804720 La mención explícita de los diferentes formatos de vídeo me lleva a creer que el desarrollador está haciendo su propia decodificación ... Buena suerte, George

0

El el error suena como en algún lugar que haya establecido el atributo, KeepScreenOn. Podría estar en su manifiesto, el XML que define su diseño o en algún lugar de su código principal. Siga la salida de logcat para encontrarlo e intente eliminarlo.

+0

Creo que KeepScreenOn está implícito cuando se utiliza MediaPlayer y se puede eliminar utilizando mp.setScreenOnWhilePlaying (false); o videoHolder.setKeepScreenOn (falso); Sin embargo, ambos métodos con livewallpapers provocarán el error "Los fondos de pantalla no admiten mantener la pantalla activada". – stealthcopter

3

La razón de esto es que MediaPlayer llama al método setKeepScreenOn del SurfaceHolder que le está pasando. Se puede evitar esto mediante la creación de un SurfaceHolder encargo implementación de la clase y anular setKeepScreenOn así:

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

A continuación, cuando sólo se tendría que hacer un pequeño cambio en el código que envió anteriormente, es decir:

mp.setDisplay(new VideoSurfaceHolder(holder)); 

El problema que tendrá a continuación será que su video se reproducirá pero solo escuchará audio. Después de varias horas de jadeo de cabello atormentado, etc., se habrá dado cuenta de que, por la razón que sea, setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) no funcionará correctamente. Si lo llamas en Crear, funciona, pero superficie, etc ... nunca se llama, si lo llamas en Superficie, entonces es demasiado tarde. Todavía no he resuelto ese yo, pero los mantendré informados.

+0

ha sido capaz de resolver esto? Estoy luchando con ello, he abierto una recompensa http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

4

En lugar de utilizar **mediaPlayer.setDisplay(surfaceHolder)** puede utilizar **mediaPlayer.setSurface(surfaceHolder.getSurface())** ..

no dará ningún tipo de conflicto con el atributo KeepScreenOn.

NJOY .. :)

+0

¡¡Oh yesss !!! Eso funcionó dulcemente! –

+0

Esta debería ser la respuesta. Funciona, aunque no estoy seguro de por qué, ya que setSurface también termina llamando a setKeepScreenOn en SurfaceHolder llamando primero a updateSurfaceScreenOn en MediaPlayer. – Flyview

+0

En realidad, pensándolo bien, setKeepScreenOn nunca se llama ya que mSurfaceHolder se establece en nulo por setSurface. – Flyview

Cuestiones relacionadas