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

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

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

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

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

6140閲覧

Androidで録画機能が実装できない。

m-mega

総合スコア56

Java

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

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/10/06 04:47

既にStackOverFlowにて同様の質問をしておりますが、より多くの方々からご意見をいただきたいため、失礼を承知でこちらでも質問を共有させていただきます。

マルチリンク先

目的

以下の機能を持ったカメラアプリを作成すること。
1)カメラのプレビューを全画面で表示する。
2)カメラの露光感度、シャッタースピード、フレームレートをシークバーでリアルタイムに変更できる。
3)プレビュー中に端末のLEDライトを点灯できる。
4)ボタンを押したら録画が開始される。録画したデータは端末のメインストレージ直下に保存される。

やったこと

1)2)3)の機能については、すでに実装が完了しています。
4)については、ボタンの設定やパーミッションの設定、録画処理を作成しているのですが、現状うまくいっていません。

コード

文字数の関係でコード全文の共有は割愛します。詳細はマルチリンク先をご参照ください。

該当部分

MainActivity.ktの以下の部分で録画の準備を行なっています。

kotlin

1 // 録画クラスMediaRecorderの初期化 -> MediaRecorderが非推奨になってしまっているが問題ないか 2 @RequiresApi(Build.VERSION_CODES.O) 3 private fun prepareVideoRecorder(): Boolean { 4 // MediaRecorderをインスタンス化 5 recorder = MediaRecorder() 6 cameraManager?.let { cameraDevice -> 7 recorder?.run { 8 setVideoSource(MediaRecorder.VideoSource.CAMERA) // 録画の入力元となるカメラを設定 9 setOutputFormat(MediaRecorder.OutputFormat.DEFAULT) // ビデオのエンコーダを指定 10 setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT) // ファイルフォーマットを指定 11 val dir = Environment.getExternalStorageDirectory() // ディレクトリを取得 12 val file = File.createTempFile("video", ".mp4", dir) // 一時ファイルをディレクトリに保存 13 recorder?.setOutputFile(file.absolutePath) // 出力ファイル名を設定(ランダムな数字を付加) 14 // 録画準備 15 return try { 16 Log.i("start","prepare") 17 prepare() 18 Log.i("finish","prepare") 19 true 20 } catch (e: IllegalStateException) { 21 Log.d(TAG, "IllegalStateException preparing MediaRecorder: ${e.message}") 22 releaseMediaRecorder() 23 false 24 } catch (e: IOException) { 25 Log.d(TAG, "IOException preparing MediaRecorder: ${e.message}") 26 releaseMediaRecorder() 27 false 28 } 29 } 30 } 31 return false 32 }

録画の開始、停止は以下の録画ボタンの処理に応じて実行しています。

kotlin

1// 録画ボタンの設定 2 @RequiresApi(Build.VERSION_CODES.O) 3 private fun configRecButton() { 4 // 録画ボタンのイベント登録 5 button_rec = findViewById(R.id.button_rec) 6 button_rec.setOnClickListener { 7 storagePermission() // 外部ストレージへの書き込み許可を取得 8 stateRecButton = !stateRecButton // 値を反転 9 if (stateRecButton){ 10 if (prepareVideoRecorder()) { 11 Log.i("start","record") 12                                        recorder?.start() 13 } else { 14 releaseMediaRecorder() 15 } 16 } 17 else{ 18 Log.i("stop","stop") 19 recorder?.stop() // stop the recording 20 Log.i("release","release") 21 releaseMediaRecorder() // release the MediaRecorder object 22 } 23 } 24 }

エラー内容

以上のコードを実行すると、以下のエラーが表示されます。

W/Binder:28069_5: type=1400 audit(0.0:850327): avc: denied { read } for name="u:object_r:vendor_camera_prop:s0" dev="tmpfs" ino=18399 scontext=u:r:untrusted_app:s0:c213,c256,c512,c768 tcontext=u:object_r:vendor_camera_prop:s0 tclass=file permissive=0 E/libc: Access denied finding property "persist.vendor.camera.privapp.list" E/libc: Access denied finding property "vendor.camera.aux.packagelist" E/libc: Access denied finding property "vendor.camera.aux.packagelist" E/libc: Access denied finding property "vendor.camera.aux.packagelist" E/libc: Access denied finding property "vendor.camera.aux.packagelist" E/MediaRecorder: start failed: -22 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main

見たところ、「Access denied finding property」とあり、何かしらのアクセスがうまくいっていないのかと考えています。
カメラのプレビューは表示されておりますので、ストレージへのアクセスで問題が発生しているのかもしれません。

質問内容

確認したところ、prepareを実行したタイミングでエラーが発生しているようなので、設定項目に何か間違いがあるのか、権限の付与がうまくいっていないのだと思いますが、調査をしても明確な原因がわかっていない状態です。

ちなみに、アプリの権限の状態を確認すると、「カメラ」と「ストレージ」の項目はONになっており、権限が付与されていることが確認できております。

私と同じように録画機能を実装する中で同じ問題に直面している例が見当たらず、解決に至れていない状態です。
調査すると、中には似たような例もあるのですが、そこに記載されている内容を試しても解決に至れておりません。

そのため、お手数ですが、コードをご確認の上、どの部分に間違いがあるのかをご指摘いただけますと幸いです。。。
(カメラを使用するため、検証にはandroidの実機が必要になります。)

端末情報

