2017-06-09 7 views
1

単純なAndroid Thingプロジェクトを実行しようとしていますが、キャプチャした画像をディスプレイにキャプチャしてレンダリングするだけです。画像認識部を使わずにサンプルコードを(https://github.com/googlecodelabs/androidthings-imageclassifier/tree/master/imageclassifier-add-camera)から取りました。しかし、私は次のエラーが表示されますAndroidでrpi3カメラv2でカメラが初期化されていないもの

これはカメラを検出したようですが、カメラから画像をキャプチャできません。誰もAndroidThingsプラットフォームで同様の問題に直面しましたか?カメラで

public class CameraHandler { 
    private static final String TAG = CameraHandler.class.getSimpleName(); 

    public static final int IMAGE_WIDTH = 320; 
    public static final int IMAGE_HEIGHT = 240; 

    private static final int MAX_IMAGES = 1; 
    private CameraDevice mCameraDevice; 
    private CameraCaptureSession mCaptureSession; 
    /** 
    * An {@link android.media.ImageReader} that handles still image capture. 
    */ 
    private ImageReader mImageReader; 
    // Lazy-loaded singleton, so only one instance of the camera is created. 
    private CameraHandler() { 
    } 
    private static class InstanceHolder { 
     private static CameraHandler mCamera = new CameraHandler(); 
    } 
    public static CameraHandler getInstance() { 
     return InstanceHolder.mCamera; 
    } 
    /** 
    * Initialize the camera device 
    */ 
    public void initializeCamera(Context context, 
           Handler backgroundHandler, 
           ImageReader.OnImageAvailableListener imageAvailableListener) { 
     // Discover the camera instance 
     CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     String[] camIds = {}; 
     try { 
      camIds = manager.getCameraIdList(); 
     } catch (CameraAccessException e) { 
      Log.d(TAG, "Cam access exception getting IDs", e); 
     } 
     if (camIds.length < 1) { 
      Log.d(TAG, "No cameras found"); 
      return; 
     } 
     String id = camIds[0]; 
     Log.d(TAG, "Using camera id " + id); 
     // Initialize the image processor 
     mImageReader = ImageReader.newInstance(IMAGE_WIDTH, IMAGE_HEIGHT, 
       ImageFormat.JPEG, MAX_IMAGES); 
     mImageReader.setOnImageAvailableListener(
       imageAvailableListener, backgroundHandler); 
     // Open the camera resource 
     try { 
      manager.openCamera(id, mStateCallback, backgroundHandler); 
     } catch (CameraAccessException cae) { 
      Log.d(TAG, "Camera access exception", cae); 
     } 
    } 
    /** 
    * Callback handling device state changes 
    */ 
    private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { 
     @Override 
     public void onOpened(@NonNull CameraDevice cameraDevice) { 
      Log.d(TAG, "Opened camera."); 
      mCameraDevice = cameraDevice; 
     } 
     @Override 
     public void onDisconnected(@NonNull CameraDevice cameraDevice) { 
      Log.d(TAG, "Camera disconnected, closing."); 
      closeCaptureSession(); 
      cameraDevice.close(); 
     } 
     @Override 
     public void onError(@NonNull CameraDevice cameraDevice, int i) { 
      Log.d(TAG, "Camera device error, closing."); 
      closeCaptureSession(); 
      cameraDevice.close(); 
     } 
     @Override 
     public void onClosed(@NonNull CameraDevice cameraDevice) { 
      Log.d(TAG, "Closed camera, releasing"); 
      mCameraDevice = null; 
     } 
    }; 
    /** 
    * Begin a still image capture 
    */ 
    public void takePicture() { 
     if (mCameraDevice == null) { 
      Log.w(TAG, "Cannot capture image. Camera not initialized."); 
      return; 
     } 
     // Here, we create a CameraCaptureSession for capturing still images. 
     try { 
      mCameraDevice.createCaptureSession(
        Collections.singletonList(mImageReader.getSurface()), 
        mSessionCallback, 
        null); 
     } catch (CameraAccessException cae) { 
      Log.d(TAG, "access exception while preparing pic", cae); 
     } 
    } 
    /** 
    * Callback handling session state changes 
    */ 
    private CameraCaptureSession.StateCallback mSessionCallback = 
      new CameraCaptureSession.StateCallback() { 
       @Override 
       public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
        // The camera is already closed 
        if (mCameraDevice == null) { 
         return; 
        } 
        // When the session is ready, we start capture. 
        mCaptureSession = cameraCaptureSession; 
        triggerImageCapture(); 
       } 
       @Override 
       public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { 
        Log.w(TAG, "Failed to configure camera"); 
       } 
      }; 
    /** 
    * Execute a new capture request within the active session 
    */ 
    private void triggerImageCapture() { 
     try { 
      final CaptureRequest.Builder captureBuilder = 
        mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
      captureBuilder.addTarget(mImageReader.getSurface()); 
      captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); 
      //captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO); 
      Log.d(TAG, "Capture request created."); 
      mCaptureSession.capture(captureBuilder.build(), mCaptureCallback, null); 
     } catch (CameraAccessException cae) { 
      Log.d(TAG, "camera capture exception"); 
     } 
    } 
    /** 
    * Callback handling capture session events 
    */ 
    private final CameraCaptureSession.CaptureCallback mCaptureCallback = 
      new CameraCaptureSession.CaptureCallback() { 
       @Override 
       public void onCaptureProgressed(@NonNull CameraCaptureSession session, 
               @NonNull CaptureRequest request, 
               @NonNull CaptureResult partialResult) { 
        Log.d(TAG, "Partial result"); 
       } 
       @Override 
       public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
               @NonNull CaptureRequest request, 
               @NonNull TotalCaptureResult result) { 
        session.close(); 
        mCaptureSession = null; 
        Log.d(TAG, "CaptureSession closed"); 
       } 
      }; 

    private void closeCaptureSession() { 
     if (mCaptureSession != null) { 
      try { 
       mCaptureSession.close(); 
      } catch (Exception ex) { 
       Log.e(TAG, "Could not close capture session", ex); 
      } 
      mCaptureSession = null; 
     } 
    } 

    /** 
    * Close the camera resources 
    */ 
    public void shutDown() { 
     closeCaptureSession(); 
     if (mCameraDevice != null) { 
      mCameraDevice.close(); 
     } 
    } 
} 
+0

カメラのケーブルが正しく接続されていることを確認してください(完全に装着され、後ろ向きではありません)。 – Devunwired

答えて

1

落とし穴below-提供 メインカメラハンドラコード: マニフェストファイルのパーミッションをチェックして、デバイスを再起動します。 カメラ権限は、アプリケーションのインストール後ではなく、デバイスのインストール後と再起動後に付与されます。 https://developer.android.com/things/sdk/index.html

関連する問題