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

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

ただいまの
回答率

88.93%

このコードは 、CameraAPI2をつかったものですか?

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,079

giant

score 0

このコードは 、CameraAPI2をつかったものですか?

public class RecorderService extends Service implements OnInfoListener, SurfaceHolder.Callback {
    private static final int VIDEO_DURATION = 30 * 60 * 1000;
    private static final long VIDEO_FILESIZE = 1024 * 1024 * 1024;

    private SurfaceView mSurfaceView;
    private Camera mCamera;
    private MediaRecorder mMediaRecorder;
    private SurfaceHolder mSurfaceHolder;
    private boolean isRecording = false;

    public RecorderService() {
    }

    @Override
    public IBinder onBind( Intent intent ) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.v("Service:onCreate()","あああああああああああああああああああああ");


        // MediaRecorderのプレビュー用のSurfaceViewを作成する
        mSurfaceView = new SurfaceView( this );
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback( this );

        // SurfaceViewをシステムオーバーレイに登録する
        WindowManager windowManager = (WindowManager)getSystemService( WINDOW_SERVICE );
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
                1, 1,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                PixelFormat.TRANSLUCENT );
        windowManager.addView( mSurfaceView, layoutParams );
    }

    @Override
    public int onStartCommand( Intent intent, int flags, int startId ) {
        super.onStartCommand( intent, flags, startId );

        if ( isRecording )
            mSurfaceView.setVisibility( View.VISIBLE );

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // 録画停止する
        stopRecording();

        // SurfaceViewをシステムオーバーレイから削除する
        ( (WindowManager)getSystemService( WINDOW_SERVICE ) ).removeView( mSurfaceView );
        mSurfaceView = null;
    }

    /**
     * プレビュー用のSurfaceViewが作成された後に録画を開始する
     *
     * @param holder
     */
    public void surfaceCreated( SurfaceHolder holder ) {
        if ( !isRecording ) {
            // 録画中でなければ録画開始する
            startRecording();
        } else {
            // 録画中であれば録画再開する
            restartRecording();
        }

        // SurfaceViewは録画開始後は不要なため非表示にする
        mSurfaceView.setVisibility( View.INVISIBLE );
    }

    public void surfaceDestroyed( SurfaceHolder holder ) {
    }

    public void surfaceChanged( SurfaceHolder holder, int format, int width, int height ) {
    }

    /**
     * 録画を開始する
     */
    public void startRecording() {
        // 録画中であれば何もしない
        if ( isRecording )
            return;

        isRecording = true;

        // 通知をタッチした際にGpsGetActivityを起動するためのIntentを作成する
        Intent intent = new Intent( this, GpsGetActivity.class ).addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
        PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, intent, 0 );


        // 通知を作成する
        Notification notification = new NotificationCompat.Builder( getApplicationContext() )
                .setContentIntent( pendingIntent )
                .setContentTitle("recording")
                .setContentText("recording now")
                .setTicker("start recording" )
                .setSmallIcon( R.mipmap.ic_launcher )
                .setOngoing( true )
                .build();

        // Serviceをフォアグラウンド化して常時録画を維持する
        startForeground( 1, notification );


        // Cameraのフォーカスモードを無限遠に設定する
        mCamera = Camera.open();


        Camera.Parameters cameraParameters = mCamera.getParameters();
        cameraParameters.setFocusMode( Camera.Parameters.FOCUS_MODE_INFINITY );
        mCamera.setParameters( cameraParameters );
        mCamera.unlock();



        // MediaRecorderを設定する
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera( mCamera );

        Log.v("録画機能","5");

        // オーディオのノイズを抑制するため音声認識用のオーディオソースを使用する
        mMediaRecorder.setAudioSource( MediaRecorder.AudioSource.VOICE_RECOGNITION );
        mMediaRecorder.setVideoSource( MediaRecorder.VideoSource.CAMERA );


        // 高品質プロファイルを設定する
        mMediaRecorder.setProfile( CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH ) );

        File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "movie");
        // 録画ファイルのパスを設定する(TODO: 外部ストレージのルートパスは端末ごとに修正する)
        //mMediaRecorder.setOutputFile( Environment.getExternalStorageDirectory().getPath()+ DateFormat.format( "yyyyMMdd'-'kkmmss", Calendar.getInstance() ) + ".mp4" );
        mMediaRecorder.setOutputFile( filePath.getPath()+ DateFormat.format( "yyyyMMdd'-'kkmmss", Calendar.getInstance() ) + ".mp4" );

        // 録画時間または録画ファイルサイズを制限する
        mMediaRecorder.setOnInfoListener( this );
        mMediaRecorder.setMaxDuration( VIDEO_DURATION );
        mMediaRecorder.setMaxFileSize( VIDEO_FILESIZE );

        // プレビュー用のSurfaceを設定する
        mMediaRecorder.setPreviewDisplay( mSurfaceHolder.getSurface() );

        Log.v("録画機能","8");

        // 録画を開始する
        try {

            Log.v("録画機能","9");
            mMediaRecorder.prepare();
            mMediaRecorder.start();
        } catch ( IOException ex ) {
            ex.printStackTrace();


            // 録画に失敗した場合はクリーンアップする

            // Serviceのフォアグラウンド化を解除する
            stopForeground( true );

            // MediaRecorderとCameraを解放する
            mMediaRecorder.release();
            mCamera.lock();
            mCamera.release();

            isRecording = false;

            // バイブレーションで通知する
            ( (Vibrator)getSystemService( VIBRATOR_SERVICE ) ).vibrate( 3000 );
        }
    }

    /**
     * 録画を停止する
     */
    public void stopRecording() {

        // 録画中でなければ何もしない
        if ( !isRecording )
            return;

        stopForeground( true );

        mMediaRecorder.stop();
        mMediaRecorder.release();

        mCamera.lock();
        mCamera.release();

        isRecording = false;
    }

    /**
     * 録画を再開する
     */
    public void restartRecording() {

        // 録画中でなければ何もしない
        if ( !isRecording )
            return;

        // 録画を停止する
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        mCamera.lock();
        mCamera.release();

        // Cameraを再設定する
        mCamera = Camera.open();
        Camera.Parameters cameraParameters = mCamera.getParameters();
        cameraParameters.setFocusMode( Camera.Parameters.FOCUS_MODE_INFINITY );
        mCamera.setParameters( cameraParameters );
        mCamera.unlock();

        // MediaRecorderを再設定する
        mMediaRecorder.setCamera( mCamera );
        mMediaRecorder.setAudioSource( MediaRecorder.AudioSource.VOICE_RECOGNITION );
        mMediaRecorder.setVideoSource( MediaRecorder.VideoSource.CAMERA );
        mMediaRecorder.setProfile( CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH ) );
        mMediaRecorder.setOutputFile( Environment.getExternalStorageDirectory().getPath()+ DateFormat.format( "yyyyMMdd'-'kkmmss", Calendar.getInstance() ) + ".mp4" );
        // mMediaRecorder.setOnInfoListener( this );
        // mMediaRecorder.setMaxDuration( VIDEO_DURATION );
        // mMediaRecorder.setMaxFileSize( VIDEO_FILESIZE );
        mMediaRecorder.setPreviewDisplay( mSurfaceHolder.getSurface() );

        // 録画を開始する
        try {
            mMediaRecorder.prepare();
            mMediaRecorder.start();
        } catch ( IOException ex ) {
            ex.printStackTrace();

            stopForeground( true );

            mMediaRecorder.release();

            mCamera.lock();
            mCamera.release();

            isRecording = false;

            ( (Vibrator)getSystemService( VIBRATOR_SERVICE ) ).vibrate( 3000 );
        }
    }

    public void onInfo( MediaRecorder mr, int what, int extra ) {
        // 録画時間または録画ファイルサイズが制限に達した場合、SurfaceViewを再表示し録画を再開する
        if ( what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED || what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED ) {
            mSurfaceView.setVisibility( View.VISIBLE );
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2017/08/03 08:38

    作成者、または出所に聞いてください。

    キャンセル

  • giant

    2017/08/03 10:20

    CameraApiを使ったものということがわかりました。

    キャンセル

回答 1

check解決した方法

-4

CameraApiを使ったものということがわかりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/03 12:58 編集

    連続して自己解決していますが調べれば答えでるのでは?

    キャンセル

  • 2017/08/03 13:00

    はい

    キャンセル

  • 2017/08/03 13:00 編集

    すみませんでした。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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