如何在安卓系统中只允许横屏模式录制视频,最大时间录制时间

问题描述 投票:0回答:1

我只需要在安卓设备上录制一个有一定规格的视频,但我真的很失望,因为我尝试的所有东西都出现了一些奇怪的系统问题,我又回到了起点。然而,我真的很失望,因为我尝试的一切都出现了一些奇怪的系统问题,我回到了开始。所以我需要一个更有经验的开发者来指导我。

规格说明

我需要以下内容。

  • 基本的视频界面(用户可以看到录制的内容)。
  • 视频时间不能超过20秒(最长:20秒后停止录制)。
  • 只启用横向模式。阻止用户以某种方式使他不能以纵向模式录制。
  • 启用配置按钮。允许用户改变视频分辨率的设置按钮。
  • 前置和后置摄像头按钮应该被启用。
  • 尽可能多的设备必须与我的应用程序兼容。

我已经试过了

下面的代码是我第一次尝试. 我很高兴,因为它的工作,但它不能阻止肖像录制视频。所以我从其他问题中读到,我应该使用Camera2的Android API。

Uri videoUri = FileProvider.getUriForFile(this, "com.my.myapplication.fileprovider", videofile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, VIDEO_DURATION);
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // this won't work
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LOCKED); // neither this
startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);

所以我得到了我的第二次尝试. 我把我的代码改成了这个Camera2 API,只是知道大多数三星设备不支持它。以下是我的信息来源. 当然,我刚刚发现后,一些奇怪的错误出现在我的代码。

我按照这个代码。androidwave代码

还有这段代码。lytcomCamera2Kit

还有这个代码。googlearchiveandroid-Camera2Video。

这是很大部分相同。

由于设备与camera2 API不兼容,所以不会返回好的摄像头视频大小。我知道我的设备有一个1920x1080分辨率的摄像头,但系统方法返回的是

E/Camera2VideoFragment: Width: 1440 Height 1080
E/Camera2VideoFragment: Width: 1088 Height 1088
E/Camera2VideoFragment: Width: 1472 Height 720
E/Camera2VideoFragment: Width: 1280 Height 720
E/Camera2VideoFragment: Width: 1056 Height 864
E/Camera2VideoFragment: Width: 960 Height 720

我的第三次尝试. 我在使用图书馆 JeroenMols景观视频摄像机 它给我提供了我所需要的东西,包括这张漂亮的图片,显示用户在录制前旋转设备。然而这个库不能用于API>22。源头.

目前

现在我不知道该怎么做。无论我试过什么都没用。而且周围大多数的回答都只是用那些库。所以请谁能帮我一把?请用Java语言。我不能处理Kotlin。

java android audio-recording video-recording
1个回答
0
投票

由于我很匆忙,我解决了我的问题与 JeroenMols景观视频摄像机 库。可能因为Android版本不兼容,我以后需要更改。尽管如此,我还是把我的答案写在这里,也许会对别人有所帮助。

在新的安卓版本(>=Android.M)下使用这个库的主要问题是运行时的权限。除了将这些权限添加到清单中,我还在运行时申请了所有必要的权限。Camera,Audio和Storage write。

景观视频摄像头的代码

void startCamera(){

            CaptureConfiguration.Builder builder = new CaptureConfiguration.Builder(width, height, bitrate);
            builder.maxDuration(20);
            builder.frameRate(24);
            builder.showRecordingTime();
            CaptureConfiguration configuration = builder.build();
            final Intent intent = new Intent(this, VideoCaptureActivity.class);
            intent.putExtra(VideoCaptureActivity.EXTRA_CAPTURE_CONFIGURATION, configuration);
            intent.putExtra(VideoCaptureActivity.EXTRA_OUTPUT_FILENAME, videofile.getAbsolutePath());
            startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);
}

询问权限

    public void launchCamera(View v){
         //first test if SDK is Marshmallow

            // if it's then we need to ask permission during run time
            //first check if we already got permission
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                requestStoragePermission();
                return;
            }
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                requestCameraPermission();
                return;
            }
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO)
                    != PackageManager.PERMISSION_GRANTED) {
                requestAudioRecordPermission();
                return;
            }
            startCamera();
        }
    }

请求许可结果

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == STORAGE_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){               
                // permission given
                startCamera();
            }
            else{
                // permission not given
            }
        }
        if(requestCode == CAMERA_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                // permission given
                startCamera();
            }
            else{
                // permission not given
            }
        }
        if(requestCode == AUDIO_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){                
                startCamera();
            }
            else{
                // permission not given
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.