Faced with the fact that the code for working with the camera does not work on 5.1.1. How to work with SurfaceView starting from 5.1.1?

public class ViewCamera extends Activity implements OnClickListener { SurfaceView surfaceView; Camera camera; MediaRecorder mediaRecorder; final int CAMERA_ID = 0; File photoFile; File videoFile; String namePhoto = " "; String nameVideo = " "; File pictures; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); pictures = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); nameVideo = getCurrentTime(); videoFile = new File(pictures, nameVideo + ".3gp"); surfaceView = (SurfaceView) findViewById(R.id.surfaceView); SurfaceHolder holder = surfaceView.getHolder(); holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { setCameraDisplayOrientation(CAMERA_ID); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }); } private String getCurrentTime() { Calendar calendar = Calendar.getInstance(); long milisecond = calendar.getTimeInMillis(); String str = Long.toString(milisecond); return str; } @Override protected void onResume() { super.onResume(); camera = Camera.open(); initSpinners(); } @Override protected void onPause() { super.onPause(); releaseMediaRecorder(); if (camera != null) camera.release(); camera = null; } public void onClickPicture(View view) { camera.takePicture(null, null, new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { try { namePhoto = getCurrentTime(); photoFile = new File(pictures, namePhoto + ".jpg"); FileOutputStream fos = new FileOutputStream(photoFile); fos.write(data); fos.close(); namePhoto = namePhoto + 1; } catch (Exception e) { e.printStackTrace(); } } }); switch (view.getId()) { case R.id.btnTakePicture: Intent intent = new Intent(ViewCamera.this, MapActivity.class); startActivity(intent); break; } } public void onClickStartRecord(View view) { if (prepareVideoRecorder()) { mediaRecorder.start(); } else { releaseMediaRecorder(); } } public void onClickStopRecord(View view) { if (mediaRecorder != null) { mediaRecorder.stop(); releaseMediaRecorder(); } } private boolean prepareVideoRecorder() { camera.unlock(); mediaRecorder = new MediaRecorder(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setProfile(CamcorderProfile .get(CamcorderProfile.QUALITY_HIGH)); mediaRecorder.setOutputFile(videoFile.getAbsolutePath()); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); nameVideo = nameVideo + 1; try { mediaRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); releaseMediaRecorder(); return false; } return true; } private void releaseMediaRecorder() { if (mediaRecorder != null) { mediaRecorder.reset(); mediaRecorder.release(); mediaRecorder = null; camera.lock(); } } void setCameraDisplayOrientation(int cameraId) { // опрСдСляСм насколько ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ экран ΠΎΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ полоТСния int rotation = getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result = 0; // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎ ΠΏΠΎ ΠΊΠ°ΠΌΠ΅Ρ€Π΅ cameraId CameraInfo info = new CameraInfo(); Camera.getCameraInfo(cameraId, info); // задняя ΠΊΠ°ΠΌΠ΅Ρ€Π° if (info.facing == CameraInfo.CAMERA_FACING_BACK) { result = ((360 - degrees) + info.orientation); } else // пСрСдняя ΠΊΠ°ΠΌΠ΅Ρ€Π° if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { result = ((360 - degrees) - info.orientation); result += 360; } result = result % 360; camera.setDisplayOrientation(result); } void initSpinners() { // Π¦Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ эффСкты // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… эффСктов final List<String> colorEffects = camera.getParameters() .getSupportedColorEffects(); Spinner spEffect = initSpinner(R.id.spEffect, colorEffects, camera .getParameters().getColorEffect()); // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Ρ‹Π±ΠΎΡ€Π° spEffect.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Parameters params = camera.getParameters(); params.setColorEffect(colorEffects.get(arg2)); camera.setParameters(params); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); // Π Π΅ΠΆΠΈΠΌΡ‹ Π²ΡΠΏΡ‹ΡˆΠΊΠΈ // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Π²ΡΠΏΡ‹ΡˆΠΊΠΈ final List<String> flashModes = camera.getParameters() .getSupportedFlashModes(); // настройка спиннСра Spinner spFlash = initSpinner(R.id.spFlash, flashModes, camera .getParameters().getFlashMode()); // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Ρ‹Π±ΠΎΡ€Π° spFlash.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Parameters params = camera.getParameters(); params.setFlashMode(flashModes.get(arg2)); camera.setParameters(params); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); } Spinner initSpinner(int spinnerId, List<String> data, String currentValue) { // настройка спиннСра ΠΈ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π° для Π½Π΅Π³ΠΎ Spinner spinner = (Spinner) findViewById(spinnerId); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, data); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); // опрСдСлСяСм ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² спискС являСтся Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ настройкой for (int i = 0; i < data.size(); i++) { String item = data.get(i); if (item.equals(currentValue)) { spinner.setSelection(i); } } return spinner; } @Override public void onClick(View arg0) { // TODO Auto-generated method stub } 

}

1 answer 1

Use TextureView instead of SurfaceView .

I also recommend finding the application on Google Play, OpenCamera - the description contains a link to its source code, study it and compare it with your own.