Функция Android Camera takePicture не вызывает функцию обратного вызова

Я работаю над пользовательской деятельностью камеры для своего приложения. Я следил за инструкцией на сайте разработчиков Android здесь: http://developer.android.com/guide/topics/media/camera.html Все работает нормально, за исключением того, что функция обратного вызова не вызывается и изображение не сохраняется , Вот мой код:

public class CameraActivity extends Activity { private Camera mCamera; private CameraPreview mPreview; private static final String TAG = "CameraActivity"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.camera); // Create an instance of Camera mCamera = getCameraInstance(); // Create our Preview view and set it as the content of our activity. mPreview = new CameraPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); Button captureButton = (Button) findViewById(R.id.button_capture); captureButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.v(TAG, "will now take picture"); mCamera.takePicture(null, null, mPicture); Log.v(TAG, "will now release camera"); mCamera.release(); Log.v(TAG, "will now call finish()"); finish(); } }); } private PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Log.v(TAG, "Getting output media file"); File pictureFile = getOutputMediaFile(); if (pictureFile == null) { Log.v(TAG, "Error creating output file"); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) { Log.v(TAG, e.getMessage()); } catch (IOException e) { Log.v(TAG, e.getMessage()); } } }; private static File getOutputMediaFile() { String state = Environment.getExternalStorageState(); if (!state.equals(Environment.MEDIA_MOUNTED)) { return null; } else { File folder_gui = new File(Environment.getExternalStorageDirectory() + File.separator + "GUI"); if (!folder_gui.exists()) { Log.v(TAG, "Creating folder: " + folder_gui.getAbsolutePath()); folder_gui.mkdirs(); } File outFile = new File(folder_gui, "temp.jpg"); Log.v(TAG, "Returnng file: " + outFile.getAbsolutePath()); return outFile; } } 

После нажатия кнопки «Я» получаю журналы: «теперь сделают снимок», «теперь выйдет камера» и «теперь вызовет финиш». Действие завершается успешно, но функция обратного вызова не вызывалась во время

 mCamera.takePicture(null, null, mPicture); 

Function (Не было журналов из функции mPicture callback или getMediaOutputFile), и в указанном местоположении нет файла.

Есть идеи? 🙂 Большое спасибо!

Вызов mCamera.takePicture() является асинхронным. Это означает, что вызов завершается немедленно, но фактическое снятие и обработка изображения происходит через некоторое время. Тем не менее, вы делаете это сразу после возврата к вызову mCamera.takePicture() :

 Log.v(TAG, "will now release camera"); mCamera.release(); Log.v(TAG, "will now call finish()"); finish(); 

Это означает, что вы освободили ресурсы камеры и закончили действие, прежде чем камера получит шанс фактически сделать снимок и перезвонить вам.

Вам нужно перенести этот код в метод обратного вызова onPictureTaken() чтобы вы освободили ресурсы и завершили действие после обратного вызова.

Сделайте это так, чтобы сделать несколько изображений на одном клике Использование пользовательской камеры SurfaceView

 clickbtn.setOnClickListener(new OnClickListener() { @SuppressWarnings("deprecation") @Override public void onClick(View v) { for (int i = 0; i < 5; i++) { mcamera = mPreview.getCamera(); getimage(mcamera); Toast.makeText(getApplicationContext(), "multiple image count=" + i, 1000).show(); } if (mPreview == null) { mPreview = new CamLayer(MainActivity.this); } } }); 

а также

  public static void getimage(Camera mcamera) { PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { pictureFile = getOutputMediaFile(); Log.e("path file 11111111", ""+pictureFile); if (pictureFile == null) { return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) { } catch (Exception e) { } } }; try { mcamera.startPreview(); mcamera.takePicture(null, null, mPicture); Thread.sleep(2000); } catch (Exception exception) { exception.printStackTrace(); } } private static File getOutputMediaFile() { File mediaStorageDir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Sunil3"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } File mediaFile = new File(String.format(mediaStorageDir+File.separator+"%d.jpg", System.currentTimeMillis())); return mediaFile; }