0

I am developing an app that is supposed to record videos using the front facing camera. It is working now using the back camera. When I tried to change the cameraID to select the profile of the front facing camera as mentioned in

this question

actually nothing happens and still the back camera is used.

public class MainActivity extends Activity  implements View.OnClickListener, SurfaceHolder.Callback {
    public static MediaRecorder recorder;
    public static SurfaceHolder holder;
    public static SurfaceView cameraView;
    boolean recording = false;
    public static final int RequestPermissionCode = 2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        if(checkPermission()) {
            initRecorder();
            setContentView(R.layout.activity_main);

            cameraView = (SurfaceView) findViewById(R.id.CameraView);
            holder = cameraView.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

            cameraView.setClickable(true);
            cameraView.setOnClickListener(this);
        } else {
            requestPermission();
            initRecorder();
            setContentView(R.layout.activity_main);

            cameraView = (SurfaceView) findViewById(R.id.CameraView);
            holder = cameraView.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

            cameraView.setClickable(true);
            cameraView.setOnClickListener(this);
        }
    }

    private  int getCamID() {
        int cameraCount = 0;
        Camera cam = null;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras();
        for (int camIdx = 0; camIdx<cameraCount; camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                return camIdx;
            }
        }
        return 0;
    }

    private void initRecorder() {
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        int camID = getCamID();
        CamcorderProfile cpHigh = CamcorderProfile
                .get(camID,CamcorderProfile.QUALITY_LOW);
        recorder.setProfile(cpHigh);

        //get the time stamp
        String timestamp = new Timestamp(System.currentTimeMillis()).toString();
        //remove the seconds part
        timestamp = timestamp.substring(0, timestamp.length()-6).replaceAll(":","");
        //append file name to the time stamp
        String filestamp =  timestamp;
        recorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                filestamp +".mp4");
        recorder.setMaxDuration(50000); // 50 seconds
        recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
    }

    private void prepareRecorder() {
        recorder.setPreviewDisplay(holder.getSurface());

        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
            finish();
        } catch (IOException e) {
            e.printStackTrace();
            finish();
        }
    }

    public void onClick(View v) {
        if (recording) {
            recorder.stop();
            recording = false;
            recorder.release();
            // Let's initRecorder so we can record again

        } else {
            initRecorder();
            prepareRecorder();
            recording = true;
            recorder.start();
        }
    }

    public void surfaceCreated(SurfaceHolder holder) {
        prepareRecorder();
    }

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

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (recording) {
            recorder.stop();
            recording = false;
        }
        recorder.release();
        finish();
    }



    private void requestPermission() {
        ActivityCompat.requestPermissions(MainActivity.this, new
                String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO,CAMERA}, RequestPermissionCode);
    }


    public boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(getApplicationContext(),
                WRITE_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
                RECORD_AUDIO);
        int result2 = ContextCompat.checkSelfPermission(getApplicationContext(),
                CAMERA);
        return result == PackageManager.PERMISSION_GRANTED &&
                result1 == PackageManager.PERMISSION_GRANTED &&
                result2 == PackageManager.PERMISSION_GRANTED;
    }
}

Manifest file:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.android.mediarecorder"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.front" android:required="false" />

    <application
        android:allowBackup="true"
        android:fullBackupContent="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
      <activity
            android:name="com.example.amokh.videorecorder02.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
ColdFire
  • 6,764
  • 6
  • 35
  • 51

1 Answers1

1

MediaRecorder defines setCamera() method which is easy to use, but was deprecated in API 21 (because it refers to the old Camera API). For API 21+, it's preferable to open the camera with camera2 API and use setVideoSource(SURFACE), as shown in the official camera2video sample.

Alex Cohn
  • 56,089
  • 9
  • 113
  • 307
  • Thank you for help. Then how to select the front camera? or using surface as a source does that automatically? – Ahmed Ibrahim May 03 '18 at 17:27
  • As you can see the in the linked example, you connect the surface to camera device, which you open with any parameters as you wish. – Alex Cohn May 03 '18 at 18:46