【创新项目实训】Android移动开发教学app案例之camera(一)

本文详述了Android移动开发中相机功能的设计与实现,包括相机预览、拍照设置、界面设计和图片处理。介绍了如何创建CameraPreview类以处理相机预览,如何在AndroidManifest中申请权限,以及如何实现聚焦、曝光补偿和闪光灯的设置。同时,文章还探讨了如何在设置菜单中动态加载和应用用户偏好。
摘要由CSDN通过智能技术生成

功能设计

camera不仅需要有基础的拍照功能,还需要对拍摄的照片进行一系列处理,包括但不仅限于图片抗扭曲,曝光度,聚焦等。

  1. 相机预览功能
  2. 拍照的偏好设置,如闪光灯,聚焦,曝光补偿
  3. 相机可随设备旋转,拍摄横屏和竖屏的照片
  4. 拍照后保存在手机的pictures文件夹
  5. 可以预览拍摄的照片
  6. 图片抗扭曲处理

界面设计

初稿由负责视觉的李同学进行设计,在后续的编程过程中会有些许修改

在这里插入图片描述

相机预览

这里我们需要一个CameraPreview.java类
SurfaceView是一个包含有Surface的View,而Surface用来处理直接呈现在屏幕上的内容
成员变量mHolder保存这个Surface的“持有者”,而只有Holder才能对对应的Surface进行修改
成员变量mCamera保存相机Camera的实例
对于SurfaceView来说,这个View创建时就会创建Surface,而当Surface创建时就会触发surfaceCreated(),所以我们就要在surfaceCreated()中打开相机、开始预览,并将预览帧交给Surface处理。getCameraInstance()是一个获取并打开相机的方法。Camera的setPreviewDisplay()方法就是告知将预览帧数据交给谁,这里当然就是这个Surface的Holder了。最后用startPreview()开启相机。

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
   
    private static final String TAG = "CameraPreview";
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context) {
   
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
    }

    private static Camera getCameraInstance() {
   
        Camera c = null;
        try {
   
            c = Camera.open();
        } catch (Exception e) {
   
            Log.d(TAG, "camera is not available");
        }
        return c;
    }

    public void surfaceCreated(SurfaceHolder holder) {
   
        mCamera = getCameraInstance();
        try {
   
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
   
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
   
        mHolder.removeCallback(this);
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
   
    }
}

还需要在AndroidManifest中申请和声明相机

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

拍照设置

主要想做的设置是聚焦,曝光补偿和闪光灯,现在新建preferences.xml来添加条目

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <ListPreference
        android:defaultValue="auto"
        android:key="flash_mode"
        android:title="闪光灯" />
    <ListPreference
        android:key="focus_mode"
        android:title="对焦模式" />
    <ListPreference
        android:defaultValue="0"
        android:key="exposure_compensation"
        android:title="曝光补偿" />
</PreferenceScreen>

使用Android推荐的PreferenceFragment作为相机偏好设置的菜单。PreferenceFragment继承自Fragment,我们只用向其添加设置的内容,而不用关心具体设置参数用户交互设计等繁琐的内容。

新建SettingsFragment类:

public class SettingsFragment 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值