`
企鹅木白
  • 浏览: 32821 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

android相机调试

阅读更多
今天整了一个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,源码上传了,可能很乱。
0
0
分享到:
评论

相关推荐

    UVCCamera+Opencv+RK3568+Android12+调试记录

    压缩包内OpencvWitchUVCCamera.apk实现功能如下 1、安卓主板运行外接USB摄像头 ...3、解决Android10以上系统运行崩溃问题(插入USB摄像头崩溃,Android7系统无崩溃问题) 4、包含RK3568主板开发相关资料

    Android系统级深入开发—移植与调试].韩超.梁泉

    《Android系统级深入开发——移植与调试》是一本全面介绍Android系统级开发的作品,全书以移植和调试为重点。Android具有一个庞大的软件系统,任何开发者都难以掌握系统的每一个细节。因此,如何高效地理解和开发...

    三星Galaxy EK-GC 100 android智能照相机的logcat

    即使打开开发者选项,允许调试等,在三星Galaxy EK-GC 100 android智能照相机上,仍然不能使用IDE的logcat,更不要想使用断点调试了,还好有这个apk来在相机上记录,不然要改bug,可得累死啊。更多关于调试三星...

    delphi xe6 android 调用照相机摄像头拍照片

    delphi xe6 android 调用照相机摄像头拍照片,简单非常实用的原代码,无特定组件,真机调试没问题.

    成都臻识相机 opensdk_r3_20210414.rar

    成都臻识相机 车牌识别相机 OPENSDK 开发包 最新R3版本相机

    Android调用系统相机进行拍照

    调用系统相机进行拍照demo,代码是自己跟着慕课网课程《Android摄像头...需要注意的是在真机中调试的时候除了在AndroidManifest.xml中申请权限外还需要手动在真机的应用权限中手动开启相机和存储权限,否则会出现闪退。

    android相机控制包括摄像录像

    自己根据很多代码写的,从这里下载花了很多分,搞了几天,还刷了个夜,调试的很辛苦,终于可用,为回馈CSDN网友上传上来,

    android开发揭秘PDF

    2.3.3 调试HelloAndroid 2.4 小结 第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4...

    Android——仿美图秀秀和IOS系统的相机胶卷.zip

    例如,我们使用了Android Studio作为开发工具,它提供了一系列的功能和工具,如代码编辑器、调试器和模拟器,使得开发人员可以快速开发和测试安卓应用。我们还使用了Java作为主要的编程语言,它是安卓应用开发的主流...

    android 通过usb调用UVC摄像头

    android USB调用摄像头,经过半月时间终于搞定了, 在网上找了好多,还有日文注释的 希望段友多多包涵,首先手机支持uvc 测试机 荣耀8. 我也是在网上找啊找,如何谁在学习接触这方面,共同学习,

    Android自动聚焦、拍照、缩放标准大小的源码实现

    android手机自动聚焦、然后拍照,拍照的照片会缩放到标准大小。本人的源码,调试心得见:http://blog.csdn.net/yanzi1225627/article/details/7926994

    [中文]Basic4android新手指南_第1章从这里开始

    开发者可以在Basic4android环境下利用Android模拟器或Android物理设备(利用USB连接或通过本地网络连接)进行程序开发和调试。 Basic4android带有丰富的库函数,支持所有的Android 核心特性,因而使其非常容易进行...

    Android入门中文教程

    内容简介 Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。...丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件

    新版Android开发教程.rar

    � 基于 QEMU 开发的模拟器调试手段不十分丰富,只支持通话、SMS等,速度慢。 � 暂不具备 Push Mail 和 Office(DataViz 、 QuickOffice 计划近期推出 ) 功能,目前主要面向的是普通消费 者 用户,对商业用户支持...

    [中文]Basic4android新手指南_第5章屏幕大小与分辨率

    开发者可以在Basic4android环境下利用Android模拟器或Android物理设备(利用USB连接或通过本地网络连接)进行程序开发和调试。 Basic4android带有丰富的库函数,支持所有的Android 核心特性,因而使其非常容易进行...

    《Android应用开发揭秘》附带光盘代码.

     2.3.3 调试HelloAndroid  2.4 小结  第二部分 基础篇  第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U...

    Android应用开发揭秘pdf高清版

    2.3.3 调试HelloAndroid 2.4 小结 第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4...

    [14本经典Android开发教程]-3-Android SDK 中文开发文档

    · 丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件 Android 架构 下图显示的是Android操作系统的主要组件。每一部分将会在下面具体描述。 已上传2本: [14本经典Android...

Global site tag (gtag.js) - Google Analytics