Nexus 6和MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

Mic*_*lba 8 video android nexus6

嗨,我正在尝试使用视频文件制作背景活动.下面发布的解决方案适用于大多数设备,但nexus 6 Android 5.1除外.视频正在运行,已缩放但未裁剪,因此不保留纵横比.

使用Galaxy Note,HTC One m7,Xperia Z3,Nexus 5进行测试.

这是代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是布局文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

目标sdk设置为22.你有没有经历过这样的行为并且可以给出任何建议?

Ash*_*hak 0

以下是我在我的一个应用程序中的做法:

  1. 在 MediaPlayer 对象上设置 OnPreparedListener。

    mediaPlayer.setOnPreparedListener(this);

  2. 调用时public void onPrepared(MediaPlayer mp),调整 的大小SurfaceView,以产生裁剪视频的错觉。Log.v(LOG_TAG, "onPrepared 为 MediaPlayer 调用"); // 调整视频大小,使其适合屏幕 int videoWidth = mInitialVideoPlayer.getVideoWidth(); int videoHeight = mInitialVideoPlayer.getVideoHeight(); 浮动视频比例=(浮动)视频宽度/(浮动)视频高度;

    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);
    
    Run Code Online (Sandbox Code Playgroud)