以下の端末で動作の確認をしています。
SHARP AQUOS SHV48(Android 9)

参考にしたサイト

Qiita - Camera2apiを使って動画を撮影する
Qiita - DCIMに保存してギャラリーで表示させる方法

Softbank - 録画アプリの作り方
StackOverFlow - ストレージへのファイルの書き込みがうまくいかない
TECHBOOSTER - MediaRecorderで録画する
Android - camera2での録画サンプル
Android - MediaRecorderについて
StackOverFlow - 同様のエラー内容に関する質問1
GitHub - 同様のエラー内容に関する質問2
TitanWolf - 同様のエラー内容に関する質問3

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

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

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

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

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

guest

回答2

0

自己解決

【自己解決】
googleが提供する以下のサンプルを参考に再度プログラムを作り直すことで、問題なく録画機能を実装することができました。同じようにcamera2apiを使って録画機能を実装しようと考えている方は、一度以下のリンクのサンプルをご覧いただくことをお勧めします(ファイルをコピーしてご自分の環境で実際に動かすとより理解が深まります)。
Android - camera2での録画サンプル

<不具合原因1> 

録画を実行するためには、VideoSourceの設定に加えて、必ずAudioSourceの設定も必要。
質問当初のコードでは、自作するアプリの目的として音声を取得できる必要がなかったので割愛しておりましたが、調査すると拡張子にmp4を指定する場合はAudioSource(音声入力元(端末のマイク))の指定も必要であることがわかりました。
そのため、パーミッション(AndroidManifest.xml)には以下のようにオーディオ機器の取得許可も必要になります。

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<不具合原因2> 

カメラのシャッタースピードや露光感度をいじるためにしている設定と、録画の設定がぶつかっていた。
作成中のアプリでは、カメラの露光感度などの値を設定するためにCaptureRequestのモードをいじっているのですが、その中の「CaptureRequest.CONTROL_CAPTURE_INTENT」の設定がプレビューを表示するための「createCaptureRequest(TEMPLATE_PREVIEW)」とぶつかってしまっていることが原因でした。

これは、別途ご質問しておりました以下の投稿と同じ内容になりますので、詳細はそちらをご確認ください。
リンク

以上でございます。
この質問をご覧いただき、解決方法を調査いただいた方々には心より感謝いたします。
jimbe様。質問に対して何度もメッセージで情報交換をしていただき誠にありがとうございました。
また、同じような問題に直面した方に、今回の回答が少しでも役立つことができれば幸いです。

投稿2021/10/14 04:22

m-mega

総合スコア56

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

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

0

ドキュメントのようになっているのでしょうか。
ビデオのキャプチャ

投稿2021/10/06 05:45

jimbe

総合スコア13209

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

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

m-mega

2021/10/06 06:09

ご返答いただきありがとうございます。 現在、camera apiが非推奨であることと、露光感度などを調整するため、camera apiではなくcamera2 apiを使って実装を行なっておりました。 そのため、カメラの起動方法などでドキュメント通りではない部分があります。 一度、ドキュメント通りに実装をしてみようと思います。 また、ご存知であれば教えていただきたいのですが、camera apiとcamera2 apiは併用することは可能なのでしょうか。
jimbe

2021/10/06 06:24

おそらく併用は出来ないものと思います。 teratail の過去のご質問に以下のようなものがありました。 API21以降のAndroidのCameraオブジェクト https://teratail.com/questions/32396
jimbe

2021/10/06 06:45 編集

(削除)
m-mega

2021/10/06 06:45

情報共有ありがとうございます。 併用ができないことと、2つの違いについても大まかに理解することができました。 そうなると、ご提供いただいたドキュメントの情報をそのまま実装することは難しそうです。 (camera.openはcamera.apiのもので、camera2の場合はopenCameraを使用したり、camera.apiにおけるSurfaceViewがcamera2ではTextureViewになっているなど) (camera2でのビデオキャプチャーについてもドキュメントがあれば良いのですが) そのため、現状はcamera.apiのドキュメントを元にcamera2用に置き換えながら実装をしている状況です。 引き続きドキュメント等を参照しながら、相違点をなくしていこうと思います。 また、もし現在のコードをご覧いただくことが可能であればですが、現状で目立った間違いなどはございますでしょうか(大雑把な質問で申し訳ございません)。。 ご指摘いただけましたら、そちらを中心に修正を進めていこうと思いますので、何卒ご検討のほどよろしくお願いいたします。
jimbe

2021/10/06 06:49

参考にされたというサイトのいくつかを見ましたが、ご質問に提示されているコードより設定(音声関係?)が多いように思います。 それらを追加してみては如何でしょうか。 お作りのシステムに組み込む前に、各サイトのサンプル等で動作を確認の上で、システムで使えるような形(オブジェクト・メソッド分け等)に改造して行って最終的に埋め込むという手順も試されては如何でしょうか。
m-mega

2021/10/06 07:04

ご指摘いただき誠にありがとうございます。 ご指摘の通り、現在は意図的に音声関係を省いておりました。これは、アプリの最終形に音声が不要であることと、サイトの例の中には音声ソースを指定していないものもいくつか見られたためであります。 ですが、一度初心に帰り公式との差分を照らし合わせながら実装をしてみようと思います(音声関係も含めて)。また、既存のサンプルの改造も検討いたします。 進展があり次第、再度こちらに投稿させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問