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
- Rotación de pantalla de pantalla en vivo
- OnTouch no funciona en Live Wallpaper
- Android 3D Live Wallpaper - ¿qué motor utilizar?
- Obtener un error en WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER
- ¿Mejor velocidad de cuadro que dibuja los mapas de bits en una lona?
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(); }
- Cómo hacer Animated Android Live Wallpaper?
- Cómo crear un Android Live Wallpaper con Delphi XE5?
- Elegir el fondo para Live Wallpaper
- Hardware acelerado FFmpeg en android?
- Cómo implementar doble toque para Android wallpapers vivos?
- Android: ¿Cómo iniciar la actividad desde el menú de preferencias?
- Imágenes en vivo de Android - OpenGL vs Canvas
- Cómo crear una actividad de configuración para Android Live Wallpaper
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.
- Mejores prácticas de Android para las comunicaciones Fragmento a Actividad
- GetLayoutInflater vs LayoutInflater.from