【http://phenom.iteye.com/blog/1170616#comments 预览】
找了很多,其实这两种最普遍,一种是单张拍摄,一种连续预览。
第一种:单张:不多说看代码大家都懂:
---------------------------------------------------------------------
public class TakePicTestActivity extends Activity {
private PreViewThird pv = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
pv = new PreViewThird(this);
setContentView(pv);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return pv.onKeyDown(keyCode, event);
}
}
-------------------------------------------------------------------
public class PreViewThird extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder = null;
private Camera mCamera = null;
public PreViewThird(Context context) {
super(context);
holder = this.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Size optsize = this.getOptimalPreviewSize(sizes, w, h);
// mFrameWidth = optsize.width;
// mFrameHeight = optsize.height;
parameters.setPreviewSize(optsize.width, optsize.height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
public void surfaceCreated(SurfaceHolder holder) {
// 启动服务
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
CameraInfo cameraInfo = new CameraInfo();
int cameraCount = Camera.getNumberOfCameras();
if (cameraCount > 0) {
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
mCamera = Camera.open(camIdx);
if (mCamera != null) {
break;
}
}
}
}
if (mCamera == null) {
mCamera = Camera.open();
}
if (mCamera == null) {
return;
}
try {
mCamera.setPreviewDisplay(holder);// 设置预览
} catch (IOException e) {
mCamera.release();// 释放
mCamera = null;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
if (null != mCamera) {
mCamera.setPreviewCallback(null); // !!这个必须在前,不然退出出错
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA) {
if (mCamera != null) {
mCamera.takePicture(null, null, pic);
}
}
return super.onKeyDown(keyCode, event);
}
// 拍照后输出图片
public Camera.PictureCallback pic = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
File file = new File(Environment.getExternalStorageDirectory(),
"ljh.jpg");
FileOutputStream outStream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, outStream);
outStream.close();
//
camera.stopPreview();
camera.startPreview();
} catch (Exception e) {
}
}
};
}
已经是很全了并且可以开启前摄像头.
第二种:
http://phenom.iteye.com/blog/1170616#comments 不过这第二种暂时显示是两个surfaceview ,如果显示一个大家自己尝试
分享到:
相关推荐
在Android开发中,有时我们需要实现一些特殊的相机功能,比如不预览的拍照或者后台拍照。这些需求可能出现在一些需要高效能、低资源消耗或者隐私保护的场景。本篇将详细探讨如何实现这样的功能。 首先,要理解“不...
在Android平台上,无预览拍照是指在用户拍摄照片时,不显示实时的摄像头预览画面。这种功能在某些特定的应用场景下很有用,比如后台拍摄、安全应用或者是为了节省资源和提升性能。以下是对实现这一功能的详细讲解。 ...
在Android开发中,TextureView是一种可以显示动态图形的视图,它可以用来实现实时的视频流,例如摄像头预览和拍照功能。本教程将详细讲解如何利用TextureView来实现这一目标,并讨论如何优化用户界面。 首先,理解...
在Android平台上,有时候开发者需要实现一个功能,即在用户不知情的情况下进行拍照,这通常被称为“无预览静默拍照”。这种技术常用于自动化测试、安全监控或者后台数据获取等场景。下面我们将深入探讨如何在Android...
本文将深入探讨如何使用Camera2 API来实现预览和拍照功能。 一、Camera2 API概述 Camera2 API是Android Lollipop(API级别21)引入的,旨在提供对相机硬件更直接和全面的访问。它包含了一系列类和接口,如...
android 8.0 webview 拍照、预览、二维码扫描比较完整的例子,对于权限检查控制,有比较完善的提示写法。可以下载后,直接在android studid上运行,编译版本和target版本均是SDK android 8.0,最低版本设置成了...
在Android平台上,无预览拍照是指在用户界面上不显示相机预览,而是直接拍摄照片并保存到设备上的功能。这种技术通常用于后台拍摄或者在特定应用需求下,比如需要节省资源或者避免用户干扰的情况。以下是对实现无...
本文将深入探讨如何在Android中实现自定义相机,包括预览、拍照以及切换前后置摄像头的功能。 一、Android Camera API基础 Android提供了两个主要的相机API:Camera API1(在API level 9引入)和Camera2 API(在...
本文将深入探讨如何使用`Android Studio`和`Camera2` API来实现实时预览以及拍照功能,并将照片以`.fpg`格式保存到手机中。 首先,我们需要在`build.gradle`文件中添加必要的依赖项,确保项目可以使用`Camera2` API...
在Android开发中,自定义相机预览界面的拉伸问题是一个常见的挑战,尤其是在处理不同设备和屏幕方向变化时。本文将深入探讨这个问题,并提供解决方案。 首先,理解问题的根本原因至关重要。当我们在Android应用中...
在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...
这个API允许开发者控制摄像头参数,如分辨率、焦距、曝光等,同时提供预览和拍照功能。 2. **SurfaceView**:SurfaceView是Android中的一个视图组件,它提供了独立于应用主线程的显示表面。在处理视频预览时,...
在Android平台上实现后台连续静默拍照是一项技术挑战,涉及到多个关键知识点。首先,我们要理解Android系统的权限管理和运行机制,然后是相机API的使用,以及如何在后台执行任务。以下是对这些核心概念的详细阐述。 ...
在Android 2.3(Gingerbread)系统中,实现静默拍照,即不显示预览界面的功能,是一项挑战性的任务。这是因为Android的Camera API在早期版本中主要设计为与用户交互,通常需要一个Camera Preview来展示拍摄画面。...
"Android 无预览拍照功能" Android 无预览拍照功能是指在 Android 应用程序中,通过后台拍照并保存图片,而不需要预览拍照结果的功能。这个功能可以在一些特定的场景中使用,例如在拍照后自动保存图片,不需要用户...
在Android系统中,调用相机进行预览和拍照是移动应用开发中常见的功能,尤其对于社交媒体、生活记录类的应用更是必不可少。本节我们将深入探讨如何在Android应用中实现这一功能,涉及的知识点包括相机API的使用、...
在API Level 9(Android 2.3)及更高版本中,我们可以使用`Camera`类来实现摄像头的预览、拍照和录像功能。而在API Level 14(Android 4.0)引入的`Camera2` API则提供了更高级的功能和更好的性能,但同时对设备硬件...
在Android应用开发中,有时我们需要实现一些特殊的功能,如调用相机拍照、截取界面视图,甚至在没有用户预览的情况下进行静默拍照。这些功能在特定场景下有着广泛的应用,例如创建自定义相机应用或者需要后台拍摄的...
总结,Android下使用相机拍照涉及到多个环节,从权限获取到相机预览,再到拍照和图像处理。理解并掌握这些知识点,可以灵活地实现各种相机功能,为用户提供更好的拍照体验。在实际开发中,还需要关注兼容性问题,...
在Android平台上,开发一款应用来实现前置摄像头的预览功能,并进行实时的人脸检测与人脸区域亮度分析是一项常见的任务。这个任务涉及到多个Android系统级别的API和技术,包括Camera API、SurfaceView、OpenCV以及...