2016-11-10 15 views
0

camera2 apiを使用して簡単なフラッシュライトアプリケーションを作成します。 私は、次のコードを使用しています:Android camera2 api openCameraエラー

FlashLightUtilForL util = new FlashLightUtilForL(getApplicationContext()); 
util.turnOnFlashLight(); 

しかし、それは何もしません:

public class FlashLightUtilForL { 
private CameraCaptureSession mSession; 
private CaptureRequest.Builder mBuilder; 
private CameraDevice mCameraDevice; 
private CameraManager mCameraManager; 

public FlashLightUtilForL(Context context) { 
    try { 
     mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     //here to judge if flash is available 
     CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics("0"); 
     boolean flashAvailable = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); 
     if (flashAvailable) { 
      mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null); 
     } else { 
      //todo: throw Exception 
     } 
     //mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

class MyCameraDeviceStateCallback extends CameraDevice.StateCallback { 

    @Override 
    public void onOpened(CameraDevice camera) { 
     mCameraDevice = camera; 
     //get builder 
     try { 
      mBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL); 
      //flash on, default is on 
      mBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO); 
      mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH); 
      List<Surface> list = new ArrayList<Surface>(); 
      SurfaceTexture mSurfaceTexture = new SurfaceTexture(1); 
      Size size = getSmallestSize(mCameraDevice.getId()); 
      mSurfaceTexture.setDefaultBufferSize(size.getWidth(), size.getHeight()); 
      Surface mSurface = new Surface(mSurfaceTexture); 
      list.add(mSurface); 
      mBuilder.addTarget(mSurface); 
      camera.createCaptureSession(list, new MyCameraCaptureSessionStateCallback(), null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onDisconnected(CameraDevice camera) { 

    } 

    @Override 
    public void onError(CameraDevice camera, int error) { 

    } 
} 

private Size getSmallestSize(String cameraId) throws CameraAccessException { 
    Size[] outputSizes = mCameraManager.getCameraCharacteristics(cameraId) 
      .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) 
      .getOutputSizes(SurfaceTexture.class); 
    if (outputSizes == null || outputSizes.length == 0) { 
     throw new IllegalStateException(
       "Camera " + cameraId + "doesn't support any outputSize."); 
    } 
    Size chosen = outputSizes[0]; 
    for (Size s : outputSizes) { 
     if (chosen.getWidth() >= s.getWidth() && chosen.getHeight() >= s.getHeight()) { 
      chosen = s; 
     } 
    } 
    return chosen; 
} 

/** 
* session callback 
*/ 
class MyCameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback { 

    @Override 
    public void onConfigured(CameraCaptureSession session) { 
     mSession = session; 
     try { 
      mSession.setRepeatingRequest(mBuilder.build(), null, null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onConfigureFailed(CameraCaptureSession session) { 

    } 
} 

public void turnOnFlashLight() { 
    try { 
     mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH); 
     mSession.setRepeatingRequest(mBuilder.build(), null, null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void turnOffFlashLight() { 
    try { 
     mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
     mSession.setRepeatingRequest(mBuilder.build(), null, null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void close() { 
    if (mCameraDevice == null || mSession == null) { 
     return; 
    } 
    mSession.close(); 
    mCameraDevice.close(); 
    mCameraDevice = null; 
    mSession = null; 
} 
} 

そして、ここでは、私は私の主な活動から、このクラスを使用する方法です。カメラを開いているときにエラーがあることがわかりましたが、このエラーが何の原因であるかについてのヒントはありません。これは、3回連続で印刷されて

:その後、一度

11-10 15:27:32.881 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value manual 
11-10 15:27:32.881 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value fullscan 
11-10 15:27:32.881 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value nashville 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value hefe 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value valencia 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value xproll 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value lofi 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value sierra 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value walden 
11-10 15:27:32.882 11801-11801/com.flashlight W/ArrayUtils: Ignoring invalid value normal 

と:

11-10 15:27:32.909 11801-11801/com.flashlight I/CameraManager: Using legacy camera HAL. 
11-10 15:27:32.911 11801-12695/com.flashlight W/Camera: An error occurred while connecting to camera: 0 

私もカメラ2で、この特定のエラーに関連する何かを見つけることができませんでしたここにログです。何が問題を引き起こす可能性がありますか? このデバイスは5.0.2のRedmi note 2で、カメラには懐中電灯があり、マニフェストにカメラ権限が追加されています。

答えて

0

問題がCameraDevice.TEMPLATE_MANUALであると思われます。すべてのデバイスがこれをサポートするとは限りません。また、デバイスがレガシーサポートを使用している場合、これはうまく動作しないと私は思います。 CameraDevice.TEMPLATE_PREVIEWに切り替えてください。

また、お持ちでないときにSufaceTextureをリリースすることを忘れないでください。

+0

onOpenedメソッドは呼び出されません。 'CameraDevice.TEMPLATE_MANUAL'または 'SufaceTexture'にすることはできません。 –

関連する問題