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

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

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

受付中

Xamarin.AndroidでCamera2APIを使用した際、写真撮影2回目にImage is already closedが発生する

apollo15gou
apollo15gou

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0回答

0リアクション

0クリップ

721閲覧

投稿2020/11/25 05:47

編集2020/12/01 05:19

前提・実現したいこと

Xamarin初心者です。よろしくお願いいたします。

Xamarin.Androidを用いて、写真撮影を行うアプリケーションを作成しています。
3画面構成で、
メイン画面→写真撮影画面→写真撮影結果表示画面→メイン画面…
に遷移します。
写真撮影結果表示画面からメイン画面に遷移する際は
写真撮影結果表示画面・写真撮影画面には戻れないよう、

C#

intent.AddFlags(ActivityFlags.ClearTop); intent.AddFlags(ActivityFlags.SingleTop);

を行い遷移します。

Camera2Basicを参考に、Camera2BasicFragment.csをActivityに移植し、
インカメラを用いて写真撮影をする機能を実装しましたが、
ImageAvailableListener.csの

C#

ByteBuffer buffer = mImage.GetPlanes()[0].Buffer;

にブレークポイントを設定すると、1回目のブレークヒットでは例外が発生せず、
2回目にブレークヒットした際に以下のエラーメッセージが発生しました。
また、上記箇所にブレークポイントを設定せずに実機に配置すると、
問題なく、2回目以降の写真の撮影が行えます。

発生している問題・エラーメッセージ

Java.Lang.IllegalStateException Message=Image is already closed

例外が発生する理由、例外を解消する方法がわかりません。
Camera2Basicでは同様の挙動にならないため、自身の実装箇所によるものです。
しかし、原因がわからないため、上記例外に対して対応ができていません。

該当のソースコード

C#

using Android.Media; using Java.IO; using Java.Lang; using Java.Nio; using System; namespace WorkTimeInputTabletApp.Listeners { public class ImageAvailableListener : Java.Lang.Object, ImageReader.IOnImageAvailableListener { private readonly EmployeeNumInput owner; public ImageAvailableListener(EmployeeNumInput owner) { if (owner == null) throw new System.ArgumentNullException("owner"); this.owner = owner; } //public File File { get; private set; } //public Camera2BasicFragment Owner { get; private set; } public void OnImageAvailable(ImageReader reader) { owner.mBackgroundHandler.Post(new ImageSaver(reader.AcquireNextImage(), owner)); } // Saves a JPEG {@link Image} into the specified {@link File}. private class ImageSaver : Java.Lang.Object, IRunnable { // The JPEG image private Image mImage; // The file we save the image into. private File mFile; private EmployeeNumInput mOwner; public ImageSaver(Image image, EmployeeNumInput owner) { if (image == null) throw new System.ArgumentNullException("image"); if (owner == null) throw new System.ArgumentNullException("owner"); mImage = image; mOwner = owner; } public void Run() { ByteBuffer buffer = mImage.GetPlanes()[0].Buffer; byte[] bytes = new byte[buffer.Remaining()]; buffer.Get(bytes); try { //フォーマット var dateFormat = "yyyy年MM月dd日"; var timeFormat = "HH:mm:ss"; var workDate = DateTime.ParseExact(mOwner.Work.WorkDate, dateFormat, null); var workTime = DateTime.ParseExact(mOwner.Work.WorkTime, timeFormat, null); string fileName = mOwner.EmployeeNum.Text + "_" + workDate.ToString("MMdd") + workTime.ToString("HHmm") + ".jpg"; mFile = new File(mOwner.GetExternalFilesDir(Android.OS.Environment.DirectoryPictures), fileName); } catch (System.Exception) { DisplayAlert("==DBG==", "ImageAvailableListener ファイル名生成時に例外発生"); } using (var output = new FileOutputStream(mFile)) { try { output.Write(bytes); } catch (IOException e) { e.PrintStackTrace(); } finally { mImage.Close(); } } } private void DisplayAlert(string v1, string v2) { throw new NotImplementedException(); } } } }

試したこと

Message=Image is already closed
なので、初期化処理などが行えていないかと思い、
写真撮影処理(TakePicture())に遷移する前に

C#

Thread.Sleep(3000);

を追加するなどしましたが、
Java.Lang.IllegalStateException
Message=Image is not initialized
という別の例外が発生します。

補足情報(FW/ツールのバージョンなど)

試している実機デバイス HUAWEI P10 lite
Androidバージョン 8.0-API26
Microsoft Visual Studio Community 2019 Version 16.8.2
Xamarin 16.8.000.255

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。