Me pregunto si puedo conseguir una manera de dejar de vídeo se ejecutan a través de videoview en pantalla completa?

He buscado mucho y trató de muchas maneras, tales como:

  1. Aplicar tema en un manifiesto:

    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

    pero que no fuerza el vídeo a pantalla completa.

  2. Aplicar en la actividad en sí misma:

    requestWindowFeature(Window.FEATURE_NO_TITLE);  
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

    también no forzar el vídeo a pantalla completa.

La única manera de que la fuerza de vídeo a pantalla completa es:

<VideoView android:id="@+id/myvideoview"
    android:layout_width="fill_parent"
    android:layout_alignParentRight="true"
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentBottom="true" 
    android:layout_height="fill_parent"> 
</VideoView> 

De esta manera que los resultados en pantalla completa de vídeo pero se extiende el vídeo en sí (alargada de vídeo) ,

Yo no soy la aplicación de este inadecuada solución a mi videoview, así es que hay alguna forma de hacerlo sin tener que estirar el video?

Vídeo De La Clase:

public class Video extends Activity {
    private VideoView myvid;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        myvid = (VideoView) findViewById(R.id.myvideoview);
        myvid.setVideoURI(Uri.parse("android.resource://" + getPackageName() 
            +"/"+R.raw.video_1));
        myvid.setMediaController(new MediaController(this));
        myvid.requestFocus();
        myvid.start();
    }
}

main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <VideoView
        android:id="@+id/myvideoview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>
  • Por la simple eliminación de 4 android:layout_alignXXX en el diseño del archivo xml debe hacer su VideoView uso como mucho espacio en la pantalla como sea posible mientras permanecen de vídeo relación de aspecto. Esta es la forma en que la API es el diseño y supongo que para el trabajo.
  • sé que , normalmente, es tomar 1/3 de la pantalla con la normal de la pantalla de vídeo , también im no appling que xml con 4 android:layout_alignXXX a mi aplicación ,de una inadecuada solución que he encontrado a la fuerza a pantalla completa ,quiero de cualquier manera apropiada a la fuerza para estar en pantalla completa, pero(sin estirar ) ,
  • Supongo que este es el resultado esperado. Si juegas en el modo de retrato, el video toma generalmente de ancho completo, pero deja mucho espacio en la parte superior y la parte inferior, si el juego en el modo de paisaje, en el vídeo se suelen tomar de altura completa, pero dejar algo de espacio en el lado.
  • android por defecto del jugador y costumbre de muchos reproductor de reproducir cualquier vídeo en pantalla completa sin espaciado de modo que no debe ser un truco o código hack para hacerlo y esto lo que estoy buscando mi querida
  • ¿Todavía siguen siendo la relación de aspecto? Dudo que. hay muchos dispositivos que tiene diferente tamaño de pantalla. tomar Samsung Galaxy S2 como un ejemplo, el tamaño de la pantalla es de 480 x 800, que es de 5:3 en el modo de paisaje, que se puede ver no es una normal relación de aspecto de 4:3 o 16:9.
  • el uso de SurfaceView en XMl y el uso que
  • comprobar esta respuesta stackoverflow.com/a/38971707/1153703

