11

Ich habe ein Problem beim Ausführen eines Videos in Samsung S3 (Android 4.1.1), das Problem scheint zu sein, weil die Videowiedergabe auf einem Fragment ist, weil, wenn ich es auf und Aktivität, es funktioniert. Auch ich habe herausgefunden, dass, wenn ich die GPU-Hardwarebeschleunigung einschalte, das Video funktioniert. Ich habe auch ein Spiel gemacht, indem ich auf einer SurfaceView gezeichnet habe und diese Ansicht funktioniert nicht so gut (nur mit GPU an) ... Der Rest des App-Inhalts wird so angezeigt, wie er soll (Schaltflächen und andere Layouts).VideoView wird nicht auf einem Fragment angezeigt

ich die App auf Nexus S getestet und auf dem Emulator und es funktioniert gut, auch auf anderen Geräten ..

Wer weiß, was das Problem sein könnte? Vielen Dank!

Und hier ist der Code:

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

} 

Ich glaube nicht, dass es etwas zu Kontext (Anwendung oder Aktivität) .. da auf allen anderen Geräten das Video und die Spiele werden angezeigt .. Dank Zusammenhang ist für die Hilfe!

+0

Bitte geben Sie den Fragment- und Layoutcode ein, der sich auf den VideoView bezieht. Ohne das ist es schwer zu sagen, was falsch läuft. –

+0

Hinzugefügt den Code auch, sorry .. die Sache ist, dass ich diese Video Fragment Klasse und ein Spiel, das ist eigentlich eine SurfaceView und ich zeichne auf dieser Oberfläche, so dass ich glaube nicht, dass dies mit meinem Code verwandt ist .. wenn die Bildschirme auf einer Aktivität laufen dann beide gut funktionieren ..Danke für die Hilfe – Cata

Antwort

1

Wenn Hardwarebeschleunigung behebt das Problem dann würde ich enable it for that view/window auf diesem Gerät.

Im Allgemeinen habe ich festgestellt, dass, wenn Code funktioniert auf einem Gerät, aber nicht eine andere es wird in der Regel durch eine der folgenden Probleme verursacht:

  1. Fehler in der Implementierung API des Herstellers
  2. Unterschiedliche Auslegung der API vom Hersteller
  3. Concurrency Problem (zB race-Bedingung, falsche Synchronisation) in Ihrem eigenen Code, der häufiger auf einem bestimmten Gerät
auszulösen geschieht 10

Soweit ich Ihnen sagen kann, scheinen Sie den UI-Thread entsprechend zu verwenden, also würde ich mir vorstellen, dass Ihr Problem in eine der ersten beiden Kategorien fällt und Sie es nur umgehen müssen.

+0

Hallo und vielen Dank für Ihre Antwort. Ich dachte, dass Punkt 1 oder 2 mein Fall sein könnte .. Ich dachte auch, dass vielleicht jemand die gleichen Probleme haben könnte und eine Lösung hatte .. bis jetzt ist das die beste Antwort und ich werde es als Antwort akzeptieren – Cata

4

Ich habe ein ähnliches Problem, und ich löste es zu ändern:

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

dazu (in fragmet):

MediaController mediaController = new MediaController(getActivity()); 

hoffe, das hilft, ...

EDIT

Schauen Sie sich diese Klasse

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

+0

Hallo, danke für den Kommentar, ich benutze bereits gatActivity() .. Ich denke, es ist etwas mit Fragment und SurfaceView, weil ich denke, Video und Spiel hat diese Ansicht gemeinsam .. – Cata

0

Verschieben MediaController mediaController = new MediaController(getActivity()) von onResume() zu onCreateView.

Verwandte Themen