2017-10-23 3 views
0

私はAndroidの初心者ですが、バックカメラ(camera2を使用)を使用するARアプリケーションを構築しようとしています。その上にその方向の位置を表示しようとしています。現時点で私はただ1つの場所の場所を表示しようとしています。Androidで2つのビュー(カメラとセンサー)を正しく使用する方法は?

私はカメラビューだけを使用すると動作します。私は両方のビューを使用するが、私はオーバーレイビューで計算を行うことはありませんが、同様に動作します。私が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

私はあなたが呼んでからだと思う:あなたのAsyncTaskインサイド

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

は、私はCameraが既に開いていると思いますが、それはないですか?カメラを開くと、2回目を開かずにAsyncTaskに渡すことができます。

+0

あなたが正しいです、それは明らかにカメラを2回開いた、ひどく書いたチュートリアルで見つけたコードでした。カメラビューの実装をcamera2に変更した後、私はその時点で理解していなかった "あなたはあまりにも多くのカメラインスタンスが開かれています"と翻訳されたエラーがありました。それは意図したとおりに動作します、ありがとうございます。 – Eteru

+0

素晴らしい!アプリのおかげで、いいデザインです。 –

関連する問題