Vídeo de Android como fondo de pantalla en vivo

Estoy tratando de poner el video como un fondo de pantalla en vivo. Estoy usando reproductor multimedia para eso. Puedo conseguir SurfaceHolder y puedo darle ese titular al reproductor multimedia. Pero no está funcionando para mí, me da la siguiente excepción

Detalle de excepción de LogCat

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

Si no doy soporte al reproductor multimedia funciona, pero solo puedo escuchar audio. Vi una aplicación VideoLiveWallpaper, que establece el video como un fondo de pantalla en vivo, por lo que puede ser posible, puede ser que estoy 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(); } 

Mi conjetura es que el Video Live Wallpaper actualmente en circulación está utilizando un enfoque totalmente diferente: decodificar el medio de forma manual y dibujarlo cuadro por cuadro. No creo que este problema se puede abordar con su método simple – de lo contrario más personas ya lo han hecho.

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

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

No dará ningún tipo de conflictos con el atributo KeepScreenOn.

NJOY

La razón de esto está sucediendo es que MediaPlayer está llamando al método setKeepScreenOn del SurfaceHolder que está pasando a él. Puede evitar esto creando un SurfaceHolder personalizado implementando la clase y reemplazando setKeepScreenOn de esta manera:

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

Entonces, cuando sólo tendría que hacer un cambio menor al código que publicó anteriormente, es decir:

 mp.setDisplay(new VideoSurfaceHolder(holder)); 

El problema que va a tener a continuación va a ser que su vídeo se reproducirá, pero sólo se escucha el audio. Después de varias horas de tirón de pelo atormentado etc … usted se habría dado cuenta de que por cualquier razón setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) no funcionará correctamente. Si lo llaman en onCreate entonces funciona pero surfaceCreated etc … nunca se llama, si lo llaman en onSurfaceCreated entonces es demasiado tarde. Todavía no lo he resuelto, pero lo mantendré informado.

El error suena como en alguna parte que usted ha fijado el atributo, KeepScreenOn. Podría estar en su manifiesto, el xml que define su disposición o en alguna parte en su código principal. Siga la salida logcat para encontrarla e intente quitarla.

  • Live Wallpaper en modo de vista previa
  • Detectar evento táctil de botones de navegación dentro de un servicio con ventana
  • Detectar Haga clic en el botón "Establecer papel tapiz" en el selector de imágenes en vivo
  • Obtener el número de homescreens sin llamar a onoffsetschanged (para el fondo de pantalla)?
  • Choque del selector de Android LiveWallpaper
  • Android Live Wallpaper Tocar la jerarquía de eventos
  • ¿Cómo utilizar el feed de cámara en vivo como un fondo de actividad?
  • ¿Cómo puedo mostrar el fondo de pantalla en vivo del usuario como fondo en mi aplicación?
  • GL El ejemplo del papel pintado muestra solamente la pantalla verde en emulador, pero está trabajando en el dispositivo
  • Android Live Wallpaper prácticas de rendimiento y ahorro de la batería?
  • Llama cuando se hace clic en Wallpaper Wallpaper en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.