Android Camera app开发
一、AndroidManifest.xml 修改
在Android开发中,使用摄像头一般涉及到Android的Camera API或者Camera2 API。以下是一个使用Camera API的简单示例:
首先,需要在AndroidManifest.xml文件中添加相机的权限:
<manifest ... >
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
...
</manifest>
然后,在Activity中创建一个SurfaceView并将其设置为Camera的预览视图:
public class CameraActivity extends Activity implements SurfaceHolder.Callback {
private Camera camera;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (camera != null) {
camera.startPreview();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
}
}
在上述代码中,我们首先在AndroidManifest.xml文件中请求了使用摄像头的权限。然后在CameraActivity中创建了一个SurfaceView,这个SurfaceView被用作摄像头预览的视图。
当surfaceCreated()方法被调用时,我们打开摄像头并将SurfaceHolder设置为摄像头的预览视图。当surfaceChanged()方法被调用时,我们开始摄像头的预览。当surfaceDestroyed()方法被调用时,我们停止预览并释放摄像头资源。
另外,为了避免在主线程中进行耗时操作,建议在后台线程中打开摄像头,同时需要处理摄像头被其他应用占用的情况。
以下是一个使用Android Camera2 API在App中使用摄像头的基本示例:
首先,在AndroidManifest.xml中添加相机使用权限:
<uses-permission android:name="android.permission.CAMERA"/>
然后,创建一个Camera2BasicFragment类,该类在onCreateView中创建一个TextureView用于预览摄像头的画面:
public class Camera2BasicFragment extends Fragment {
private TextureView textureView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_camera2_basic, container, false);
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
textureView = (TextureView) view.findViewById(R.id.texture);
}
@Override
public void onResume() {
super.onResume();
startBackgroundThread();
if (textureView.isAvailable()) {
openCamera(textureView.getWidth(), textureView.getHeight());
} else {
textureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
private final TextureView.SurfaceTextureListener mSurfaceTextureListener
= new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
openCamera(width, height);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) {
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture texture) {
}
};
}
在上述代码中,我们首先在AndroidManifest.xml文件中请求了使用摄像头的权限。然后在Camera2BasicFragment类中创建了一个TextureView,这个TextureView被用作摄像头预览的视图。
当TextureView可用时,我们会调用openCamera()方法打开摄像头。这个方法的实现需要获取CameraManager服务,检查摄像头权限,并打开摄像头。
注意:以上代码只展示了基础的使用摄像头预览功能,实际应用中可能还需要处理其他功能,如拍照,视频录制等,也需要处理各种权限和设备兼容性问题。
另外,为了避免在主线程中进行耗时操作,建议在后台线程中打开摄像头,同时需要处理摄像头被其他应用占用的情况。
二、Android摄像头应用开发流程
在Android开发中,使用摄像头功能是比较常见的需求。以下是一个简单的Android摄像头应用开发流程和源码:
首先,我们需要在AndroidManifest.xml中添加摄像头和写入外部存储的权限:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
接着,创建一个CameraActivity类,该类负责处理摄像头的开启和关闭:
public class CameraActivity extends AppCompatActivity {
private Camera camera;
private SurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
if (checkCameraHardware(this)) {
camera = getCameraInstance();
CameraPreview cameraPreview = new CameraPreview(this, camera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(cameraPreview);
}
}
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
return true;
} else {
return false;
}
}
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c;
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
private void releaseCamera(){
if (camera != null){
camera.release();
camera = null;
}
}
}
创建一个CameraPreview类,该类继承自SurfaceView并实现SurfaceHolder.Callback接口,用于管理摄像头的预览:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d("CameraPreview", "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// empty. Take care of releasing the Camera preview in your activity.
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mHolder.getSurface() == null){
return;
}
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d("CameraPreview", "Error starting camera preview: " + e.getMessage());
}
}
}
以上代码实现了一个基础的Android摄像头应用,可以打开摄像头并显示预览画面。但是需要注意的是,这个例子中并没有处理动态权限请求,实际开发中需要对Android 6.0及以上版本的动态权限进行处理。另外,对于Camera的使用,Google建议使用Camera2 API,因为Camera API在Android