###前提・実現したいこと
JAVAでAndroidスマホ用アプリを作っています。
カメラ機能を使用したいため、
Android Studioからimportしたsampleパッケージ「Camera2Basic」をベースに必要な機能を追加実装しています。
「撮影」ボタンの押下をトリガーとして、写真を撮影し、保存した上で、写真をLayoutに設定されたImageViewに表示したいです。
※初心者なので、基本的なところを理解できていないと思います。この質問では、上記の問題を解決するにあたり、論理的な意味で、どのあたりをチェック・修正すればよいか、などを教えていただきたいです。
※一旦、ポイントと思われる箇所のソースのみを抜粋して添付し、必要に応じて、追加したいと思います。
###発生している問題・エラーメッセージ
「撮影」ボタンをトリガーとして、写真撮影し、保存する事、まではできましたが、保存処理の完了を知ることができないため、ファイルが保存されたタイミングでファイルをImageViewに保存する事ができません。
###該当のソースコード
XML
1<fragment_camera2_basic.xml> 2… 3 <ImageView 4 android:id="@+id/foto" 5 android:layout_width="match_parent" 6 android:layout_height="wrap_content" 7 android:layout_marginTop="10dp" 8 android:layout_marginLeft="10dp" 9 android:layout_marginEnd="10dp" 10 android:layout_marginRight="10dp" 11 android:layout_toEndOf="@+id/rl1" 12 android:adjustViewBounds="true" 13 android:src="@drawable/foto" 14 tools:layout_alignParentTop="true" /> 15…
JAVA
1<fragment_camera2_basic.java> 2 3public class Camera2BasicFragment extends Fragment 4 implements View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback { 5 6… 7 private ImageView mImageView; 8… 9 private final ImageReader.OnImageAvailableListener mOnImageAvailableListener 10 = new ImageReader.OnImageAvailableListener() { 11 12 @Override 13 public void onImageAvailable(ImageReader reader) { 14// mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile)); 15 mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile, mImageView)); 16 } 17 18 }; 19… 20 public View onCreateView(LayoutInflater inflater, ViewGroup container, 21 Bundle savedInstanceState) { 22 View v = inflater.inflate(R.layout.fragment_camera2_basic, container, false); 23 return v; 24… 25 public void onViewCreated(final View view, Bundle savedInstanceState) { 26 //freddie 27 view.findViewById(R.id.picture).setOnClickListener(this); 28 view.findViewById(R.id.sb).setOnClickListener(this); 29 mTextureView = (AutoFitTextureView) view.findViewById(R.id.texture); 30 31 mImageView = (ImageView) view.findViewById(R.id.foto); 32 } 33… 34 private void takePicture() { 35 lockFocus(); 36 Bitmap src = BitmapFactory.decodeFile(mFile.toString()); 37 mImageView.setImageBitmap(src);★ 38 } 39… 40<追加> 41 public void run() { 42 ByteBuffer buffer = mImage.getPlanes()[0].getBuffer(); 43 byte[] bytes = new byte[buffer.remaining()]; 44 buffer.get(bytes); 45 FileOutputStream output = null; 46 try { 47 output = new FileOutputStream(mFile); 48 output.write(bytes); 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } finally { 52 mImage.close(); 53 if (null != output) { 54 try { 55 output.close(); 56 } catch (IOException e) { 57 e.printStackTrace(); 58 } 59 } 60 61// Bitmap src = BitmapFactory.decodeFile(mFile.toString()); 62// mImageView.setImageBitmap(src); 63 } 64…
★この処理はエラーにならないものの、takePitureで撮影された写真が保存される前のファイルが表示されてしまう。
###試したこと
保存される写真ファイル名を固定にした上で、写真撮影処理の直後に、ImageViewへの写真表示処理を追加したところ、写真表示を行うことはできました。
※ただし、そのタイミングでは、まだ保存が完了していないため、前回、撮影されたファイルが表示されてしまいます。
###補足情報(言語/FW/ツール等のバージョンなど)
Android Studioバージョン:2.3.1
Androidデバイス 6.0.1
回答1件
あなたの回答
tips
プレビュー