撮影開始ボタンと、停止ボタンを押したときに、startRecordingVideo();や、stopRecordingVideo();を呼び出すコードを書きます。
ここを書いていないのに、画像のようなエラーが出ます。
このActivityでの動画撮影のサンプルを元に、Serviceで撮影できるアプリを作りたいです。:AtivityのURL
public class MyService7 extends Service {
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
Log.d(TAG, "onOpened");
mCameraDevice = cameraDevice;
startPreview();
mCameraOpenCloseLock.release();
//ここでクラス変数に値を入れて、その値が、何かで、これを呼ぶかどうかを決める
Log.e(TAG, "firstOpend");
startRecordingVideo();
}
private void closePreviewSession() {
Log.e(TAG,"closePreviewSession()");
if (mPreviewSession != null) {
mPreviewSession.close();
mPreviewSession = null;
}
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
Log.e(TAG,"onDisConnected");
mCameraOpenCloseLock.release();
cameraDevice.close();
mCameraDevice = null;
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int error) {
Log.e(TAG,"onError");
mCameraOpenCloseLock.release();
cameraDevice.close();
mCameraDevice = null;
}
};
private void closePreviewSession() {
Log.e(TAG,"closePreviewSession");
if (mPreviewSession != null) {
mPreviewSession.close();
mPreviewSession = null;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
startBackgroundThread();
openCamera();
return super.onStartCommand(intent, flags, startId);
}
////////////////////OnCLick()
ここで、撮影開始ボタンと、停止ボタンを押したときに、startRecordingVideo();や、stopRecordingVideo();を呼び出すコードを書きます。
ここを書いていないのに、画像のようなエラーが出ます。
@SuppressWarnings("MissingPermission")
private void openCamera() {
Log.d(TAG,"openCamera");
CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
try {
Log.d(TAG, "tryAcquire");
if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("Time out waiting to lock camera opening.");
}
String cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics
.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
if (map == null) {
throw new RuntimeException("Cannot get available preview/video sizes");
}
mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class));
mMediaRecorder = new MediaRecorder();
manager.openCamera(cameraId, mStateCallback, null);
} catch (CameraAccessException e) {
Log.e(TAG, "CameraAccessException e");
}
}
private void closeCamera() {
Log.e(TAG,"closeCamera()");
try {
mCameraOpenCloseLock.acquire();
closePreviewSession();
if (null != mCameraDevice) {
mCameraDevice.close();
mCameraDevice = null;
}
if (null != mMediaRecorder) {
mMediaRecorder.release();
mMediaRecorder = null;
}
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted while trying to lock camera closing.");
} finally {
mCameraOpenCloseLock.release();
}
}
private void startPreview() {
Log.d(TAG,"startPreview");
if (null == mCameraDevice) {
return;
}
closePreviewSession();
}
//もう一度closePreviewSession()が呼ばれる
private void setUpMediaRecorder() throws IOException {
Log.e(TAG,"setUpMediaRecorder");
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
if (mNextVideoAbsolutePath == null || mNextVideoAbsolutePath.isEmpty()) {
mNextVideoAbsolutePath = getVideoFilePathy();
Log.e(TAG,mNextVideoAbsolutePath);
}
mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
mMediaRecorder.setVideoEncodingBitRate(10000000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
int rotation = windowManager.getDefaultDisplay().getRotation();
switch (mSensorOrientation) {
case SENSOR_ORIENTATION_DEFAULT_DEGREES:
mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
break;
case SENSOR_ORIENTATION_INVERSE_DEGREES:
mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
break;
}
mMediaRecorder.prepare();
}
private void startRecordingVideo() {
Log.e(TAG,"startRecordingVideo()");
if (null == mCameraDevice) {
Log.e(TAG,"return");
return;
}
try {
Log.e(TAG,"try");
closePreviewSession();
setUpMediaRecorder();
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<>();
Surface recorderSurface = mMediaRecorder.getSurface();
surfaces.add(recorderSurface);
mPreviewBuilder.addTarget(recorderSurface);
mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
Log.e(TAG, "CameraCaptureSession:onCongigured");
mMediaRecorder.start();
mIsRecordingVideo = true;
//やっぱここでか?
//ここでクラス変数に値を入れて、その値が、何かで、これを呼ぶかどうかを決める
Timer mTimer = new Timer();
handler = new Handler();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
// mHandlerを通じてUI Threadへ処理をキューイング
handler.post(new Runnable() {
public void run() {
mMediaRecorder.start();
}
});
}
}, 10000, 10000);
// //Activityの参考にしたコード
// getActivity().runOnUiThread(new Runnable() {
// @Override
// public void run() {
// // UI
// mButtonVideo.setText(R.string.stop);
// mIsRecordingVideo = true;
//
// // Start recording
// mMediaRecorder.start();
// }
// });
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
//省略
}
}, mBackgroundHandler);
} catch (CameraAccessException | IOException e) {
e.printStackTrace();
}
}
private void stopRecordingVideo() {
Log.e(TAG,"stopRecordingVideo");
mIsRecordingVideo = false;
try{
mMediaRecorder.stop();
mMediaRecorder.reset();
}catch(RuntimeException stopException){
}
mNextVideoAbsolutePath = null;
startPreview();
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
2017/08/10 09:35
複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。