2011-01-28 4 views
6

J'essaie de mettre la vidéo comme un fond d'écran en direct. J'utilise un lecteur multimédia pour ça. Je peux obtenir SurfaceHolder et je peux donner ce titulaire au lecteur multimédia. Mais sa ne fonctionne pas pour moi, me donner son exception suivantevidéo Android comme un live wallpaper

LogCat Exception Détail

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

si je ne donne pas titulaire au lecteur multimédia il fonctionne, mais je peux entendre audio uniquement. J'ai vu une application VideoLiveWallpaper, qui définit la vidéo comme un fond d'écran en direct, de sorte qu'il peut être possible, peut-être qu'il me manque quelque chose. Je colle le code, toute aide à ce sujet sera appréciée.

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

comment vous résoudre ce problème? –

+0

@ user593443 avez-vous été en mesure de résoudre ce problème? Je me bats avec, j'ai ouvert une prime. LISA http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

Répondre

3

Je pense que le fond d'écran vidéo en direct actuellement en circulation utilise une approche totalement différente: le décodage des médias manuellement et le dessin image par image. Je ne pense pas que ce problème puisse être résolu en utilisant votre méthode simple - sinon plus de gens l'auraient déjà fait.

Je suppose que vous avez cette référence, mais juste au cas où: http://forum.xda-developers.com/showthread.php?t=804720 La mention explicite des différents formats vidéo me porte à croire que le développeur est en train de faire son propre décodage ... Bonne chance, George

0

Le erreur sonne comme si vous avez défini l'attribut KeepScreenOn. Cela pourrait être dans votre manifeste, le xml définissant votre mise en page ou quelque part dans votre code principal. Suivez la sortie logcat pour le trouver et essayez de le supprimer.

+0

Je crois que KeepScreenOn est impliqué dans l'utilisation de MediaPlayer et peut être supprimé en utilisant mp.setScreenOnWhilePlaying (false); ou videoHolder.setKeepScreenOn (faux); Cependant, ces deux méthodes avec livewallpapers mèneront à l'erreur "Les fonds d'écran ne supportent pas l'écran". – stealthcopter

3

La raison pour laquelle cela se produit est que MediaPlayer appelle la méthode setKeepScreenOn du SurfaceHolder que vous lui passez. Vous pouvez contourner ce problème en créant une SurfaceHolder personnalisée mise en œuvre de classe et passer outre setKeepScreenOn comme ceci:

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

Puis, quand vous ne devez faire un changement mineur au code affiché ci-dessus, à savoir:

mp.setDisplay(new VideoSurfaceHolder(holder)); 

Le problème que vous rencontrerez ensuite sera que votre vidéo sera lue mais vous n'entendrez que l'audio. Après plusieurs heures d'extraction de cheveux tourmentés etc ... vous auriez réalisé que pour une raison quelconque, setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ne fonctionnera pas correctement. Si vous l'appelez dans onCreate alors ça marche mais surfaceCreated etc ... ne sera jamais appelé, si vous l'appelez sur onSurfaceCreated alors c'est trop tard. Je n'ai pas encore résolu celui-là mais je vous tiendrai au courant.

+0

avez-vous été en mesure de résoudre ce problème? Je me bats avec elle, j'ai ouvert une prime http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

4

Au lieu d'utiliser **mediaPlayer.setDisplay(surfaceHolder)** vous pouvez utiliser **mediaPlayer.setSurface(surfaceHolder.getSurface())** ..

Il ne donnera aucune sorte de conflit avec l'attribut KeepScreenOn.

NJOY .. :)

+0

Oh yesss !!! Cela a fonctionné doucement! –

+0

Cela devrait être la réponse. Cela fonctionne, bien que je ne sache pas pourquoi, car setSurface finit par appeler setKeepScreenOn dans SurfaceHolder en appelant d'abord updateSurfaceScreenOn dans MediaPlayer. – Flyview

+0

En fait, à la réflexion, setKeepScreenOn n'est jamais appelé car mSurfaceHolder est défini sur null par setSurface. – Flyview