package com.jxd.huazi;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;public class Take extends Activity {
ImageView ivFocus;
boolean is = true;
byte[] imageData; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ivFocus = new ImageView(this);
final Preview pr = new Preview(this);
RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
this.addContentView(pr, rl);
pr.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (is) {
pr.takePicture();
} else {
pr.camera.startPreview();
is = true; File f = new File("/sdcard/temp.png");
FileOutputStream fout = null;
try {
if (!f.exists())
f.createNewFile();
fout = new FileOutputStream(f);
fout.write(imageData);
fout.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fout != null) {
fout.close();
fout = null;
}
} catch (Exception e) {
e.printStackTrace();
}
} }
}
});
} class Preview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder;
private Camera camera;
// 创建一个PictureCallback对象,并实现其中的onPictureTaken方法
private PictureCallback pictureCallback = new PictureCallback() {
// 该方法用于处理拍摄后的照片数据 @Override
public void onPictureTaken(byte[] data, Camera camera) {
// data参数值就是照片数据,将这些数据以key-value形式保存,以便其他调用该Activity的程序可
// 以获得照片数据
is = false;
getIntent().putExtra("bytes", data);
setResult(20, getIntent());
// 停止照片拍摄
imageData = data;
camera.stopPreview();
// camera = null;
// 关闭当前的Activity
}
}; // Preview类的构造方法
public Preview(Context context) {
super(context);
// 获得SurfaceHolder对象
holder = getHolder();
// 指定用于捕捉拍照事件的SurfaceHolder.Callback对象
holder.addCallback(this);
// 设置SurfaceHolder对象的类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} // 开始拍照时调用该方法
public void surfaceCreated(SurfaceHolder holder) {
// 获得Camera对象
camera = Camera.open();
try {
// 设置用于显示拍照影像的SurfaceHolder对象
camera.setPreviewDisplay(holder);
} catch (IOException exception) {
// 释放手机摄像头
camera.release();
camera = null;
}
} // 停止拍照时调用该方法
public void surfaceDestroyed(SurfaceHolder holder) {
// 释放手机摄像头
camera.release();
} // 拍照状态变化时调用该方法
public void surfaceChanged(final SurfaceHolder holder, int format,
int w, int h) {
try {
Camera.Parameters parameters = camera.getParameters();
// 设置照片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 根据屏幕方向设置预览尺寸
if (getWindowManager().getDefaultDisplay().getOrientation() == 0)
parameters.setPreviewSize(h, w);
else
parameters.setPreviewSize(w, h);
// 设置拍摄照片的实际分辨率,本例中的分辨率是1024×768
parameters.setPictureSize(1280, 800);
// 设置保存的图像大小
camera.setParameters(parameters);
// 开始拍照
camera.startPreview();
// 准备用于表示对焦状态的图像
ivFocus.setImageResource(R.drawable.sc);
LayoutParams layoutParams = new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
ivFocus.setScaleType(ScaleType.CENTER);
addContentView(ivFocus, layoutParams);
ivFocus.setVisibility(VISIBLE);
// 自动对焦
camera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
// success为true表示对焦成功,改变对焦状态图像
ivFocus.setImageResource(R.drawable.sr);
}
}
});
} catch (Exception e) {
}
} // 停止拍照,并将拍摄的照片传入PictureCallback接口的onPictureTaken方法
public void takePicture() {
if (camera != null) {
camera.takePicture(null, null, pictureCallback);
}
}
}
}
这是我拍照的代码!   不知道是哪错了!  希望各位前辈指点下!

