android系统相机自动录像,Android中系统自带的录像功能

前言

前段时间,产品大大要求在App上添加一个录制视频的功能,并支持选择相册中的视频、回放和上传。第一时间想到的就是系统的录像功能了。就是通过跳转至相机的录制视频,并保存到指定的路径。

一、录制视频:

录制视频有两种方法:系统相机的录制视频功能和通过安卓自带的MediaRecorder来录制视频,通过Camera来播放,这里主要讲第一种。

首先跳转

String filePath = FileManager.get().getRootFile() + "/msc/" + itemId + ".mp4"; // 保存路径

Uri uri = Uri.fromFile(new File(filePath)); // 将路径转换为Uri对象

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); // 表示跳转至相机的录视频界面

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); // MediaStore.EXTRA_VIDEO_QUALITY 表示录制视频的质量,从 0-1,越大表示质量越好,同时视频也越大

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // 表示录制完后保存的录制,如果不写,则会保存到默认的路径,在onActivityResult()的回调,通过intent.getData中返回保存的路径

intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30); // 设置视频录制的最长时间

context.startActivityForResult(intent, REQUEST_CODE_RECORD_VIDEO); // 跳转

录制完回调

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode == Activity.RESULT_OK && null != data)

if (requestCode == REQUEST_CODE_RECORD_VIDEO) {

Uri Uri = data.getData(); // 视频的保存路径

}

}

获取视频时长

MediaPlayer mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(context, uri);

mediaPlayer.prepare();

int duration = mediaPlayer.getDuration() / 1000; // 获取到的是毫秒值

获取视频的第一帧的图片

MediaMetadataRetriever media = new MediaMetadataRetriever();

String videoPath = uri.getPath(); // 通过Uri获取绝对路径

media.setDataSource(videoPath);

Bitmap bitmap = media.getFrameAtTime(); // 视频的第一帧图片

二、选择本地视频:

使用系统的选择本地视频的方法,这里有个坑,就是兼容性问题。

使用ACTION_PICK的方式打开相册在oppo、vivo、华为、小米使用均没问题,但是在魅族和一加都不可以(跳转后的界面无法选择视频)。而魅族手机使用ACTION_OPEN_DOCUMENT方式可以选择视频文件,但是在华为手机(测试用的华为)上则会出现闪退(无法获取到被选中的视频文件的路径)。

出现这些问题主要是不同品牌的手机调取系统图库显示的方法不尽相同,当时我的解决方案就是通过区分不同手机来进行分别兼容。

Intent intent = new Intent();

if("Meizu".equalsIgnoreCase(android.os.Build.MANUFACTURER)){ // 判断用户手机是否是“魅族”。忽略大小写的比较

intent.setAction(Intent.ACTION_OPEN_DOCUMENT);

intent.addCategory(Intent.CATEGORY_OPENABLE);

intent.setType("video/*");

}else {

intent.setAction(Intent.ACTION_PICK);

intent.setData(android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);

}

context.startActivityForResult(intent, REQUEST_CODE_CHOOSE_VIDEO);

选择视频后回调

public void handleVideoResult(int requestCode, int resultCode, Intent data) {

if (resultCode == Activity.RESULT_OK && null != data)

if (requestCode == REQUEST_CODE_CHOOSE_VIDEO) {

try {

Uri selectedVideo = data.getData(); // 获取视频的Uri

String[] filePathColumn = {MediaStore.Video.Media.DATA};

cursor = context.getContentResolver().query(selectedVideo,

filePathColumn, null, null, null);

cursor.moveToFirst();

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);

String path = cursor.getString(columnIndex); // 视频路径

} finally {

if (cursor != null) cursor.close(); // 关闭cursor

}

}

}

选中后,可以获取到视频的各种信息

// 视频ID:MediaStore.Audio.Media._ID

int videoId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));

// 视频名称:MediaStore.Audio.Media.TITLE

String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));

// 视频路径:MediaStore.Audio.Media.DATA

String videoPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));

// 视频时长:MediaStore.Audio.Media.DURATION

int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));

// 视频大小:MediaStore.Audio.Media.SIZE

long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));

// 视频缩略图路径:MediaStore.Images.Media.DATA

String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));

// 缩略图ID:MediaStore.Audio.Media._ID

int imageId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用程序调用系统相机自动录像,需要使用 Camera2 API 和 MediaRecorder 类。下面是一个简单的示例代码: 1. 在你的应用程序声明一个 SurfaceView: ``` <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在你的 Activity ,定义 Camera2 API 和 MediaRecorder 类的成员变量: ``` private CameraManager cameraManager; private String cameraId; private CameraDevice cameraDevice; private CameraCaptureSession captureSession; private SurfaceView surfaceView; private MediaRecorder mediaRecorder; ``` 3. 在 onCreate() 方法初始化成员变量: ``` surfaceView = findViewById(R.id.surface_view); mediaRecorder = new MediaRecorder(); cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); cameraId = cameraManager.getCameraIdList()[0]; ``` 4. 在 onStart() 方法打开相机和预览: ``` @Override protected void onStart() { super.onStart(); openCamera(); } private void openCamera() { try { cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { cameraDevice = camera; startPreview(); } @Override public void onDisconnected(@NonNull CameraDevice camera) { camera.close(); cameraDevice = null; } @Override public void onError(@NonNull CameraDevice camera, int error) { camera.close(); cameraDevice = null; } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void startPreview() { try { Surface surface = surfaceView.getHolder().getSurface(); CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(surface); cameraDevice.createCaptureSession(Collections.singletonList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { captureSession = session; try { captureSession.setRepeatingRequest(builder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { captureSession = null; } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 5. 在一个按钮的点击事件,开始录像: ``` Button btnRecord = findViewById(R.id.btn_record); btnRecord.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startRecording(); } }); private void startRecording() { try { mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setOutputFile(getOutputFile().getPath()); mediaRecorder.setVideoSize(640, 480); mediaRecorder.setVideoFrameRate(30); mediaRecorder.prepare(); Surface surface = mediaRecorder.getSurface(); CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); builder.addTarget(surface); List<Surface> surfaces = Arrays.asList(surface, surfaceView.getHolder().getSurface()); cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { captureSession = session; try { captureSession.setRepeatingRequest(builder.build(), null, null); mediaRecorder.start(); } catch (CameraAccessException | IllegalStateException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { captureSession = null; } }, null); } catch (IOException | CameraAccessException e) { e.printStackTrace(); } } ``` 6. 在 onStop() 方法停止录像相机预览: ``` @Override protected void onStop() { super.onStop(); stopRecording(); stopPreview(); } private void stopRecording() { if (mediaRecorder != null) { mediaRecorder.stop(); mediaRecorder.reset(); } } private void stopPreview() { if (captureSession != null) { captureSession.close(); captureSession = null; } if (cameraDevice != null) { cameraDevice.close(); cameraDevice = null; } } ``` 以上代码仅作为一个简单示例,实际应用可能需要更多的配置和错误处理。请注意,自动录像可能会违反用户隐私,应慎重使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值