Nexus 6 y MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

Hola estoy tratando de lograr una actividad con el fondo de archivo de vídeo. La solución que se muestra a continuación funciona en la mayoría de los dispositivos, excepto nexus 6 Android 5.1. El video funciona, está escalado pero no se recorta, por lo que la relación de aspecto no se conserva.

Probado con Galaxy Note, HTC One m7, Xperia Z3, Nexus 5.

Aquí está el código:

public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback, OnClickListener { private static final int VIDEO_START_HACK_DELAY = 0; private static final String BG_VIDEO_PATH = "/raw/construction"; private SurfaceView mSurface; private Button mTour, mLogin; private MediaPlayer mMediaPlayer; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start_main); setupUI(); } private void setupUI() { mMediaPlayer = new MediaPlayer(); mSurface = (SurfaceView) findViewById(R.id.surface); SurfaceHolder holder = mSurface.getHolder(); holder.addCallback(this); mTour = (Button) findViewById(R.id.tour); mLogin = (Button) findViewById(R.id.login); mTour.setOnClickListener(this); mLogin.setOnClickListener(this); } @Override public void surfaceCreated(SurfaceHolder holder) { startVideo(holder); } @SuppressLint("NewApi") public void startVideo(SurfaceHolder holder) { String path = "android.resource://" + getPackageName() + BG_VIDEO_PATH; Uri uri = Uri.parse(path); try { android.view.ViewGroup.LayoutParams lp = mSurface.getLayoutParams(); mMediaPlayer.setDisplay(holder); mMediaPlayer.setDataSource(this, uri); mMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); mMediaPlayer.setLooping(true); mMediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mHandler.postDelayed(new Runnable() { @Override public void run() { mMediaPlayer.start(); } }, VIDEO_START_HACK_DELAY); } }); mMediaPlayer.prepareAsync(); } catch (Exception e) { Log.e("VID", "Problem starting video bg", e); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void onBackPressed() { mSurface.setVisibility(View.INVISIBLE); mMediaPlayer.stop(); super.onBackPressed(); } @Override protected void onDestroy() { mMediaPlayer.stop(); mMediaPlayer.release(); super.onDestroy(); } } 

Aquí está el archivo de diseño:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="40dp" android:gravity="center" android:orientation="vertical" > <Button android:id="@+id/tour" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" android:padding="10dp" android:text="@string/ma_tour"/> <Button android:id="@+id/login" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="10dp" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" android:text="@string/ma_log_in"/> </LinearLayout> </RelativeLayout> 

Target sdk se establece en 22. ¿Has experimentado tal comportamiento y puedes dar algún consejo?

Aquí es cómo lo hice en una de mis aplicaciones:

  1. Establezca OnPreparedListener en el objeto MediaPlayer.

    MediaPlayer.setOnPreparedListener (this);

  2. Cuando el public void onPrepared(MediaPlayer mp) es llamado, redimensione el SurfaceView para que cree la ilusión de vídeo recortado. Log.v (LOG_TAG, "onPrepared llamado para MediaPlayer"); // Ajusta el tamaño del video para que encaje en la pantalla int videoWidth = mInitialVideoPlayer.getVideoWidth (); Int videoHeight = mInitialVideoPlayer.getVideoHeight (); Float videoProportion = (float) videoWidth / (float) videoHeight;

     ViewGroup.LayoutParams lp = mSplashVideoSurfaceView.getLayoutParams(); // We always want to fill entire view port. So, we keep the smallest dimension and proportionately // scale the other dimension. if (videoWidth < videoHeight) { lp.width = UiUtils.sScreenWidth; lp.height = (int) ((float) UiUtils.sScreenWidth / videoProportion); } else { lp.width = (int) (videoProportion * (float) UiUtils.sScreenHeight);If you are targetting API level 14 and above, <code>TextureView</code> allows you to play cropped video lp.height = UiUtils.sScreenHeight; } Log.v(LOG_TAG, "old video size: " + videoWidth + ", " + videoHeight); Log.v(LOG_TAG, "screen size: " + UiUtils.sScreenWidth + ", " + UiUtils.sScreenHeight); Log.v(LOG_TAG, "new video size: " + lp.width + ", " + lp.height); mSplashVideoSurfaceView.setLayoutParams(lp); 
  • Android TextureView vs rendimiento de VideoView
  • Obtener la URL de descarga para el vídeo de YouTube (Android / Java)
  • Android: Copiar RawFile a Sdcard (video mp4)
  • Ocultar una vista de superficie que se superpone a otra
  • Convertir secuencias de entrada de vídeo a RTMP
  • Cómo implementar el chat de voz y video
  • Android tira audio de vídeo
  • Android: el video se puede reproducir desde la galería pero cuando lo reproduzco usando el video de tipo Intent.ACTION_VIEW, no se puede reproducir
  • Capture la pantalla de Android y cree el video programáticamente
  • Android en vivo de vídeo - El audio no funciona
  • SurfaceView sobre actionBar debido a setZOrderOnTop
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.