我只需要在安卓设备上录制一个有一定规格的视频,但我真的很失望,因为我尝试的所有东西都出现了一些奇怪的系统问题,我又回到了起点。然而,我真的很失望,因为我尝试的一切都出现了一些奇怪的系统问题,我回到了开始。所以我需要一个更有经验的开发者来指导我。
规格说明
我需要以下内容。
我已经试过了
下面的代码是我第一次尝试. 我很高兴,因为它的工作,但它不能阻止肖像录制视频。所以我从其他问题中读到,我应该使用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。
由于我很匆忙,我解决了我的问题与 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
}
}
}