8 Comentarios

  1. 42

    Como esta se puede establecer las propiedades del vídeo por ti mismo.

    Utilizar un SurfaceView (le da más control sobre la vista), establece a fill_parent para que coincida con la totalidad de la pantalla

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     
                  android:orientation="vertical" 
                  android:layout_width="match_parent"
                  android:layout_height="fill_parent">
    
        <SurfaceView
            android:id="@+id/surfaceViewFrame"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center" >
        </SurfaceView>
    </Linearlayout>

    a continuación, en el código java para obtener la superficie de ver y agregar el reproductor de medios para que

    surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame);
    player = new MediaPlayer();
    player.setDisplay(holder);

    establece en su reproductor de medios, un onPreparedListener y calcular manualmente el tamaño deseado de la de vídeo, para llenar la pantalla en la proporción deseada evitando estirar el video!

    player.setOnPreparedListener(new OnPreparedListener() {
    
            @Override
            public void onPrepared(MediaPlayer mp) {
                        //Adjust the size of the video
        //so it fits on the screen
        int videoWidth = player.getVideoWidth();
        int videoHeight = player.getVideoHeight();
        float videoProportion = (float) videoWidth / (float) videoHeight;       
        int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
        int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
        float screenProportion = (float) screenWidth / (float) screenHeight;
        android.view.ViewGroup.LayoutParams lp = surfaceViewFrame.getLayoutParams();
    
        if (videoProportion > screenProportion) {
            lp.width = screenWidth;
            lp.height = (int) ((float) screenWidth / videoProportion);
        } else {
            lp.width = (int) (videoProportion * (float) screenHeight);
            lp.height = screenHeight;
        }
        surfaceViewFrame.setLayoutParams(lp);
    
        if (!player.isPlaying()) {
            player.start();         
        }
    
            }
        });

    He modificado este de un tutorial para el streaming de vídeo que he seguido hace algún tiempo, no se puede encontrar ahora mismo para hacer referencia a él, si alguien hace el favor de agregar el enlace a la respuesta!

    Espero que ayude!

    EDITAR

    Aceptar, por lo tanto, si desea que el vídeo se ocupan toda la pantalla y no la quieres para estirar usted va a terminar con franjas negras en los lados. En el código que he publicado estamos descubriendo lo que es más grande, el vídeo o la pantalla del teléfono y ajuste de la mejor forma que podamos.

    Ahí tienes mi completa de la actividad, streaming de un video de un enlace. Es 100% funcional. Yo no te puedo decir cómo reproducir un vídeo desde su propio dispositivo, porque no sé que. Estoy seguro de que lo encontrará en la documentación aquí o aquí.

    public class VideoPlayer extends Activity implements Callback, OnPreparedListener, OnCompletionListener, 
    OnClickListener {   
    private SurfaceView surfaceViewFrame;
    private static final String TAG = "VideoPlayer";
    private SurfaceHolder holder;
    private ProgressBar progressBarWait;
    private ImageView pause;
    private MediaPlayer player; 
    private Timer updateTimer;
    String video_uri = "http://daily3gp.com/vids/familyguy_has_own_orbit.3gp";  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.videosample);       
    pause = (ImageView) findViewById(R.id.imageViewPauseIndicator);
    pause.setVisibility(View.GONE);
    if (player != null) {
    if (!player.isPlaying()) {
    pause.setVisibility(View.VISIBLE);
    }
    }
    surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame);
    surfaceViewFrame.setOnClickListener(this);
    surfaceViewFrame.setClickable(false);
    progressBarWait = (ProgressBar) findViewById(R.id.progressBarWait);
    holder = surfaceViewFrame.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    player = new MediaPlayer();
    player.setOnPreparedListener(this);
    player.setOnCompletionListener(this);
    player.setScreenOnWhilePlaying(true);
    player.setDisplay(holder);
    }
    private void playVideo() {
    new Thread(new Runnable() {
    public void run() {
    try {
    player.setDataSource(video_uri);
    player.prepare();
    } catch (Exception e) { //I can split the exceptions to get which error i need.
    showToast("Error while playing video");
    Log.i(TAG, "Error");
    e.printStackTrace();
    } 
    }
    }).start();     
    }
    private void showToast(final String string) {
    runOnUiThread(new Runnable() {
    public void run() {
    Toast.makeText(VideoPlayer.this, string, Toast.LENGTH_LONG).show();
    finish();
    }
    });
    }
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //TODO Auto-generated method stub
    }
    public void surfaceCreated(SurfaceHolder holder) {
    playVideo();
    }
    public void surfaceDestroyed(SurfaceHolder holder) {
    //TODO Auto-generated method stub
    }
    //prepare the video
    public void onPrepared(MediaPlayer mp) {        
    progressBarWait.setVisibility(View.GONE);
    //Adjust the size of the video
    //so it fits on the screen
    int videoWidth = player.getVideoWidth();
    int videoHeight = player.getVideoHeight();
    float videoProportion = (float) videoWidth / (float) videoHeight;       
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
    float screenProportion = (float) screenWidth / (float) screenHeight;
    android.view.ViewGroup.LayoutParams lp = surfaceViewFrame.getLayoutParams();
    if (videoProportion > screenProportion) {
    lp.width = screenWidth;
    lp.height = (int) ((float) screenWidth / videoProportion);
    } else {
    lp.width = (int) (videoProportion * (float) screenHeight);
    lp.height = screenHeight;
    }
    surfaceViewFrame.setLayoutParams(lp);
    if (!player.isPlaying()) {
    player.start();         
    }
    surfaceViewFrame.setClickable(true);
    }
    //callback when the video is over
    public void onCompletion(MediaPlayer mp) {
    mp.stop();
    if (updateTimer != null) {
    updateTimer.cancel();
    }
    finish();
    }
    //pause and resume
    public void onClick(View v) {
    if (v.getId() == R.id.surfaceViewFrame) {
    if (player != null) {
    if (player.isPlaying()) {
    player.pause();
    pause.setVisibility(View.VISIBLE);
    } else {
    player.start();
    pause.setVisibility(View.GONE);
    }
    }
    }
    }
    }
    • PRIMERO DE TODO gracias por tu respuesta , por favor escribir código completo , porque esta es la primera vez que he utilizado videoview y nunca uso surfaceview o MediaPlayer, no soy experto en android , por favor también de los que no puedo entender esto (calcular manualmente el tamaño deseado de la de vídeo, para llenar la pantalla en la proporción deseada ) , también quiero finalmente al jugar mis vídeos en cualquier teléfono móvil para ocupar la pantalla completa sin distorsión o de estiramiento , esta pregunta va a ser parte de un gran proyecto por lo que mi aplicación va a tener muchos videos con diferente longitud y tamaño , gracias mucho
    • TAMBIÉN puedo AÑADIR ESTA LÍNEA :final MediaPlayer jugador = MediaPlayer.crear(this,R. raw.video_1); luego jugar solo el audio del video no es el vídeo en sí , gracias
    • Si la respuesta es lo que busca, por favor no te olvides de aceptarlo! Me alegro de poder ayudar!
    • déjame probarlo , luego reproducción . gracias mucho
    • la pruebo , no me dio de vídeo de pantalla completa también cuando cambio la uri a cualquier otro que se entregó este Brindis mensaje :Error durante la reproducción de vídeo , los consejos de mi querida
    • Este código va a cambiar el tamaño del vídeo, pero no se estire. si desea que el vídeo a pantalla completa me imagine que usted necesita varias resoluciones y usted tiene que elegir uno que coincide con tu teléfono, pero tenga en cuenta que no soy un experto en medio de reproducción. Puede realizar el seguimiento de la excepción y ver lo que está mal. Mi primera conjetura es algún enlace roto o escribe mal en la URI!
    • Como un aparte, no creo que haya ninguna razón para ir a través de todos los SurfaceView crazyness. Usted puede utilizar un VideoView como lo haría normalmente, pero que se aplican de tamaño de código para su LayoutParameters en el onPrepared de devolución de llamada.

  2. 4
        @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    videoView1 = (VideoView) findViewById(R.id.videoview);
    String SrcPath = "/mnt/sdcard/final.mp4";
    videoView1.setVideoPath(SrcPath);
    videoView1.setMediaController(new MediaController(this));
    videoView1.requestFocus();      
    videoView1.start();     
    }
    }
    <VideoView
    android:id="@+id/videoview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" >
    </VideoView>

    intente esto es trabajo para mí

    • ¿Necesita toda la alineación de los atributos de si el diseño es fill_parent? Suena como duplicados.
    • sí para ver vídeo de como pantalla completa todos necesitamos de la alineación,
    • Este código hace que el videoview pantalla completa, pero se extiende el video, si el video no es un ajuste exacto. Este código no se mantiene la relación de aspecto.
  3. 2

    La actual upvoted solución funciona, pero puede ser una solución simple para el problema original. Un comentarista señaló correctamente que usted puede cambiar el tamaño de una VideoView utilizando la misma metodología, sin el costo de la conversión de todo a un SurfaceView. He probado esto en una de mis aplicaciones y parece que funciona. Acabo de agregar el valor calculado de parámetros de diseño para el VideoView en el OnPreparedListener de devolución de llamada:

    mInspirationalVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
    //mMediaPlayer = mp;

                mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
    @Override
    public void onSeekComplete(MediaPlayer mp) {
    if(isPlaying = true) {
    stopPosition = 0;
    mp.start();
    mVideoProgressTask = new VideoProgress();
    mVideoProgressTask.execute();
    }
    }
    });
    //so it fits on the screen
    int videoWidth = mp.getVideoWidth();
    int videoHeight = mp.getVideoHeight();
    float videoProportion = (float) videoWidth / (float) videoHeight;
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
    float screenProportion = (float) screenWidth / (float) screenHeight;
    android.view.ViewGroup.LayoutParams lp = mInspirationalVideoView.getLayoutParams();
    if (videoProportion > screenProportion) {
    lp.width = screenWidth;
    lp.height = (int) ((float) screenWidth / videoProportion);
    } else {
    lp.width = (int) (videoProportion * (float) screenHeight);
    lp.height = screenHeight;
    }
    mInspirationalVideoView.setLayoutParams(lp);
    ...
    }
    });
  4. 1

    Aquí es mi función, que trabaja por el vídeo a pantalla completa sin estiramiento. Automáticamente recortar los lados de la de vídeo. Se trabajó ambos modos vertical y horizontal.

    Fue tomado realmente la respuesta.

        public void onPrepared(MediaPlayer mp) {
    int videoWidth = mediaPlayer.getVideoWidth();
    int videoHeight = mediaPlayer.getVideoHeight();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int screenWidth = displayMetrics.widthPixels;
    int screenHeight = displayMetrics.heightPixels;
    float scaleY = 1.0f;
    float scaleX = (videoWidth * screenHeight / videoHeight) / screenWidth;
    int pivotPointX = (int) (screenWidth / 2);
    int pivotPointY = (int) (screenHeight / 2);
    surfaceView.setScaleX(scaleX);
    surfaceView.setScaleY(scaleY);
    surfaceView.setPivotX(pivotPointX);
    surfaceView.setPivotY(pivotPointY);
    mediaPlayer.setLooping(true);
    mediaPlayer.start();
    }
  5. 0

    Un SurfaceView da u optimizar la superficie de dibujo

    public class YourMovieActivity extends Activity implements SurfaceHolder.Callback {
    private MediaPlayer media = null;
    //...
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    media = new MediaPlayer();
    mSurfaceView = (SurfaceView) findViewById(R.id.surface);
    //...
    }
    }

    MediaPlayer llamadas deben ser envueltos en un try{}.

        @Override
    public void surfaceCreated(SurfaceHolder holder) {
    media.setDataSource("android.resource://" + getPackageName() 
    +"/"+R.raw.video_);
    media.prepare();
    int videoWidth = mp.getVideoWidth();
    int videoHeight = mp.getVideoHeight();
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    android.view.
    ViewGroup.LayoutParams layout = mSurfaceView.getLayoutParams();
    layout.width = screenWidth;
    layout.height = (int) (((float)videoHeight / (float)videoWidth) * (float)screenWidth);
    mSurfaceView.setLayoutParams(layout);        
    mp.start();
    }
    • android.widget.VideoView aplicación es más robusto y más inteligente que su implementación. Se encarga tanto de la caso, cuando el vídeo es demasiado alto o demasiado amplia, así que por favor, sólo utilizar VideoView.
    • pero cuando el uso u u opiniones de forma dinámica puede sentar los parámetros para el video que pensé u wer destinado a
    • SurfaceView actúa como un contenedor .Así que u puede agregar videoView en su interior.Así ur robustez aún prevalece.
    • No, No envuelva VideoView dentro de un SurfaceView, como VideoView sí es un SurfaceView public class VideoView extends SurfaceView implements MediaPlayerControl {...}. Este es exactamente el punto de por qué VideoView es proporcionada por la API, para hacer su vida más fácil, como VideoView es suficiente para la mayoría de los casos de uso común.
  6. 0

    Ha intentado ajustar la superficie subyacente titular de tamaño? Pruebe el código de abajo debería ajustar la superficie del titular de la misma anchura y altura del tamaño de la pantalla. Usted debe tener su actividad a pantalla completa sin barra de título.

        public class Video extends Activity {
    private VideoView myvid;
    @Override
    public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    myvid = (VideoView) findViewById(R.id.myvideoview);
    myvid.setVideoURI(Uri.parse("android.resource://" + getPackageName() 
    +"/"+R.raw.video_1));
    myvid.setMediaController(new MediaController(this));
    myvid.requestFocus();
    //Set the surface holder height to the screen dimensions
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    myvid.getHolder().setFixedSize(size.x, size.y);
    myvid.start();
    }
    }
    • me dio error rojo debajo de la palabra : getSize en esta línea : la pantalla.getSize(tamaño);
    • ¿Cuál fue el error?
    • agregar yeso para «mostrar»
  7. 0

    Bien, espero te sirva de ayuda FullscreenVideoView

    Se encarga de todas las aburrido código acerca de surfaceView y vista a pantalla completa y le permiten centrarse sólo en interfaz de botones.

    Y usted puede utilizar el FullscreenVideoLayout si usted no quiere construir su botones personalizados.

  8. 0

    Me han resuelto este uno por Personalizado VideoView:

    He añadido VideoView a ParentView en dos formas De xml & mediante programación.

    Agregar clase Personalizada para VideoView nombre con FullScreenVideoView.java:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.VideoView;
    public class FullScreenVideoView extends VideoView {
    public FullScreenVideoView(Context context) {
    super(context);
    }
    public FullScreenVideoView(Context context, AttributeSet attrs) {
    super(context, attrs);
    }
    public FullScreenVideoView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
    }
    }

    Cómo enlazar con xml:

    <FrameLayout
    android:id="@+id/secondMedia"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.my.package.customview.FullScreenVideoView
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/fullScreenVideoView"/>
    </FrameLayout>

    O

    Cómo agregar mediante programación VideoView a ParentView:

    FullScreenVideoView videoView = new FullScreenVideoView(getActivity());
    parentLayout.addView(videoView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));

    Espero que esto le ayudará.

    • esto estira el video
    • si el vídeo es de baja resolución, no tendría tramo de vídeo, puede utilizar el video en HD

Dejar respuesta

Please enter your comment!
Please enter your name here