###前提・実現したいこと
androidstudioにてカメラをプレビューするシステムを作っています。
CameraManagerClassのopenCameraを実装中に以下のエラーメッセージが発生しました。実行時のエラーです。
エラーメッセージ ![エラーログ全てです](39c6bc145644ae347d6b758ca04d9775.png) 3-06 15:02:09.131 3199-3228/com.example.camera2test2 E/EGL_emulation: tid 3228: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH) 03-06 15:02:09.135 3199-3199/com.example.camera2test2 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.camera2test2, PID: 3199 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.app.Activity
###該当のソースコード
package com.example.camera2test2; import android.app.Activity; import android.content.Context; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.params.StreamConfigurationMap; import android.os.Bundle; import android.os.HandlerThread; import android.util.Size; import android.view.Surface; import android.view.TextureView; import android.widget.Toast; import java.util.Collections; public class MainActivity extends Activity { private Camera mCamera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextureView textureView = (TextureView) findViewById(R.id.texture_view); textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { mCamera.open(); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } }); mCamera = new Camera(textureView); } class Camera { private Activity mActivity; private CameraDevice mCamera; private TextureView mTextureView; private Size mCameraSize; private CaptureRequest.Builder mPreviewBuilder; private CameraCaptureSession mPreviewSession; private CameraDevice.StateCallback mCameraDeviceCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCamera = camera; createCaptureSession(); } @Override public void onDisconnected(CameraDevice camera) { camera.close(); mCamera = null; } @Override public void onError(CameraDevice camera, int i) { camera.close(); mCamera = null; } }; CameraCaptureSession.StateCallback mCameraCaptureSessionCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession Session) { mPreviewSession = Session; updatePreview(); } @Override public void onConfigureFailed(CameraCaptureSession Session) { Toast.makeText(MainActivity.this, "onConfigured", Toast.LENGTH_SHORT).show(); } }; private void updatePreview() { mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); HandlerThread thread = new HandlerThread("CameraPreview"); thread.start(); android.os.Handler backgroundHandler = new android.os.Handler(thread.getLooper()); try { mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void createCaptureSession() { if (!mTextureView.isAvailable()) { return; } SurfaceTexture texture = mTextureView.getSurfaceTexture();//このメソッドは、このビューで使用されるSurfaceTextureを返します。 texture.setDefaultBufferSize(mCameraSize.getWidth(), mCameraSize.getHeight()); Surface surface = new Surface(texture);//surfaceクラスは生バッファをスクリーンに映すためのハンドル。 try { mPreviewBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); } catch (CameraAccessException e) { e.printStackTrace(); } mPreviewBuilder.addTarget(surface);//生成したPreviewの出力先SurfaceをaddTargetで加えています。 try { mCamera.createCaptureSession(Collections.singletonList(surface), mCameraCaptureSessionCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } public Camera(TextureView textureView) { mTextureView = textureView; } public void open() { try { CameraManager manager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE); for (String cameraId : manager.getCameraIdList()) { CameraCharacteristics characterristics = manager.getCameraCharacteristics(cameraId); if (characterristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) { StreamConfigurationMap map = characterristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mCameraSize = map.getOutputSizes(SurfaceTexture.class)[0]; manager.openCamera(cameraId, mCameraDeviceCallback, null); return; } } } catch (CameraAccessException e) { e.printStackTrace(); } } } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.camera2test2"> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.camera.autofocus"/> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.camera2.full"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.camera2test2.MainActivity"> <TextureView android:id="@+id/texture_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
###試したこと
manager.openCamera(cameraId, mCameraDeviceCallback, null);の部分に例外処理を実装してみましたが、実装してもAndroidEmulatorでカメラを起動できませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
Emulatorはapi25のものを使っています。
回答2件
あなたの回答
tips
プレビュー