Android Camera.open()抛出java.lang.RuntimeException:无法连接到Camera服务
我正在我的应用程序中使用自定义照相机。我第一次加载应用程序时,它正在工作。但在那之后,它在camera.open()点崩溃;。我已授予清单文件中的所有权限。下面给出的是我的活动类Android Camera.open()抛出java.lang.RuntimeException:无法连接到Camera服务,android,exception,camera,Android,Exception,Camera,我正在我的应用程序中使用自定义照相机。我第一次加载应用程序时,它正在工作。但在那之后,它在camera.open()点崩溃;。我已授予清单文件中的所有权限。下面给出的是我的活动类 public class CustomCameraDemo extends Activity { private SurfaceView preview=null; private SurfaceHolder previewHolder=null; public Camera ca
public class CustomCameraDemo extends Activity {
private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
public Camera camera=null;
private boolean inPreview=false;
//ImageView image;
Bitmap bmp,itembmp;
static Bitmap mutableBitmap;
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
File imageFileName = null;
File imageFileFolder = null;
private MediaScannerConnection msConn;
Display d; int screenhgt,screenwdh;
ProgressDialog dialog;
Button save;
Button retake;
ImageView capture;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// image=(ImageView)findViewById(R.id.image);
capture=(ImageView)findViewById(R.id.capture);
save=(Button)findViewById(R.id.Save);
retake=(Button)findViewById(R.id.Retake);
preview=(SurfaceView)findViewById(R.id.surface);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
previewHolder.setFixedSize(getWindow().getWindowManager()
.getDefaultDisplay().getWidth(), getWindow().getWindowManager()
.getDefaultDisplay().getHeight());
save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
retake.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
camera.stopPreview();
}
});
capture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onBack();
}
});
}
@Override
public void onResume() {
super.onResume();
camera=Camera.open();
}
@Override
public void onPause() {
if (inPreview) {
camera.stopPreview();
}
camera.release();
camera=null;
inPreview=false;
super.onPause();
}
private Camera.Size getBestPreviewSize(int width, int height,Camera.Parameters parameters){
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPreviewSizes())
{
if (size.width<=width && size.height<=height)
{
if (result==null) {
result=size;
} else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return(result);
}
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(previewHolder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(CustomCameraDemo.this, t.getMessage(), Toast.LENGTH_LONG).show();
}
}
public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
camera.startPreview();
//inPreview=true;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
};
Camera.PictureCallback photoCallback=new Camera.PictureCallback(){
public void onPictureTaken(final byte[] data, final Camera camera){
dialog=ProgressDialog.show(CustomCameraDemo.this,"","Saving Photo");
new Thread(){
public void run(){
try{
Thread.sleep(1000);
}
catch(Exception ex){}
onPictureTake(data,camera);
}
}.start();
}
};
public void onPictureTake(byte[] data, Camera camera){
bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
savePhoto(mutableBitmap);
dialog.dismiss();
}
class SavePhotoTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... jpeg) {
File photo=new File(Environment.getExternalStorageDirectory(),"photo.jpg");
if (photo.exists()){
photo.delete();
} try {
FileOutputStream fos=new FileOutputStream(photo.getPath());
fos.write(jpeg[0]);
fos.close();
} catch (java.io.IOException e) {
Log.e("PictureDemo", "Exception in photoCallback", e);
}
return(null);
}
}
public void savePhoto(Bitmap bmp) {
imageFileFolder = new File(Environment.getExternalStorageDirectory(),"MyMedicalRecords");
imageFileFolder.mkdir();
FileOutputStream out = null;
Calendar c = Calendar.getInstance();
String date = fromInt(c.get(Calendar.MONTH))+ fromInt(c.get(Calendar.DAY_OF_MONTH))
+ fromInt(c.get(Calendar.YEAR))
+ fromInt(c.get(Calendar.HOUR_OF_DAY))
+ fromInt(c.get(Calendar.MINUTE))
+ fromInt(c.get(Calendar.SECOND));
imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
try { out = new FileOutputStream(imageFileName);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush(); out.close();
scanPhoto(imageFileName.toString());
out = null;
} catch (Exception e) { e.printStackTrace(); }
}
public String fromInt(int val) {
return String.valueOf(val);
}
public void scanPhoto(final String imageFileName) {
msConn = new MediaScannerConnection(CustomCameraDemo.this,new MediaScannerConnectionClient() {
public void onMediaScannerConnected() {
msConn.scanFile(imageFileName, null);
Log.i("msClient obj in Photo Utility","connection established");
}
public void onScanCompleted(String path, Uri uri) {
msConn.disconnect(); Log.i("msClient obj in Photo Utility","scan completed");
}
});
msConn.connect();
}
public void onBack(){ Log.e("onBack :","yes");
camera.takePicture(null,null,photoCallback);
//inPreview=false;
}
}
公共类CustomCameraDemo扩展活动{
private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
公共摄像机=空;
private boolean inPreview=false;
//图像视图图像;
位图bmp,项目bmp;
静态位图可变位图;
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
文件imageFileName=null;
File-imageFileFolder=null;
专用MediaScannerConnection msConn;
显示d;int screenhgt,screenwdh;
进程对话;
按钮保存;
重扣按钮;
图像视图捕获;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//image=(ImageView)findviewbyd(R.id.image);
capture=(ImageView)findViewById(R.id.capture);
save=(按钮)findViewById(R.id.save);
retake=(按钮)findViewById(R.id.retake);
预览=(SurfaceView)findViewById(R.id.surface);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE类型推送缓冲区);
previewHolder.setFixedSize(getWindow().getWindowManager())
.getDefaultDisplay().getWidth(),getWindow().getWindowManager()
.getDefaultDisplay().getHeight());
save.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
}
});
retake.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
camera.stopPreview();
}
});
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
onBack();
}
});
}
@凌驾
在Resume()上公共无效{
super.onResume();
camera=camera.open();
}
@凌驾
public void onPause(){
如果(inPreview){
camera.stopPreview();
}
相机。释放();
摄像机=零;
inPreview=false;
super.onPause();
}
私有照相机.Size getBestPreviewSize(int-width,int-height,Camera.Parameters){
Camera.Size结果=null;
对于(Camera.Size:parameters.getSupportedPreviewSizes())
{
如果在您的onPause()
方法中(size.width),您将永远不会调用camera.stopReview()
,因为inPreview
总是false
。我假设这会导致相机无法正确释放,因为它在stopReview()
中声明应在release()之前调用
。这将解释为什么只有在后续运行时才会出现此问题。不要低估logcati从logcat@seethalakshmi:selvin的意思是要求您发布logcat错误,以便这里的人能够以更好的方式帮助您。