android开发控制摄像头拍照

    xiaoxiao2025-07-09  15

    前言:简略的介绍android中关于控制摄像头的一些基本操作,实现简易的拍照功能。

    权限设置

    在AndroidManifest.xml文件中,加入代码:

    <uses-permission android:name="android.permission.CAMERA" /> //获取照相机权限(必须) <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> //获取外部存储权限(可选)

    界面设计

    界面设计的较为简单,FrameLayout用来显示预览内容,Button用来点击拍照,布局代码如下:

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <Button android:id="@+id/button_capture" android:text="照相" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout>

    java代码

    想要对摄像头进行一系列操作,包括获取图片,就要先获取Camera类,。

    public static Camera getCameraInstance(){ //安全获取camera类 Camera camera = null; try { camera = Camera.open(); } catch (Exception e){ } return camera; }

    创建预览类,用来预览摄像头捕获的内容,解释看注释。

    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); mCamera = camera; //通过构造方法,将获取的camera类传进来,进行绑定 mHolder = getHolder(); //设置回调 mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { //创建预览界面的方法,无需主动调用 try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { } } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { //当预览界面发生改变时会自动调用的方法, if (mHolder.getSurface() == null){ //预览界面不存在的情况 return; } // 界面发生改变时,停止预览,比如按下拍照的按钮 try { mCamera.stopPreview(); } catch (Exception e){ } //重新开始预览 try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e){ Log.d("error", "Error starting camera preview: " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }

    main_activity.java 文件的内容,具体看注释。

    public class MainActivity extends AppCompatActivity { private Camera mCamera; private CameraPreview mPreview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCamera = getCameraInstance(); //通过自己封装的方法,获取Camera类 // 创建自己创建的预览类 mPreview = new CameraPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview);//将预览类加入显示界面 Button button=findViewById(R.id.button_capture); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //设置按钮监听,实现点击按钮之后,进行拍照 mCamera.autoFocus(new Camera.AutoFocusCallback() { //自动聚焦 @Override public void onAutoFocus(boolean success, Camera camera) { // 从Camera捕获图片 mCamera.takePicture(null, null, mPicture); } }); } }); } public static Camera getCameraInstance(){ //安全获取camera类 Camera camera = null; try { camera = Camera.open(); } catch (Exception e){ } return camera; } private Camera.PictureCallback mPicture = new Camera.PictureCallback() { //添加拍照的回调对象mPicture,mCamera.takePicture的必要参数 //实现将拍照的图片存储到自己想要的目录 @Override public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = new File("/sdcard/" + System.currentTimeMillis()+".jpg"); //文件对象,指明路径 if (pictureFile == null){ Log.d("error", "Error creating media file, check storage permissions"); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); //文件流操作,进行存储 fos.write(data); fos.close(); } catch (FileNotFoundException e) { Log.d("error", "File not found: " + e.getMessage()); } catch (IOException e) { Log.d("error", "Error accessing file: " + e.getMessage()); } } }; @Override protected void onDestroy() { // 回收Camera资源,必须的 if(mCamera!=null){ mCamera.stopPreview(); mCamera.release(); mCamera=null; } super.onDestroy(); } }

    下面是拍照程序运行的截图: 该篇文章是我参考了大牛的博客以及android开发文档的例子才得以实现的,附上链接表示感谢: Android–使用Camera拍照 android开发文档------构建相机应用程序

    最新回复(0)