Android Camera Parameters 方法出错,求教

============问题描述============

public class PhotographActivity extends BaseActivity implements

SeekBar.OnSeekBarChangeListener, OnClickListener, Runnable {

private SeekBar zoomSet;// 调整焦距

private ImageView takePic, back, flash;// 按钮

private final int FLASH_AUTO = 0;// 自动闪光

private final int FLASH_OFF = 1;// 闪光灯关闭

private final int FLASH_ON = 2; // 闪光灯打开

private int flashImg[] = { R.drawable.light_auto_confirm,

R.drawable.light_off_confirm, R.drawable.light_on_confirm };// 闪光灯图标

private int zoom, maxZoom;// zoom现在焦距,maxZoom最大焦距

private boolean preview = false, flashOpen = false;// preview预览 flashOpen闪光灯

private Camera camera;// 硬件相机

private SurfaceView cameraBG;// 相机预览

@SuppressWarnings("unused")

private Uri videoFilePath;

// PopupWindow和AlertDialog都是Android对话框的内容,不同的是PopupWindow是阻塞式对话框

PopupWindow popupWindow;

Camera.Parameters parameters;// 照相机参数集

@Override

public void onCreate(Bundle savedInstanceState) {

if (!Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {// SD卡允许读写

Toast.makeText(PhotographActivity.this, "SD卡没有插入或不能读写",

Toast.LENGTH_LONG).show();

}

Window window = getWindow();

// 只要这个窗口是用户可见的,保持设备的屏幕打开及明亮。

window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

// 选择支持半透明模式,在有surfaceview的activity中使用。

window.setFormat(PixelFormat.TRANSLUCENT);

BaseActivity.isFullSreen = true;

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_photograph);

init();

}

@SuppressLint("NewApi")

private void init() {

takePic = (ImageView) findViewById(R.id.btn_picture);// 拍照

back = (ImageView) findViewById(R.id.btn_backcapter);// 返回

flash = (ImageView) findViewById(R.id.btn_flash);// 调整闪光效果

zoomSet = (SeekBar) findViewById(R.id.seekbar_focal);// 调整焦距

cameraBG = (SurfaceView) findViewById(R.id.camrea);// 相机预览

// 固定surfaceView的高宽

cameraBG.getHolder().setFixedSize((int) BaseActivity.ScreenW,

(int) BaseActivity.ScreenH);

// 设置该surfaceView不用自己维护缓冲区

cameraBG.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

// 设置surfaceView的回调函数

cameraBG.getHolder().addCallback(new SurfaceCallback());

zoomSet.setOnSeekBarChangeListener(this);

takePic.setOnClickListener(this);

back.setOnClickListener(this);

flash.setOnClickListener(this);

cameraBG.setOnClickListener(this);

}

private final class SurfaceCallback implements SurfaceHolder.Callback {

@Override

public void surfaceCreated(SurfaceHolder holder) {

if (camera != null) {

camera.release();// 相机释放

}

camera = Camera.open();// 打开相机

camera.setDisplayOrientation(90);// 旋转镜头

parameters = camera.getParameters();// 获取相机参数集

if (parameters.getFlashMode() == null) {

flash.setImageBitmap(BitmapFactory.decodeResource(

getResources(), flashImg[FLASH_OFF]));

Toast.makeText(PhotographActivity.this, "无闪光灯",

Toast.LENGTH_SHORT).show();

} else {

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

parameters.setPreviewSize(100, 120);// 设置预览照片的大小

parameters.setPictureFormat(ImageFormat.JPEG);//设置图片格式

parameters.setPictureSize(100, 120);// 设置照片的大小

camera.setParameters(parameters);

}

maxZoom = parameters.getMaxZoom();// 获取最大像素

zoomSet.setMax(maxZoom);// 设置最大像素

try {

camera.setPreviewDisplay(cameraBG.getHolder());// 设置相机预览

} catch (IOException e) {

e.printStackTrace();

}

camera.startPreview();// 开始预览

preview = true;

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if (camera != null) {

if (preview) {

camera.stopPreview();

}

camera.release();

}

}

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (camera != null && event.getRepeatCount() == 0) {

switch (keyCode) {

case KeyEvent.KEYCODE_CAMERA:

case KeyEvent.KEYCODE_DPAD_CENTER:

takPicture();

break;

case KeyEvent.KEYCODE_VOLUME_UP:

zoom = (zoom + 5) < maxZoom ? (zoom + 5) : maxZoom;

zoomSet.setProgress(zoom);

break;

case KeyEvent.KEYCODE_VOLUME_DOWN:

zoom = (zoom - 5) > 0 ? (zoom - 5) : 0;

zoomSet.setProgress(zoom);

break;

case KeyEvent.KEYCODE_BACK:

if (flashOpen) {

popupWindow.dismiss();

} else {

finish();

}

}

}

return true;

}

private final class TakePictureCallback implements PictureCallback {

@Override

public void onPictureTaken(byte[] data, Camera camera) { }

}

public void takPicture() {

camera.autoFocus(null);// 自动对焦

camera.takePicture(null, null, null, new TakePictureCallback());

}

@Override

public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser) {

zoom = zoomSet.getProgress();

parameters.setZoom(zoom);

camera.setParameters(parameters);

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_picture:

takPicture();

break;

case R.id.btn_backcapter:

if (flashOpen) {

popupWindow.dismiss();

} else {

finish();

}

break;

case R.id.btn_flash:

if (parameters.getFlashMode() == null) {

Toast.makeText(PhotographActivity.this, "无闪光灯",

Toast.LENGTH_SHORT).show();

} else if (parameters.getFlashMode() == Camera.Parameters.FLASH_MODE_AUTO) {

flash.setImageBitmap(BitmapFactory.decodeResource(

getResources(), flashImg[FLASH_OFF]));

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);

camera.setParameters(parameters);

} else if (parameters.getFlashMode() == Camera.Parameters.FLASH_MODE_OFF) {

flash.setImageBitmap(BitmapFactory.decodeResource(

getResources(), flashImg[FLASH_ON]));

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);

