今天整了一个android的开启相机的东西,整了一天代码,网上看了很久,也算是搞出来了,泪奔~~
首先创建一个android项目,然后设置
屏幕全屏,去标题栏等等.
Window window = getWindow();
// 去除标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置高亮
// window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 设置窗口半透明
// getWindow().setFormat(PixelFormat.TRANSLUCENT);
我这里没用用系统提供的布局main.xml,而是自己做一个布局,FrameLayout f1 = new FrameLayout(this);之后设置触摸监听用来拍照。
f1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ca.autoFocus(myAutoFocusCallback);
ca.takePicture(null,null, pictureCallback);
return false;
}
});
setContentView(f1);主类把这个设置为主试图
接下来写相机类,这里主要用到Camera,Bitmap用来存储拍照数据,保存到sd卡中
public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.i("yao", "onpictureTaken");
Toast.makeText(getApplicationContext(), "正在保存...",
Toast.LENGTH_SHORT).show();
// 用BitmapFactory.decodeByteArray()方法可以把相机传回的裸数据转换成Bitmap对象
mb = BitmapFactory.decodeByteArray(data, 0, data.length);
System.out.println("正在保存小片中");
// 接下来的工作就是把Bitmap保存成一个存储卡中的文件
//文件名中不能有“:”
File file = new File("/sdcard/Android/data/"
+ new DateFormat().format("yyyy-MM-dd_hh-mm-ss",
Calendar.getInstance(Locale.CHINA)) + ".jpg");
try {
file.createNewFile();
System.out.println("创建完毕");
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
mb.compress(Bitmap.CompressFormat.PNG,100, bos);
System.out.println("搞定");
bos.flush();
bos.close();
Toast.makeText(getApplicationContext(), "图片保存完毕,在data/my_phone/目录中",
Toast.LENGTH_LONG).show();
//重新启动照相机
ca.stopPreview();
ca.startPreview();
//cav = new CameraView(MainActivity.this);
} catch (Exception e) {
e.printStackTrace();
}
}
相机视图类用来捕捉屏幕,并即时反馈,这就可以实现照相
// 照相视图
class CameraView extends SurfaceView {
private SurfaceHolder holder = null;
// 构造函数
public CameraView(Context context) {
super(context);
Log.i("yao", "CameraView");
// 操作surface的holder
holder = this.getHolder();
// 创建SurfaceHolder.Callback对象
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止预览
ca.stopPreview();
System.out.println("停止阅览了 释放资源,并滞空!");
// 释放相机资源并置空
ca.release();
ca = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 当预览视图创建的时候开启相机
ca = Camera.open();
try {
// 设置预览
ca.setPreviewDisplay(holder);
} catch (IOException e) {
// 释放相机资源并置空
ca.release();
ca = null;
}
}
// 当surface视图数据发生变化时,处理预览信息
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
setCameraDisplayOrientation(MainActivity.this, 0, ca);
// 获得相机参数对象
Camera.Parameters parameters = ca.getParameters();
// 设置格式
// parameters.setPictureFormat(PixelFormat.JPEG);
// 设置预览大小,这里我的测试机是Milsstone所以设置的是854x480
// parameters.setPreviewSize(854, 480);
// 设置自动对焦
// parameters.setFocusMode("auto");
// 设置图片保存时的分辨率大小
parameters.setPictureSize(1296, 2304);
parameters.set("rotation", 90);
// 给相机对象设置刚才设定的参数
ca.setParameters(parameters);
// 开始预览
ca.startPreview();
}
});
// 设置Push缓冲类型,说明surface数据由其他来源提供,而不是用自己的Canvas来绘图,在这里是由摄像头来提供数据
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
parameters这里的参数我们需要按照自己手机的规格来设定,否则,在ca.setParameters(parameters);时会报错,我不太了解我的手机的规格,干脆没有更改,只改了相片的大小,这些都没关系。
刚开始的时候我的屏幕是左右颠倒的,这个我弄了好久也不知道原因,然后用了网上一段代码才搞定,原理大概是前后置摄像头有所不同,还有一个成像原理,总之调整数据就对了。
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
//检查前置摄像头方法
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
现在这个app已经可以开始照相了,相片放在sdcard/Android/data中,大家可以自己更改路径。ok,源码上传了,可能很乱。
分享到:
相关推荐
本资源"android照相机应用源码"提供了一个可以直接运行的Android相机应用示例,这对于初学者和有经验的开发者来说都是一个宝贵的参考资料。 首先,我们需要了解Android相机API的基础知识。在Android 3.0(API级别11...
在Android平台上,开发一...总结来说,这个项目展示了如何利用Android原生接口实现相机预览和人脸检测,涵盖了Android相机API的使用、图像处理、坐标转换、界面绘制等多个技术点,是Android开发中的一个重要实践案例。
在Android 4.1(Jelly Bean)系统中,相机功能是用户界面和硬件设备之间的桥梁,它负责捕捉...这个压缩包提供的"Camerase4.1相机"文件应该包含上述提到的关键类和接口的实现,是学习和调试Android相机功能的宝贵资源。
在Android平台上,自定义相机功能是一项常见的需求,尤其对于那些希望提供独特拍摄体验的应用开发者来说。本教程将探讨如何在Android应用中实现自定义相机的连拍功能,这对于摄影爱好者或者需要快速捕捉连续图像的...
在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...
综上所述,“android安卓相机改革源码”涵盖了Android相机功能的多个方面,包括使用最新的API、优化UI、代码重构、资源替换、权限管理、图片处理、性能优化和错误处理。通过理解并掌握这些知识点,开发者可以构建出...
在Android开发中,调用系统相机以及自定义相机功能是常见的需求,特别是在涉及到...通过不断实践和调试,可以打造出满足特定需求的相机应用。在实际项目中,可以根据性能和功能需求选择使用Camera API或Camera2 API。
在Android平台上,自定义相机是一项常见的功能,它允许开发者根据特定需求定制相机界面和功能,以提供更加个性化和丰富的用户体验。...通过不断实践和调试,你可以创建出满足特定需求的自定义相机应用。
这涉及到对Android相机API的深入理解和自定义视图的构建。本文将详细介绍如何实现这一功能。 首先,我们要了解Android的相机框架。从Android 3.0(API Level 11)开始,系统提供了Camera2 API,这是一个更为先进、...
总结,自定义Android相机涉及到多个层次的技术,包括理解相机API、处理图像显示、控制相机参数、捕获图像和处理权限。Camera2 API提供了更多灵活性,但也需要更多的代码来实现。在实践中,开发者需要不断学习和调试...
MTK8788 相机调试手册 本资源为 MTK8788 相机调试手册,提供了 MTK8788 相机驱动程序的移植指南。该手册适用于 Android 系统,旨在帮助开发者快速掌握 MTK8788 相机驱动程序的移植。 知识点: 1. MTK8788 相机...
10. **测试与调试**:进行单元测试、集成测试和兼容性测试,确保应用在不同设备和Android版本上运行正常。使用Android Profiler工具进行性能分析和内存泄漏检查。 以上是实现一个类似美颜相机(美图秀秀应用)的...
本文将深入探讨"android 相机源码"的相关知识点,帮助你理解和改进Android相机应用的内部工作原理。 首先,Android相机源码主要由两部分组成:Android框架层的API和硬件抽象层(HAL)的实现。框架层API是应用程序...
本文将深入探讨Android相机程序的核心知识点,包括API的使用、相机权限管理、预览显示、图片捕获与存储、以及用户体验优化。 首先,Android提供了Camera API和Camera2 API两个主要的接口来访问和控制设备的摄像头。...
压缩包内OpencvWitchUVCCamera.apk实现功能如下 1、安卓主板运行外接USB摄像头 ...3、解决Android10以上系统运行崩溃问题(插入USB摄像头崩溃,Android7系统无崩溃问题) 4、包含RK3568主板开发相关资料
在学习和实践过程中,阅读相关的博客和文档,以及不断试验和调试,对于理解Android相机调用和自定义相机至关重要。希望这个Demo源码能帮助你更好地掌握这些技术,并鼓励你提出宝贵的反馈和建议,共同提升Android开发...
在Android开发中,自定义相机(Camera)是一个常见的需求,特别是在开发涉及...通过不断的优化和调试,可以打造出符合用户需求的高质量相机应用。在遇到异常时,开发者应及时查找原因并修复,确保应用的稳定性和性能。
首先,我们来了解Android相机API的基本概念。Android提供了两种相机访问方式:Camera API1和Camera2 API。API1是早期版本,适用于Android 2.x到4.3,而Camera2 API自Android 5.0(Lollipop)开始引入,提供了更强大...