好吧,我正在開發一個應用程序,它必須拍照並將它們發送到服務器進行處理。我需要一些圖像識別功能,最終有助於控制機器人。基本上我需要使用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沒有很好的理解,並且似乎無法找到任何可以在互聯網上運行的東西。
的Android需要表面繪製預覽,由於隱私問題。在最近的機器人競賽中,我們使用了計算機視覺,最後我們只是在屏幕的右上角放一個小視圖。 – hexafraction
@hexafraction是絕對正確的。你可以看看我的答案進一步的細節。 –