android - Camera.open() 抛出 java.lang.RuntimeException : Fail to connect to camera service

标签 android exception camera

我在我的应用程序中使用自定义相机。我第一次加载该应用程序时它正在工作。但之后它在 Camera.open(); 处崩溃。我已授予 list 中的所有权限下面给出的文件是我的 Activity 类

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; 
            } 

    }

最佳答案

在您的 onPause() 方法中,您永远不会调用 camera.stopPreview(),因为 inPreview 始终为 false。我认为这导致相机无法正确释放,如 API docs 中所述。 stopPreview() 应该在 release() 之前调用。这可以解释为什么您只在后续运行中遇到问题。

关于android - Camera.open() 抛出 java.lang.RuntimeException : Fail to connect to camera service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8986374/

相关文章:

java - 在预期的情况下处理 NumberFormatException 的正确方法是什么?

python - Selenium WebDriver - 处理 StaleElementReferenceException (Python)

python - Pygame 相机跟随 2d 平铺游戏

Android检测软键盘关闭

android - 平移、缩放或旋转的 subview 消失

java - 如何将 XML 配置转换为 Java

python - 打开 cv 关闭相机

build.gradle.kts 中的 androidTest Groovy 模拟

android 搜索不工作

java - CWAC-相机在触摸屏上拍照