11

Ho un problema nell'esecuzione di un video in Samsung S3 (Android 4.1.1), il problema sembra essere dovuto al fatto che la videoview si trova su un frammento perché se la inserisco e l'attività, lavori. Inoltre ho scoperto che se accendo l'accelerazione hardware della GPU, il video funziona. Ho anche un gioco creato disegnando su un SurfaceView e quella vista non funziona bene (solo con GPU su) ... Il resto del contenuto dell'app viene visualizzato come previsto (pulsanti e altri layout).VideoView non è visualizzato su un frammento

Ho testato l'applicazione su Nexus S e sull'emulatore e funziona benissimo, anche su altri dispositivi ..

Qualcuno sa che il problema potrebbe essere? Grazie!

Ed ecco il codice:

public class VideoFragment extends Fragment implements MediaPlayer.OnCompletionListener, 
     MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener { 

    private Video mVideo; 
    private VideoView mVideoView; 
    // The video position 
    private int mPosition; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View fragmentView = inflater.inflate(R.layout.screen_video, container, false); 

     mVideoView = (VideoView) fragmentView.findViewById(R.id.VideoView); 

     return fragmentView; 
    } 


    @Override 
    public void onPause() { 
     super.onPause(); 

     // Pause the video if it is playing 
     if (mVideoView.isPlaying()) { 
      mVideoView.pause(); 
     } 

     // Save the current video position 
     mPosition = mVideoView.getCurrentPosition(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     mVideoView.setOnCompletionListener(this); 
     mVideoView.setOnPreparedListener(this); 
     mVideoView.setOnErrorListener(this); 
     mVideoView.setKeepScreenOn(true); 

     // Initialize the media controller 
     MediaController mediaController = new MediaController(getActivity()); 
     mediaController.setMediaPlayer(mVideoView); 
     // Set-up the video view 
     mVideoView.setMediaController(mediaController); 
     mVideoView.requestFocus(); 
     mVideoView.setVideoPath(mVideo.getUrl()); 

     if (mVideoView != null) { 
      // Restore the video position 
      mVideoView.seekTo(mPosition); 
      mVideoView.requestFocus(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     // Clean-up 
     if (mVideoView != null) { 
      mVideoView.stopPlayback(); 
      mVideoView = null; 
     } 
    } 

    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     Log.e("VIDEO PLAY", "end video play"); 
    } 

    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     // Start the video view 
     mediaPlayer.start(); 
     Log.e("VIDEO PLAY", "video ready for playback"); 
    } 

    @Override 
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { 
     Log.e("VIDEO PLAY", "error: " + i); 
     return true; 
    } 

} 

non credo che sia qualcosa legato al contesto (Application o Attività) .. perché su tutti gli altri dispositivi vengono visualizzati il ​​video e giochi .. Grazie per l'aiuto!

+0

Si prega di inviare il Frammento e il codice di layout che si riferisce alla VideoView. Senza questo, difficile dire cosa non va. –

+0

Aggiunto anche il codice, scusa .. il fatto è che io uso questa classe Frammento video e un gioco che è in realtà un SurfaceView e disegno su quella superficie quindi non penso che questo sia collegato al mio codice .. se gli schermi correre su un'attività quindi entrambi funzionano bene ..Grazie per l'aiuto – Cata

risposta

1

Se l'accelerazione hardware consente di risolvere il problema, allora lo farei enable it for that view/window su quel dispositivo.

In generale ho trovato che quando il codice funziona su un dispositivo ma non un altro è in genere causata da uno dei seguenti problemi:

  1. Bug in applicazione API del produttore
  2. diversa interpretazione della API da parte del fabbricante
  3. problema
  4. concorrenza (ad esempio condizione di competizione, la sincronizzazione non corretta) nel proprio codice che accade per innescare più frequentemente su un particolare dispositivo

Per quanto posso dire, sembra che tu stia utilizzando il thread UI in modo appropriato, quindi immagino che il tuo problema ricada in una delle prime due categorie e dovrai solo aggirare il problema.

+0

Ciao e grazie per la tua risposta. Ho pensato che i punti 1 o 2 potessero essere il mio caso ... Ho pensato anche che forse qualcuno potrebbe avere gli stessi problemi e avere una soluzione .. finora questa è la migliore risposta e la accetterò come risposta – Cata

4

Ho un problema simile, e ho risolto cambiando:

MediaController mediaController = new MediaController(getActivity().getApplicationContext()); 

a questo (In un frammento da):

MediaController mediaController = new MediaController(getActivity()); 

Spero che questo aiuti, ...

EDIT

Guarda questa classe

http://code.google.com/p/sinaweibo-honeycomb/source/browse/branches/sinaweibo-merged/src/com/lenovo/dll/SinaWeibo/VideoFragment.java?r=71

+0

Ciao, grazie per il commento, utilizzo già gatActivity() .. Penso che sia qualcosa correlato a Fragment e SurfaceView perché penso che video e giochi abbiano questa visione in comune .. – Cata

0

Sposta MediaController mediaController = new MediaController(getActivity()) da onResume() a onCreateView.

Problemi correlati