2014-10-20 15 views
1

我正在拍攝一張照片。當我離開它時,它目前工作正常,但是當我嘗試更改它以使圖片嘗試以不同方法拍攝(而不是由onClick()方法激活)時,它每次都會出錯。目前,工作代碼如下:如何在Android中的onCreate方法中拍攝照片而不是onClick?

public class Testing123 extends Activity { 

    private SurfaceView preview=null; 
    private SurfaceHolder previewHolder=null; 
    private Camera camera=null; 
    private boolean inPreview=false; 
    private boolean cameraConfigured=false; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     preview = (SurfaceView)findViewById(R.id.preview); 
     previewHolder = preview.getHolder(); 
     previewHolder.addCallback(surfaceCallback); 
     previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     testing(); //HERE is where I am testing, but cannot get it to work. [See part 2] 
    } 

    public void onResume() { 
     super.onResume(); 
     if (camera == null) { 
      camera=Camera.open(); 
      L.m("Camera open in onResume"); 
     } 
     startPreview(); 
    } 

    public void onPause() { 
     if (inPreview) { 
      camera.stopPreview(); 
     } 
     camera.release(); 
     camera=null; 
     inPreview=false; 
     super.onPause(); 
    } 

    public boolean onCreateOptionsMenu(Menu menu) { 
     new MenuInflater(this).inflate(R.menu.options, menu); 
     return(super.onCreateOptionsMenu(menu)); 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.getItemId() == R.id.camera) { 
      if (inPreview) { 
       camera.takePicture(null, null, photoCallback); //THIS IS WHERE THE PHOTO IS BEING TAKEN 
       inPreview=false; 
      } 
     } 

     return(super.onOptionsItemSelected(item)); 
    } 

    private void initPreview(int width, int height) { 
     if (camera != null && previewHolder.getSurface() != null) { 
      try { 
       camera.setPreviewDisplay(previewHolder); 
      } 
      catch (Throwable t) { 
       Log.e("PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t); 
      } 

      if (!cameraConfigured) { 
       Camera.Parameters parameters=camera.getParameters(); 
       setCameraResolution(); //Leaving this method out for now 
       camera.setParameters(parameters); 
       cameraConfigured=true; 
      } 

     } 
    } 

    private void startPreview() { 
     camera.startPreview(); 
    } 

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
     public void surfaceCreated(SurfaceHolder holder) { 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
      initPreview(width, height); 
      startPreview(); 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
     } 
    }; 

    Camera.PictureCallback photoCallback = new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      //This part is no problem, I am able to write it to the file and use the data from the output of the camera 
     } 
    } 

問題是當我嘗試做一個新的呼叫,因爲你在onCreate()方法看,所謂的測試();每當我打電話給測試方法,這是試圖繞過需要按下按鈕,它錯誤了。下面是測試()代碼:

private void testing() { 
    try{ 
     cameraConfigured=true; 
     inPreview=true; 
     camera=Camera.open(); 
     Camera.Parameters parameters=camera.getParameters(); 
     setCameraResolution(); 
     camera.setParameters(parameters); 
     camera.setPreviewDisplay(previewHolder); 
     startPreview(); 
     camera.takePicture(null, null, photoCallback); //THIS IS WHERE THE PHOTO IS BEING TAKEN 
    } catch (Exception e) { 
     L.m(e.toString()); 
    } 
} 

而且它的錯誤出在那之後,具體說: 了java.lang.RuntimeException:takePicture失敗

只是重申,它需要的照片就好了,當我點擊一個圖標/按鈕這樣做,我試圖完成的是它運行該代碼,而無需點擊按鈕/圖標。我覺得這是非常簡單的東西,我想念,我似乎無法弄清楚。

+1

你不能在'onCreate'內進行交互。 – ytRino 2014-10-20 10:24:21

+0

嗯,我明白,但我更多地要求調用一個需要點擊事件的事件。 IE瀏覽器,我可以製作一個按鈕,呼籲敬酒說:「嗨!」通過按鈕命中,但我也可以通過調用onCreate()中的方法來生成敬酒,從而使同樣的敬酒發生。我正在試圖找出如何通過在沒有用戶干預的情況下發生的自動事件來完成後者。 – Silmarilos 2014-10-20 17:26:12

+0

如何在'SurfaceHolder.Callback#onSurfaceCreated'或'#onSurfaceChanged'上調用'testing()'? – ytRino 2014-10-21 06:05:10

回答

1

致電testing()SurfaceHolder.Callback#onSurfaceCreated
:-)