camera.setParameters(parameters);

} else if (parameters.getFlashMode() == Camera.Parameters.FLASH_MODE_ON) {

flash.setImageBitmap(BitmapFactory.decodeResource(

getResources(), flashImg[FLASH_AUTO]));

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

camera.setParameters(parameters);

}

break;

case R.id.camrea:

camera.autoFocus(null);

break;

}

}

@Override

protected void onPause() {

super.onPause();

zoomSet.setProgress(0);// 让SeekBar条初始化

}

public void run() {

while (true) {

if (camera != null) {

camera.autoFocus(null);

}

try {

Thread.sleep(400);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

程序中一旦屏蔽红字部分的代码  parameters.setPreviewSize(100, 120);// 设置预览照片的大小

parameters.setPictureFormat(ImageFormat.JPEG);//设置图片格式

parameters.setPictureSize(100, 120);// 设置照片的大小

就能正常的实现手机照相功能了

如果不屏蔽[                                      color=#FF0000] parameters.setPreviewSize(100, 120);// 设置预览照片的大小

parameters.setPictureFormat(ImageFormat.JPEG);//设置图片格式

parameters.setPictureSize(100, 120);// 设置照片的大小

[/color

Log日志则会报如下错误:

09-24 16:58:52.385: E/AndroidRuntime(25089): FATAL EXCEPTION: main

09-24 16:58:52.385: E/AndroidRuntime(25089): java.lang.RuntimeException: setParameters failed

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.hardware.Camera.native_setParameters(Native Method)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.hardware.Camera.setParameters(Camera.java:1449)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at app.example.takephoto.PhotographActivity$SurfaceCallback.surfaceCreated(PhotographActivity.java:117)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.SurfaceView.updateWindow(SurfaceView.java:543)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.SurfaceView.access$000(SurfaceView.java:81)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:671)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1892)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1070)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4296)

09-24 16:58:52.385: E/AndroidRuntime(25089):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)

