转载请表明出处https://blog.csdn.net/ZhijunHong/article/details/106873851,谢谢~
写在前面
Android Framework层为各种不同的Camera和Camera的特色功能提供了支持,使得你可以很方便的在应用使用拍照和录像功能。如果希望快速实现拍照与录制视频的方法是使用Intent方式调用系统提供的相机功能;当然,如果系统提供的方式不足以满足项目的需求,你就需要自定义Camera相机。本篇博客会通过Intent方式和自定义Camera两部分介绍如何使用相机功能。
传送门:https://github.com/zhijunhong/custom_view/tree/master/camera
Intent实现方式
-
Camera permisson - 为了使用相机硬件,需要请求使用Camera的权限
<uses-permission android:name="android.permission.CAMERA" />
-
Camera Features - 你的应用还必须声明使用相机功能
<uses-feature android:name="android.hardware.camera" />
增加相机功能到你的mainfest文件,这样Google Play可以阻止那些没有相机硬件或者没有相机特定功能的设备安装你的应用。
-
Storage Permission - 应用需要保存图片或者视频到设备的外置存储空间(SD card)上,则需要在manifest中指定存取权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
代码实现
- 申请Camera和存储权限
private void openCapturePicOrVideo() { PermissionX.init(this) .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) .request(new RequestCallback() { @Override public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) { if (allGranted) { Toast.makeText(SystemCameraActivity.this, "All permissions are granted", Toast.LENGTH_LONG).show(); //拍照 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); //拍摄视频 // Intent intent1 = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); // fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video // intent1.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name // intent1.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high // // start the Video Capture Intent // startActivityForResult(intent1, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE); } else { Toast.makeText(SystemCameraActivity.this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show(); } } }); }
Android6.0以后的系统,需要在代码中申请敏感权限。这里为了方便起见,直接使用郭神的开源框架PermissionX申请Camera和存储权限
- 获取camera intent结果回调
@Override protected void