PCスペック
Windows10 HOME 64bit
メモリ 32GB
プロセッサ Intel Core i7-8700CPU 3.20GHz
Android Studio 3.4.1(最新ver)
デモ用端末(XPERIA OS:7.0 API 24)
camera2APIを使って,カメラアプリを開発しています.
1つ前の質問と似ているのですが,解決方法が異なってます.
こちらの記事を参考に,
画面ごとキャプチャーするやり方でtextureViewを抜き出そうと試しました.
しかし,キャプチャーして,保存された画像は真っ黒なもので,キャプチャーに失敗していまいました.
普通のviewやボタンのキャプチャーは成功するのですが,なぜtextureviewだけキャプチャーに失敗しているのかが解決できません.
コードにおかしな点があるのでしょうか...?
ちなみにsaveCaptureとgetViewCaptureがキャプチャーの役割を担うメソッドなのですが,引数1の型をTextureViewに揃えてもうまくいきませんでした.
なぜうまくいかないのか理由が知りたいです.
理由が分かった方がいましたら是非教えていただければ助かります..
java
1package com.example.camera2api2; 2 3public class MainActivity extends AppCompatActivity { 4 private Camera mCamera; 5 6 private float scale = 1f; 7 private ScaleGestureDetector detector; 8 private File file; 9 private static final int REQUEST_MULTI_PERMISSIONS = 101; 10 11 private TextureView textureView; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 17 setContentView(R.layout.activity_main); 18 19 textureView = (TextureView) findViewById(R.id.texture_view); 20 textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { 21 @Override 22 public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 23 mCamera.open(); 24 25 } 26 27 @Override 28 public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 29 30 } 31 32 @Override 33 public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 34 return false; 35 } 36 37 @Override 38 public void onSurfaceTextureUpdated(SurfaceTexture surface) { 39 40 } 41 }); 42 43 mCamera = new Camera(textureView); 44 detector = new ScaleGestureDetector(this,new ScaleListener()); 45 } 46 47 public boolean onTouchEvent(MotionEvent event) { 48 //re-route the Touch Events to the ScaleListener class 49 detector.onTouchEvent(event); 50 return super.onTouchEvent(event); 51 } 52 53 //スケールリスナークラス 54 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 55 @Override 56 public boolean onScale(ScaleGestureDetector detector) { 57 scale *= detector.getScaleFactor(); 58 mCamera.mTextureView.setScaleX(scale); 59 mCamera.mTextureView.setScaleY(scale); 60 return true; 61 } 62 } 63 64 65 @Override 66 protected void onResume() { 67 super.onResume(); 68 69 70 Button button = (Button) findViewById(R.id.button); 71 button.setOnClickListener(new View.OnClickListener() { 72 @Override 73 public void onClick(View v) { 74 // 読み書きするファイル名を指定 75 file = new File(Environment.getExternalStorageDirectory().getPath() 76 + "/DCIM/" + "capture.jpeg"); 77 file.getParentFile().mkdir();// 指定したファイル名が無ければ作成する 78 // なぞった部分のviewを撮る 79 saveCapture(textureView, file); 80 81 } 82 }); 83 } 84 85 /** 86 * 撮ったキャプチャを保存 87 * @paramview 88 * @param書き込み先ファイルfile 89 */ 90 public static void saveCapture(View view, File file) { 91 // キャプチャを撮る 92 Bitmap capture = getViewCapture(view); 93 FileOutputStream fos = null; 94 try { 95 fos = new FileOutputStream(file, false); 96 // 画像のフォーマットと画質と出力先を指定して保存 97 capture.compress(Bitmap.CompressFormat.JPEG, 100, fos); 98 fos.flush(); 99 } catch (Exception e) { 100 e.printStackTrace(); 101 } finally { 102 if (fos != null) { 103 try { 104 fos.close(); 105 } catch (IOException ie) { 106 fos = null; 107 } 108 } 109 } 110 } 111 112 /** 113 * キャプチャを撮る 114 * @return 撮ったキャプチャ(Bitmap) 115 * @param撮りたいview 116 */ 117 public static Bitmap getViewCapture(View view) { 118 view.setDrawingCacheEnabled(true); 119 // Viewのキャプチャを取得 120 Bitmap cache = view.getDrawingCache(); 121 if (cache == null) { 122 return null; 123 } 124 Bitmap screenShot = Bitmap.createBitmap(cache); 125 view.setDrawingCacheEnabled(false); 126 return screenShot; 127 } 128 129 130 131 132 //カメラクラス 133 class Camera { 134 private CameraDevice mCamera; 135 private TextureView mTextureView; 136 private Size mCameraSize; 137 private CaptureRequest.Builder mPreviewBuilder; 138 private CameraCaptureSession mPreviewSession; 139 140 141 142 private CameraDevice.StateCallback mCameraDeviceCallback = new CameraDevice.StateCallback() { 143 @Override 144 public void onOpened(@NonNull CameraDevice camera) { 145 mCamera = camera; 146 createCaptureSession(); 147 } 148 149 @Override 150 public void onDisconnected(@NonNull CameraDevice camera) { 151 camera.close(); 152 mCamera = null; 153 } 154 155 @Override 156 public void onError(@NonNull CameraDevice camera, int error) { 157 camera.close(); 158 mCamera = null; 159 } 160 }; 161 162 CameraCaptureSession.StateCallback mCameraCaptureSessionCallback = new CameraCaptureSession.StateCallback() { 163 @Override 164 public void onConfigured(@NonNull CameraCaptureSession session) { 165 mPreviewSession = session; 166 updatePreview(); 167 } 168 169 @Override 170 public void onConfigureFailed(@NonNull CameraCaptureSession session) { 171 Toast.makeText(MainActivity.this, "onConfigureFailed", Toast.LENGTH_LONG).show(); 172 } 173 }; 174 175 public Camera(TextureView textureView) { 176 mTextureView = textureView; 177 } 178 179 public void open() { 180 try { 181 CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 182 for (String cameraId : manager.getCameraIdList()) { 183 CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 184 if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) { 185 StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 186 mCameraSize = map.getOutputSizes(SurfaceTexture.class)[4]; 187 188 manager.openCamera(cameraId, mCameraDeviceCallback, null); 189 190 return; 191 } 192 } 193 } catch (CameraAccessException e) { 194 e.printStackTrace(); 195 } 196 } 197 198 private void createCaptureSession() { 199 if (!mTextureView.isAvailable()) { 200 return; 201 } 202 203 SurfaceTexture texture = mTextureView.getSurfaceTexture(); 204 texture.setDefaultBufferSize(mCameraSize.getWidth(), mCameraSize.getHeight()); 205 Surface surface = new Surface(texture); 206 try { 207 mPreviewBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 208 } catch (CameraAccessException e) { 209 e.printStackTrace(); 210 } 211 212 mPreviewBuilder.addTarget(surface); 213 try { 214 mCamera.createCaptureSession(Collections.singletonList(surface), mCameraCaptureSessionCallback, null); 215 } catch (CameraAccessException e) { 216 e.printStackTrace(); 217 } 218 } 219 220 private void updatePreview() { 221 mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 222 HandlerThread thread = new HandlerThread("CameraPreview"); 223 thread.start(); 224 Handler backgroundHandler = new Handler(thread.getLooper()); 225 226 try { 227 mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler); 228 } catch (CameraAccessException e) { 229 e.printStackTrace(); 230 } 231 } 232 233 } 234 235}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。