也就是说上述parameters调用的三个方法的任意一个不屏蔽都会报错,小弟实在找不出解决方法。跪求大神指导

============解决方案1============

我以前遇到过这个问题,我回去查一下代码,呵呵~

============解决方案2============

参数设置失败,你参数没对,请仔细看下parameters.setPreviewSize的用法。

时间: 2024-11-05 06:02:15

Android Camera Parameters 方法出错,求教的相关文章

Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。

源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Came

Android SDK安装时出错“android Failed to rename directory”的解决方法

Android SDK安装时出错"android Failed to rename directory"的解决的方法 安装Android SDK时遇到Failed to rename directory E:\Java\Android SDK\android-sdk_r06-windows\android-sdk-windows\tools to E:\Java\Android SDK\android-sdk_r06-windows\android-sdk-windows\temp\T

Android Camera探究之路——起步

Android Camera探究之路--起步 Camera在手机中有着举足轻重的地位,无论是二维码还是照片.识别.都离不开摄像头,本文将对Android中的Camera进行全面解析. 权限镇楼: <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE&

【Android】Android Camera原始帧格式转换 —— 获取Camera图像(一)

 概述: 做过Android Camera图像采集和处理的朋友们应该都知道,Android手机相机采集的原始帧(RawFrame)默认是横屏格式的,而官方API有没有提供一个设置Camera采集图像的方向的方法,导致我们拿到原始帧后还需要再次对其进行转换为对应需求的数据,例如YUV的格式,图像的方向等(旋转多少度合适),下面我就粗略的介绍一下大致的流程,理解浅薄,大神请勿喷. 注意:当前还都是基于API<21的内容,如果压根不用android.hardware.Camera的话可能有区别,还没研

android Camera拍照

通过Camera进行拍照步骤: 调用Camera的open()方法打开相机.该方法默认打开后置摄像头.如果需要打开指定摄像头,可以为该方法传入摄像头ID. 调用Camera的getParameters()方法获取拍照参数.该方法返回一个Camera.Parameters对象 调用Camera.Parameters对象方法设置拍照参数 调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreviewDisplay(SurfaceHolder

Android Camera开发讲解

概述 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStore调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Camera程序. 基础知识 Android系统提供API来支持自定义相机拍照和系统拍照,以下是有关的类: Camera 该类提供基础API来使用设备上的相机,且该类可以为你的应用提供

Android Camera开发之基础知识篇

概述 Android框架支持设备的相机拍照和录像功能,你的应用可以直接调用系统的Camera应用来拍照或者录像(比如微信拍照),当然也可以利用Android系统提供的API开发一个Camera应用来实现相机拍照和录像功能(比如市面上流行的360相机).此篇文章主要记录相机开发有关的基础知识,以及带着自己的理解翻译Camera官方文档,如有翻译不恰当支出,还请指出改正.当然我会开一个有关相机开发的一个系列,该系列主要内容包括如下: 相机基本预览拍照功能. 实现相机的Flash,Hdr,滤镜,前后摄

Android Camera+SurfaceView实现自定义拍照

对Activity强制横屏,保证预览方向正确.使用OrientationEventListener监听设备方向,判断竖拍时,旋转照片后再保存,保证竖拍时预览图片和保存后的图片方向一致. 运行效果:                       代码: TestCameraActivity.java package com.example.testcamera; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream

android camera 学习

总体介绍 Android Camera框架从整体上看是一个client/service架构.有两个进程,一个是client进程,可以看成AP端 ,主要包括Java代码和一些native层的c/c++代码:另一个是service进程,属于服务端,是native c/c++代码, 主要负责和linux kernel中的camera driver交互,搜集linux kernel中driver层传上来的数据,并交给显示系统(surface)显示.client 和 service 进程通过Binder机