Android Camera.open()抛出java.lang.RuntimeException:无法连接到Camera服务

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

我正在我的应用程序中使用自定义照相机。我第一次加载应用程序时,它正在工作。但在那之后,它在camera.open()点崩溃;。我已授予清单文件中的所有权限。下面给出的是我的活动类

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错误,以便这里的人能够以更好的方式帮助您。