Android实现调用摄像头拍照与视频功能
背景介绍
在现代Android开发中,调用设备摄像头进行拍照和录制视频是一项基本而重要的功能,无论是社交媒体应用、即时通讯工具还是其他多媒体应用,都可能需要使用到设备的摄像头,本文将详细介绍如何在Android项目中实现调用摄像头进行拍照和录制视频的功能。
项目设置
需要创建一个名为CameraPhotoVideo
的新Android项目,项目包含两个Activity:MainActivity
和CameraActivity
。MainActivity
负责界面展示,CameraActivity
负责拍照和录视频操作。
`activity_main.xml`
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/shape_main" tools:context=".MainActivity"> <LinearLayout android:layout_height="wrap_content" android:layout_marginTop="50dp" android:layout_width="match_parent" android:orientation="vertical"> <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:src="@drawable/main"/> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_marginTop="100dp" android:layout_width="match_parent" android:layout_alignParentBottom="true" android:orientation="vertical"> <Button android:id="@+id/main_button" android:layout_height="50dp" android:layout_marginBottom="50dp" android:background="@drawable/shape_main" android:layout_width="match_parent" android:textColor="#FFFFFF" android:text="使用摄像头"/> </LinearLayout> </RelativeLayout>
`MainActivity.java`
import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button button; //调用摄像头按钮 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } private void initViews() { button = (Button) findViewById(R.id.main_button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(getApplicationContext(), CameraActivity.class)); } }); } }
UI设计
在activity_camera.xml
布局文件中,设置了主界面的布局结构,包括一个顶部ImageView和两个LinearLayout,ImageView用于显示主界面元素,LinearLayout则用于放置拍照和录视频操作的触发按钮或界面组件。
activity_camera.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:background="#FFFFFF" android:layout_height="match_parent" tools:context=".CameraActivity"> <SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/camera_surfaceview"/> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="计时区域" android:id="@+id/camera_time"/> <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_alignParentBottom="true" android:orientation="horizontal"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1" android:text="拍照" android:id="@+id/btn_takepicture"/> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1" android:text="录像" android:id="@+id/btn_recordvideo"/> </LinearLayout> </RelativeLayout>
拍照功能实现
在CameraActivity
中,通过Camera
或CameraX
库获取相机对象,设置相机参数如分辨率、闪光灯等,并监听预览画面和拍照事件,拍照后,保存图片到应用存储或者显示在ImageView中,以下是具体步骤:
添加权限声明
在AndroidManifest.xml
中添加相机和存储权限:
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
初始化相机
在CameraActivity
中初始化相机并设置预览:
import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.WindowManager; public class CameraActivity extends Activity { private Camera camera; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private boolean previewing = false; private Button takePictureButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); surfaceView = (SurfaceView) findViewById(R.id.camera_surfaceview); takePictureButton = (Button) findViewById(R.id.btn_takepicture); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (previewing) { camera.stopPreview(); } Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(width, height); camera.setParameters(parameters); try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); previewing = true; } catch (Exception e) { Log.e("Camera", "Error setting camera preview: " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null) { camera.release(); camera = null; } } }); takePictureButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // Save or display the image here } }); } }); }
以上就是关于“Android实现调用摄像头拍照与视频功能”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!