2015-08-24 44 views
8

Xin chào, tôi đang cố gắng đạt được Hoạt động với nền được tạo từ tệp video. Giải pháp được đăng bên dưới đang hoạt động trên hầu hết các thiết bị, ngoại trừ nexus 6 Android 5.1. Video đang hoạt động, được thu nhỏ nhưng không bị cắt, do đó tỷ lệ cỡ ảnh không được giữ nguyên.Nexus 6 và MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

Thử nghiệm với Galaxy Note, HTC One M7, Xperia Z3, Nexus 5.

Đây là mã:

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

Dưới đây là file layout:

<?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 là thiết lập để 22. Bạn có thể có kinh nghiệm hành vi như vậy và có thể đưa ra lời khuyên nào?

+1

phải đối mặt với cùng một vấn đề. Bạn đã tìm thấy giải pháp chưa? – Grecha

Trả lời

0

Sau đây là cách tôi đã làm nó trong một trong những ứng dụng của tôi:

  1. Đặt OnPreparedListener trên đối tượng MediaPlayer.

    mediaPlayer.setOnPreparedListener (this);

  2. Khi gọi số public void onPrepared(MediaPlayer mp), hãy đổi kích thước SurfaceView để nó tạo ảo giác về video bị cắt. Log.v (LOG_TAG, "onPrepared được gọi cho MediaPlayer"); // Điều chỉnh kích thước của video sao cho nó vừa với màn hình int videoWidth = mInitialVideoPlayer.getVideoWidth(); int videoHeight = mInitialVideoPlayer.getVideoHeight(); float videoProportion = (float) videoĐộ sáng/(phao) 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); 
    
Các vấn đề liên quan