VideoView中的Android纵向video方向错误

我在Android设备上以PORTRAIT方向捕捉新video,如下所示:

Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(intent, 1886); 

它给了我这个文件:“/mnt/sdcard/DCIM/Camera/video-2012-02-02-10-45-48.mp4”

然后我这样玩:

 private VideoView videoView = (VideoView) findViewById(R.id.videoView); String videoUrl = "/mnt/sdcard/DCIM/Camera/video-2012-02-02-10-45-48.mp4"; videoView.setMediaController(new MediaController(this)); videoView.setVideoURI(Uri.parse(videoUrl)); videoView.start(); 

这是我的布局文件:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <VideoView android:id="@+id/videoView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerInParent="true" /> </RelativeLayout> 

当我在标准的Android图库中播放时,其方向是正确的。 但是当我在上面的VideoView中播放video时,它旋转了90度。 景观效果很好,唯一的问题是肖像video。

如何在VideoView中旋转此video?
另外,我怎样才能以编程方式确定方向?

Solutions Collecting From Web of "VideoView中的Android纵向video方向错误"

您需要首先确定捕获的video的方向。 尽pipe存在使用肖像的版本,但是大多数新的智能手机使用相机的横向方向。 要确定方向,你可以采取帧的长度和宽度,然后比较它们。 当你开始检查是否有活动取向的video,并根据取向活动的变化。

代码示例:

 public class MainActivity extends ActionBarActivity { String videoUrl = "/mnt/sdcard/DCIM/100ANDRO/MOV_9195.mp4"; int videoWidth; int videoHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getVideoAspectRatio(); if (isVideoLandscaped()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } setContentView(R.layout.activity_main); VideoView videoView = (VideoView) findVewById(R.id.videoView); videoView.setMediaController(new MediaController(this)); videoView.setVideoURI(Uri.parse(videoUrl)); videoView.start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void getVideoAspectRatio() { MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(this, Uri.parse(videoUrl)); String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); videoWidth = Integer.parseInt(width); videoHeight = Integer.parseInt(height); } private boolean isVideoLandscaped() { if (videoWidth > videoHeight) { return true; } else return false; } } 

不要忘记以样式隐藏ActionBar,或以编程方式隐藏活动。