質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1191閲覧

android camera2でのtextureViewをviewごとキャプチャーに失敗

sekaikan_ozaki

総合スコア65

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/10/10 08:39

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ViewやImageViewを第一引数に設定したところ成功し,TextureViewの場合は失敗しています.
どうやらTextureViewはgetDrawingCache()できないようでした.

関連のサイトを載せておきます
https://stackoverflow.com/questions/19704060/screen-capture-textureview-is-black-using-
drawingcache

また,解決方法として,textureViewをビットマップで取得して,ビットマップから画像として保存することでやりたかったことの解決となりました.

投稿2019/10/23 08:59

sekaikan_ozaki

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問