如何在Android中正确使用2个视图(摄像头和传感器)?

时间:2017-10-23 17:54:43

标签: java android user-interface camera

我是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线程,这让我感到困惑。

有人可以帮我理解我做错了吗?

1 个答案:

答案 0 :(得分:0)

我认为是因为你致电:

Camera.Parameters params = Camera.open().getParameters();

AsyncTask内,我认为Camera已经打开,不是吗?打开相机后,您可以将其传递给AsyncTask,而无需再次打开它。