Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 根据视频宽度和高度旋转屏幕_Android_Android Orientation - Fatal编程技术网

Android 根据视频宽度和高度旋转屏幕

Android 根据视频宽度和高度旋转屏幕,android,android-orientation,Android,Android Orientation,我当前正在通过执行以下操作检测选定视频的宽度和高度: MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(this, mVideoUri); String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.META

我当前正在通过执行以下操作检测选定视频的宽度和高度:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(this, mVideoUri);
    String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
    String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
int w = Integer.parseInt(videoWidth);
    int h = Integer.parseInt(videoHeight);


    if (w > h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


    } if(w < h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Bitmap bmp;
retriever.setDataSource(this, mVideoUri);
bmp = retriever.getFrameAtTime();
清单中的活动:

<activity android:name=".TrimVideoActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen"
        />
现在,我想根据结果(宽度/高度)旋转屏幕,我尝试了以下操作:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(this, mVideoUri);
    String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
    String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
int w = Integer.parseInt(videoWidth);
    int h = Integer.parseInt(videoHeight);


    if (w > h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


    } if(w < h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Bitmap bmp;
retriever.setDataSource(this, mVideoUri);
bmp = retriever.getFrameAtTime();
intw=Integer.parseInt(视频宽度);
int h=整数.parseInt(视频高度);
如果(w>h){
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);
}if(w

但是,屏幕总是旋转到横向,而不是在宽度小于高度时设置为纵向?

我决定添加一个答案,解释我是如何解决这个问题的

我最初的做法的问题是:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(this, mVideoUri);
String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
问题是视频可能没有我要查找的元数据,这将导致
nullpointerexception

为了避免此问题,我可以从视频中获取一帧(作为位图),并通过执行以下操作从该位图中获取宽度和高度:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(this, mVideoUri);
    String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
    String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
int w = Integer.parseInt(videoWidth);
    int h = Integer.parseInt(videoHeight);


    if (w > h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


    } if(w < h) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Bitmap bmp;
retriever.setDataSource(this, mVideoUri);
bmp = retriever.getFrameAtTime();
但是,这带来了另一个问题,你可能没有。在我的例子中,我希望获得第一个/最接近开始的帧,因为如果在视频捕获期间屏幕旋转,那么帧的宽度/高度将发生变化,因此我只在
getFrameAtTime(1)
中添加了1


现在,我可以根据视频文件的宽度和高度旋转屏幕,方法如下:

try {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    Bitmap bmp;
    retriever.setDataSource(this, mVideoUri);
    bmp = retriever.getFrameAtTime(1);

    int videoWidth = bmp.getWidth();
    int videoHeight = bmp.getHeight();

    if (videoWidth > videoHeight) {
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    if (videoWidth < videoHeight) {
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

}catch (RuntimeException ex){
    Log.e("MediaMetadataRetriever", "- Failed to rotate the video");
}
试试看{
MediaMetadataRetriever retriever=新的MediaMetadataRetriever();
位图bmp;
setDataSource(这个,mVideoUri);
bmp=retriever.getFrameAtTime(1);
int videoWidth=bmp.getWidth();
int videoHeight=bmp.getHeight();
如果(视频宽度>视频高度){
此.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);
}
if(视频宽度<视频高度){
此.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Graphic);
}
}捕获(RuntimeException ex){
Log.e(“MediaMetadataRetriever”,“-无法旋转视频”);
}
当然,上述内容将从
onCreate
中调用


希望这对其他人有所帮助。

这更像是一种解决办法,但我认为它应该会起作用:@VladMatvienko谢谢你,我会试试。@VladMatvienko你能看看我的编辑吗?如果你的宽度和高度正确,请检查调试。这完全是另一个问题,应该作为另一个问题来问。@VladMatvienko好的,我会问一个新问题