好吧,我正在开发一个应用程序,它必须拍照并将它们发送到服务器进行处理。我需要这个来进行一些图像识别,最终有助于控制机器人。基本上我需要使用 Android 设备作为发送图片的网络摄像头。我弄清楚了套接字部分,但现在在摆弄了一些代码几天后,我最终得到了这个:
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/Camera:应用程序传递了 NULL 表面”,我认为这是因为 mSurfaceHolder 未正确声明。如果有人能指出我的问题是什么以及如何解决它,我将不胜感激,因为我对 java 没有很好的理解,并且似乎无法在互联网上找到任何可用的东西。
最佳答案
几个问题-
您没有表面 View ,必须从表面 View 获取表面支架。您只是无法为此目的创建"new"。
您没有在
mCamera.setPreviewDisplay();
中传递任何surfaceolder
,因此系统无法决定在哪里显示。您的方法本地匿名内部类完全是错误的。
教程链接:http://examples.javacodegeeks.com/android/core/ui/surfaceview/android-surfaceview-example/
关于java - 如何在 Android 中没有 UI 或用户交互的情况下拍摄大量照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117995/