2016-01-31 67 views
0

好吧,我正在開發一個應用程序,它必須拍照並將它們發送到服務器進行處理。我需要一些圖像識別功能,最終有助於控制機器人。基本上我需要使用android設備作爲發送圖片的網絡攝像頭。我想通了套接字的一部分,但現在一些代碼擺弄了幾天後,我結束了與此:如何在android中沒有UI或用戶交互的情況下拍攝大量照片?

public class MainActivity extends AppCompatActivity { 
public static final String dTag = "DBG"; 
@SuppressWarnings("deprecation") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button trg = (Button)findViewById(R.id.trigger_btn); 
    trg.setOnClickListener(new Button.OnClickListener(){ 
     @Override 
     public void onClick(View v) 
     { 
      SurfaceHolder mSurfaceHolder = new SurfaceHolder() { 
       @Override 
       public void addCallback(Callback callback) { 

       } 

       @Override 
       public void removeCallback(Callback callback) { 

       } 

       @Override 
       public boolean isCreating() { 
        return false; 
       } 

       @Override 
       public void setType(int type) { 

       } 

       @Override 
       public void setFixedSize(int width, int height) { 

       } 

       @Override 
       public void setSizeFromLayout() { 

       } 

       @Override 
       public void setFormat(int format) { 

       } 

       @Override 
       public void setKeepScreenOn(boolean screenOn) { 

       } 

       @Override 
       public Canvas lockCanvas() { 
        return null; 
       } 

       @Override 
       public Canvas lockCanvas(Rect dirty) { 
        return null; 
       } 

       @Override 
       public void unlockCanvasAndPost(Canvas canvas) { 

       } 

       @Override 
       public Rect getSurfaceFrame() { 
        return null; 
       } 

       @Override 
       public Surface getSurface() { 
        return null; 
       } 
      }; 
      Camera.PictureCallback mCall = new Camera.PictureCallback() 
      { 
       @Override 
       public void onPictureTaken(byte[] data, Camera camera) 
       { 
        ByteArrayInputStream inputStream = new ByteArrayInputStream(data); 
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
        ImageView imW = (ImageView)findViewById(R.id.imView); 
        imW.setImageBitmap(bitmap); 
        Log.d(dTag, "" + data.length); 
       } 
      }; 
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      Camera mCamera; 
      mCamera = Camera.open(); 
      try { 
       mCamera.setPreviewDisplay(); 
       mCamera.startPreview(); 
      } 
      catch(IOException e){ 
       Log.d(dTag, "Cam is null!"); 
      } 
      mCamera.takePicture(null, null, mCall); 
      mCamera.stopPreview(); 
      mCamera.release(); 
     } 
    }); 

} 

現在,每當我按下按鈕,我看到在調試日誌「d /攝像頭:應用程序傳遞NULL表面「,我想這是因爲mSurfaceHolder沒有正確聲明。如果有人能指出我的問題是什麼以及如何解決它,我將不勝感激,因爲我對java沒有很好的理解,並且似乎無法找到任何可以在互聯網上運行的東西。

+1

的Android需要表面繪製預覽,由於隱私問題。在最近的機器人競賽中,我們使用了計算機視覺,最後我們只是在屏幕的右上角放一個小視圖。 – hexafraction

+0

@hexafraction是絕對正確的。你可以看看我的答案進一步的細節。 –

回答

相關問題