各位大神大家好,小弟手头有个小项目,现在有个问题,我启动相机拍照,拍完以后退出的时候会报一个:
Fail to connect to camera service的错误,错误行在启动相机的地方。
我很奇怪的就是为什么我把activity finish掉了但是会再启动一次相机?!求各位大神给我解释,十万火急,今日之内结贴!下面贴代码:
P.S.代码不是我一个人写的,也不是同一个时间写的,所以很凌乱,各位勿喷,在此感谢!
package com.dbke.cuit.camera;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.Toast;
import edu.dbke.cuit.Activity.R;
import edu.dbke.cuit.Activity.UploadPicActivity;public class CameraActivity extends NoSearchActivity {
private static final String TAG = "CameraActivity";
private SurfaceView surfaceView;
private Camera camera;
private boolean preview;
private ImageButton take_picture;
private ImageButton switch_video;


private final int COMMON_DIALOG = 0;
private PathDescription pd; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//
// 设置全屏
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 高亮 setContentView(R.layout.camera_view); ButtonClickingListener buttonlistener = new ButtonClickingListener();
surfaceView = (SurfaceView) this.findViewById(R.id.camera_surface); take_picture = (ImageButton) findViewById(R.id.take_picture);
    take_picture.setBackgroundColor(Color.BLACK);
switch_video = (ImageButton) findViewById(R.id.switch_video);
    switch_video.setBackgroundColor(Color.BLACK);
take_picture.setOnClickListener(buttonlistener);
switch_video.setOnClickListener(buttonlistener);
surfaceView.getHolder().setFixedSize(176, 144); // 设置分辨率
/* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(new SurfaceCallback()); } private final class SurfaceCallback implements SurfaceHolder.Callback { @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) { } @Override
public void surfaceCreated(SurfaceHolder holder) {
try {
if(camera==null)
{
camera = Camera.open();
}else
{
Toast.makeText(CameraActivity.this, "相机正在使用中", 1).show();
}
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(display.getWidth(), display
.getHeight());// 设置预览照片的大小
parameters.setPreviewFrameRate(3);// 每秒3帧
parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
parameters.set("jpeg-quality", 85);// 照片质量
parameters.setPictureSize(display.getWidth(), display
.getHeight());// 设置照片的大小
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());// 通过SurfaceView显示取景画面
camera.startPreview();// 开始预览
preview = true; } catch (IOException e) {
Log.e(TAG, e.toString());
} } @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_MENU:
camera.autoFocus(null);// 自动对焦
break; case KeyEvent.KEYCODE_CAMERA:
case KeyEvent.KEYCODE_DPAD_CENTER:
camera.takePicture(null, null, new TakePictureCallback());
break;
case KeyEvent.KEYCODE_BACK:



//此处一执行就会报错
CameraActivity.this.finish();
break;
} }
return true;
} private final class TakePictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
File file = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
FileOutputStream outStream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, outStream);
outStream.close();
camera.stopPreview();
camera.startPreview();// 开始预览

pd = new PathDescription();
pd.setpath(file.getAbsolutePath());
CameraActivity.this.showDialog(COMMON_DIALOG);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
} private final class ButtonClickingListener implements View.OnClickListener {
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(CameraActivity.this, R.string.sdcarderror, 1)
.show();
return;
}
try {
switch (v.getId()) {
case R.id.take_picture:
take_picture
.setBackgroundResource(R.drawable.btn_ic_video_record);
camera.takePicture(null, null, new TakePictureCallback());
break;
case R.id.switch_video:
Intent intent = new Intent();
intent.setClass(CameraActivity.this, VideoActivity.class);
startActivity(intent);
CameraActivity.this.finish();
break;
} } catch (Exception e) {
Toast.makeText(CameraActivity.this, R.string.error, 1).show();
Log.e(TAG, e.toString());
}
} } /**
 * 判断是否立即上传
 */

@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub

Dialog dialog = null;
switch(id) {
case COMMON_DIALOG:
Builder b = new AlertDialog.Builder(this);
b.setMessage("是否及时上传");
b.setPositiveButton("确定", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent intent = CameraActivity.this.getIntent();
Bundle bundle = new Bundle();
bundle.putString("path", pd.getpath());
intent.putExtras(bundle);
CameraActivity.this.setResult(8787, intent);

//此处一执行就会报错
CameraActivity.this.finish();
}
});
b.setNegativeButton("仅储存", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub

}
});
dialog = b.create();
break;
}
return dialog;
}

private class PathDescription {
private String filePath;
private void setpath(String path) {
this.filePath = path;
}
private String getpath() {
return filePath;
}
}
}
十万火急啊!小弟在此先谢过各位能给我建议的大哥大姐了!

解决方案 »

  1.   

    问题解决了,原因是自己2了在之前那个Activity跳转这个的时候,本想用startActivityForResult结果用成了startActivity,不过,为什么会出现自己有调用了一次这个我还是不清楚原因,终归就是自己学得不够扎实啊……好了,不管各位是不是看过,小弟都要再次感谢各位。结贴吧……
      

  2.   

    感谢分享教训:本想用startActivityForResult结果用成了startActivity