android摄像头调用
在Android平台上,调用摄像头是开发移动应用时常见的功能,主要涉及到系统提供的Camera API或CameraX库。本文将深入探讨如何在Android应用中实现摄像头调用,并将拍照结果保存到SD卡的根目录。 我们需要了解Android的相机权限。在AndroidManifest.xml文件中,必须声明`<uses-permission>`来获取访问相机的权限,如: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 同时,如果要将图片保存到外部存储(如SD卡),还需声明`WRITE_EXTERNAL_STORAGE`权限,对于Android 6.0及以上版本,还需要在运行时动态请求权限。 接下来,我们讨论如何使用Camera API。Android SDK提供了Camera类,允许开发者直接控制摄像头。以下是一个简单的相机启动示例: ```java // 获取默认的相机ID int cameraId = Camera.getNumberOfCameras() - 1; // 假设最后一个为后置摄像头 Camera.open(cameraId); // 打开指定的相机 // 设置预览显示视图 CameraPreview preview = (CameraPreview) findViewById(R.id.camera_preview); Camera.setPreviewDisplay(preview.getHolder()); // 开始预览 Camera.startPreview(); ``` `CameraPreview`是一个自定义的SurfaceView,用于显示摄像头预览画面。当用户点击拍照按钮时,可以调用`takePicture()`方法进行拍照: ```java Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 处理拍照后的图片数据 File pictureFile = createImageFile(); // 创建图片文件 try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (IOException e) { e.printStackTrace(); } // 释放相机资源 camera.release(); } }; // 触发拍照 camera.takePicture(null, null, pictureCallback); ``` `createImageFile()`函数用于在SD卡根目录创建一个图片文件: ```java private File getExternalFilesDir(String type) { return Environment.getExternalStoragePublicDirectory(type); } private File createImageFile() throws IOException { String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timestamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return image; } ``` 然而,Camera API比较复杂且难以使用,Google在Android X库中推出了CameraX,这是一个现代、易于使用的相机框架。使用CameraX,你可以更简洁地实现相同的功能: ```kotlin val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() val preview = Preview.Builder() .build() .also { it.setSurfaceProvider(binding.previewView.surfaceProvider) } val imageCapture = ImageCapture.Builder() .setTargetRotation(windowManager.defaultDisplay.rotation) .build() val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview, imageCapture) val takePictureButton = findViewById<Button>(R.id.button_take_picture) takePictureButton.setOnClickListener { val file = createImageFile() val outputOptions = ImageCapture.OutputFileOptions.Builder(file).build() imageCapture.takePicture(outputOptions, object : ImageCapture.OnImageSavedCallback { override fun onImageSaved(output: ImageCapture.OutputFileResults) { // 图片已保存 } override fun onError(exception: ImageCaptureException) { exception.printStackTrace() } }) } }, ContextCompat.getMainExecutor(this)) ``` 在CameraX中,我们使用`ProcessCameraProvider`实例化相机提供者,然后创建`Preview`和`ImageCapture`对象。通过`bindToLifecycle`方法将它们与生命周期关联,确保相机在正确的时间打开和关闭。点击拍照按钮时,调用`takePicture()`并提供一个文件输出选项来保存图片。 Android提供了多种方式调用摄像头并保存图片到SD卡。Camera API适合对相机有高度定制需求的场景,而CameraX则简化了相机集成过程,更适合大多数日常应用。在实际开发中,根据项目需求和兼容性要求选择合适的方案。
- 1
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助