我是Android的新手,但我正在尝试构建一个使用后置摄像头的AR应用程序(使用camera2),并且我正在尝试向该方向显示位置。目前我正试图显示一个地方的位置。
如果我单独使用相机视图,它可以正常工作。如果我使用两个视图,但我没有在叠加视图中进行任何计算,它也可以。如果我进行任何计算,即使在AsyncTask中,一旦启动AsyncTask工作负载,我就会收到CAMERA_DISCONNECTED错误。
以下是我文件的要点:
ArDisplayView.java(相机):https://gist.github.com/Eteru/27af46e745287bf85942c5b6e0259126
OverlayView.java:https://gist.github.com/Eteru/27f050d7432c7e58565f43e7e7af660c
MainActivity类:
public class MainActivity extends Activity {
private static final int MY_PERMISSIONS_REQUEST_CODE = 50;
ArDisplayView arDisplay = null;
OverlayView arContent = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.e(DEBUG_TAG, "Requesting camera permissions");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_CODE);
}
FrameLayout arViewPane = findViewById(R.id.ar_view_pane);
arDisplay = new ArDisplayView(this, this);
arViewPane.addView(arDisplay);
arContent = new OverlayView(this);
arViewPane.addView(arContent);
}
@Override
protected void onResume() {
super.onResume();
arDisplay.openBackgroundThread();
if (arDisplay.isAvailable()) {
arDisplay.setupCamera(arDisplay.getWidth(), arDisplay.getHeight());
arDisplay.openCamera();
} else {
arDisplay.setSurfaceTextureListener(arDisplay);
}
}
@Override
public void onPause() {
arDisplay.closeCamera();
arDisplay.closeBackgroundThread();
super.onPause();
}
}
在我看来,如果我理解AsyincTask的工作方式,计算不应该影响UI线程,这让我感到困惑。
有人可以帮我理解我做错了吗?
答案 0 :(得分:0)
我认为是因为你致电:
Camera.Parameters params = Camera.open().getParameters();
在AsyncTask
内,我认为Camera
已经打开,不是吗?打开相机后,您可以将其传递给AsyncTask
,而无需再次打开它。