2012-01-24 24 views
2

私は自分のアプリケーションでカスタムカメラを使用しています。初めてアプリケーションをロードしましたが、その後はクラッシュしていました。私は以下のマニフェストfile.givenにすべての権限を与えているポイントCamera.openは();.私のActivityクラスは常にfalseあるinPreviewとしてあなたがcamera.stopPreview()を呼び出すことはありませんあなたのonPause()方法でCamera.open()throwing java.lang.RuntimeException:カメラサービスへの接続に失敗しました

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

    } 
+1

は私がlogcat – Selvin

+0

の力を過小評価しないでください。 –

+1

@seethalakshmiからのエラーについて知るようになったlogcat – Ghost

答えて

3

です。私はrelease()の前にstopPreview()が呼び出されるべきであることをAPI docsで述べているので、カメラが正しく解放されないと思います。これは、後続の実行で問題が発生した理由を説明します。ここの人々がより良い方法であなたを助けることができるように、logcatエラーを投稿するお聞きしました何を意味するのかselvin:

+0

おかげで、あなたは私を救う – Fahar

関連する問題