2011-01-28 4 views
6

Я пытаюсь разместить видео в качестве живых обоев. Я использую медиаплеер для этого. я могу получить SurfaceHolder, и я могу дать этому держателю медиаплеер. Но это не работает для меня, его дает мне следующее исключениеAndroid-видео как живые обои

LogCat Exception Деталь

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

если я не дают обладателю в медиа-плеер он работает, но я могу слышать только звук. Я видел одно приложение VideoLiveWallpaper, которое установило видео как живые обои, так что это может быть возможно, может быть, я что-то упустил. Я вставляю код, любая помощь по этому поводу будет оценена.

Код сниппета

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

как вы решаете это? –

+0

@ user593443 Вы могли решить это? Я борюсь с этим, я открыл щедрость. LISA http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

ответ

3

Я думаю, что Video Live Wallpaper в настоящее время в обращении использует совершенно иной подход: декодирование медиа вручную и рисунок его покадрово. Я не думаю, что эту проблему можно решить с помощью вашего простого метода - иначе больше людей уже это сделали бы.

Я предполагаю, что у вас есть эта ссылка, но только в том случае: http://forum.xda-developers.com/showthread.php?t=804720 Явное упоминание о отличаясь видеоформаты заставляет меня верить, разработчик делает свою собственную расшифровку ... Удачи, Джордж

0

ошибка звучит так, как если бы вы установили атрибут KeepScreenOn. Это может быть в вашем манифесте, xml, определяющем ваш макет или где-то в вашем основном коде. Следуйте за выходом logcat, чтобы найти его и попробуйте удалить его.

+0

Я считаю, что KeepScreenOn подразумевается при использовании MediaPlayer и может быть удален с помощью mp.setScreenOnWhilePlaying (false); или videoHolder.setKeepScreenOn (ложь); Однако оба этих метода с livewallpapers приведут к ошибке «Обои не поддерживают сохранение экрана». – stealthcopter

3

Причина, по которой это происходит, заключается в том, что MediaPlayer вызывает метод setKeepScreenOn SurfaceHolder, который вы передаете ему. Вы можете обойти эту проблему путем создания пользовательского SurfaceHolder реализации класса и переопределить setKeepScreenOn как это:

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

Тогда, когда вы только должны внести незначительные изменения в код, который вы публикуемые выше, а именно:

mp.setDisplay(new VideoSurfaceHolder(holder)); 

Проблема, которая будет у вас следующей, будет заключаться в том, что ваше видео будет воспроизводиться, но вы услышите только звук. После нескольких часов мучительных вытягиваний волос и т. Д. Вы бы поняли, что по какой-то причине setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) не будет работать должным образом. Если вы вызываете его в onCreate, то он работает, но surfaceCreated и т. Д. Никогда не вызывается, если вы вызываете его в onSurfaceCreated, то уже слишком поздно. Я еще этого не решил, но я буду держать вас в курсе.

+0

Вы смогли это решить? Я борюсь с этим, я открыл щедрость http://stackoverflow.com/questions/6129593/videoview-in-a-live-wallpaper –

4

Вместо использования **mediaPlayer.setDisplay(surfaceHolder)** вы можете использовать **mediaPlayer.setSurface(surfaceHolder.getSurface())** ..

Он не даст каких-либо конфликтов с атрибутом KeepScreenOn.

NJOY .. :)

+0

О, да! Это сработало сладко !!! –

+0

Это должен быть ответ. Он работает, хотя я не уверен, почему, поскольку setSurface также заканчивает вызов setKeepScreenOn в SurfaceHolder, сначала вызвав updateSurfaceScreenOn в MediaPlayer. – Flyview

+0

На самом деле, с другой стороны, setKeepScreenOn никогда не вызывается, поскольку mSurfaceHolder имеет значение null, заданное setSurface. – Flyview

Смежные вопросы