解决方案 »

  1.   

    在不同的机子上报不同的异常!   很郁闷!
    06-29 10:17:12.269: WARN/System.err(16523): java.lang.RuntimeException: setParameters failed
    06-29 10:17:12.269: WARN/System.err(16523):     at android.hardware.Camera.native_setParameters(Native Method)
    06-29 10:17:12.269: WARN/System.err(16523):     at android.hardware.Camera.setParameters(Camera.java:914)
    06-29 10:17:12.269: WARN/System.err(16523):     at com.jxd.huazi.Take$Preview.surfaceChanged(Take.java:165)
    06-29 10:17:12.269: WARN/System.err(16523):     at android.view.SurfaceView.updateWindow(SurfaceView.java:554)
    06-29 10:17:12.269: WARN/System.err(16523):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:353)
    06-29 10:17:12.269: WARN/System.err(16523):     at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
    06-29 10:17:12.269: WARN/System.err(16523):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.View.draw(View.java:6989)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.widget.FrameLayout.draw(FrameLayout.java:361)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.View.draw(View.java:6989)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.widget.FrameLayout.draw(FrameLayout.java:361)
    06-29 10:17:12.279: WARN/System.err(16523):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewRoot.draw(ViewRoot.java:1546)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1282)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1884)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.os.Handler.dispatchMessage(Handler.java:99)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.os.Looper.loop(Looper.java:138)
    06-29 10:17:12.279: WARN/System.err(16523):     at android.app.ActivityThread.main(ActivityThread.java:3701)
    06-29 10:17:12.279: WARN/System.err(16523):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-29 10:17:12.289: WARN/System.err(16523):     at java.lang.reflect.Method.invoke(Method.java:507)
    06-29 10:17:12.289: WARN/System.err(16523):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
    06-29 10:17:12.289: WARN/System.err(16523):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
    06-29 10:17:12.289: WARN/System.err(16523):     at dalvik.system.NativeStart.main(Native Method)
      

  2.   



    06-29 10:24:33.219: W/System.err(17340): java.lang.RuntimeException: setParameters failed
    06-29 10:24:33.219: W/System.err(17340):  at android.hardware.Camera.native_setParameters(Native Method)
    06-29 10:24:33.219: W/System.err(17340):  at android.hardware.Camera.setParameters(Camera.java:914)
    06-29 10:24:33.219: W/System.err(17340):  at com.jxd.huazi.Take$Preview.surfaceChanged(Take.java:167)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.SurfaceView.updateWindow(SurfaceView.java:554)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.SurfaceView.dispatchDraw(SurfaceView.java:353)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.View.draw(View.java:6989)
    06-29 10:24:33.219: W/System.err(17340):  at android.widget.FrameLayout.draw(FrameLayout.java:361)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.View.draw(View.java:6989)
    06-29 10:24:33.219: W/System.err(17340):  at android.widget.FrameLayout.draw(FrameLayout.java:361)
    06-29 10:24:33.219: W/System.err(17340):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewRoot.draw(ViewRoot.java:1546)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1282)
    06-29 10:24:33.219: W/System.err(17340):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1884)
    06-29 10:24:33.219: W/System.err(17340):  at android.os.Handler.dispatchMessage(Handler.java:99)
    06-29 10:24:33.219: W/System.err(17340):  at android.os.Looper.loop(Looper.java:138)
    06-29 10:24:33.219: W/System.err(17340):  at android.app.ActivityThread.main(ActivityThread.java:3701)
    06-29 10:24:33.219: W/System.err(17340):  at java.lang.reflect.Method.invokeNative(Native Method)
    06-29 10:24:33.219: W/System.err(17340):  at java.lang.reflect.Method.invoke(Method.java:507)
    06-29 10:24:33.219: W/System.err(17340):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
    06-29 10:24:33.219: W/System.err(17340):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
    06-29 10:24:33.219: W/System.err(17340):  at dalvik.system.NativeStart.main(Native Method)

      

  3.   

    public void surfaceChanged(final SurfaceHolder holder, int format,
                    int w, int h) {
                try {
                    Camera.Parameters parameters = camera.getParameters();
                    // 设置照片格式
                    parameters.setPictureFormat(PixelFormat.JPEG);
                    // 根据屏幕方向设置预览尺寸
                    if (getWindowManager().getDefaultDisplay().getOrientation() == 0)
                        parameters.setPreviewSize(h, w);
                    else
                        parameters.setPreviewSize(w, h);
                    // 设置拍摄照片的实际分辨率,本例中的分辨率是1024×768
                    parameters.setPictureSize(1280, 800);
                    // 设置保存的图像大小
                    camera.setParameters(parameters);
                    // 开始拍照
                    camera.startPreview();
                    // 准备用于表示对焦状态的图像
                    ivFocus.setImageResource(R.drawable.sc);
                    LayoutParams layoutParams = new LayoutParams(
                            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
                    ivFocus.setScaleType(ScaleType.CENTER);
                    addContentView(ivFocus, layoutParams);
                    ivFocus.setVisibility(VISIBLE);
                    // 自动对焦
                    camera.autoFocus(new AutoFocusCallback() {
                        @Override
                        public void onAutoFocus(boolean success, Camera camera) {
                            if (success) {
                                // success为true表示对焦成功,改变对焦状态图像
                                ivFocus.setImageResource(R.drawable.sr);
                            }
                        }
                    });
                } catch (Exception e) {
                }
            }
    好像是这句代码出现异常了!    能否给个解决的方法?