2016-06-14 1 views
1

Следующий код отлично работает в версии для Android менее lolipop, но в lolipop и выше версии его не работает. Может ли кто-нибудь помочь, что делать, чтобы он мог работать во всех версиях. Я тестировал его на многих устройствах, но в lolipop im получал эту ошибку "takePicture failed". Пожалуйста, помогите мне.Фотосъемка без предварительного просмотра камеры не работает в lolipop и выше версии

public class CameraService extends Service { 
    private Camera camera; 
    private int cameraId = 0; 
    private Timer timer; 

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

    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     capureImage(); 
     super.onStart(intent, startId); 
    } 

    public void capureImage() { 
     try { 
      cameraId = findFrontFacingCamera(); 
      if (cameraId < 0) { 
      } else { 
       SurfaceView view = new SurfaceView(getApplicationContext()); 
       safeCameraOpen(cameraId); 
       camera.setPreviewDisplay(view.getHolder()); 
       camera.startPreview(); 
       Camera.Parameters params = camera.getParameters(); 
       params.setJpegQuality(100); 
       camera.setParameters(params); 
       camera.takePicture(null, null, mCall); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    Camera.PictureCallback mCall = new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      try { 
       Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, 
         data.length); 
       saveBitmap(bitmapPicture); 
       releaseCamera(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.e("exception", e.getMessage()); 
      } 
     } 
    }; 

    private void saveBitmap(Bitmap bmp) { 
     String _time = ""; 
     Calendar cal = Calendar.getInstance(); 
     int millisecond = cal.get(Calendar.MILLISECOND); 
     int second = cal.get(Calendar.SECOND); 
     int minute = cal.get(Calendar.MINUTE); 
     int hourofday = cal.get(Calendar.HOUR_OF_DAY); 
     _time = "image_" + hourofday + "" + minute + "" + second + "" 
       + millisecond; 
     String file_path = Environment.getExternalStorageDirectory() 
       .getAbsolutePath() + "/DiaryFakeImage"; 
     try { 
      File dir = new File(file_path); 
      if (!dir.exists()) 
       dir.mkdirs(); 
      File file = new File(dir, _time); 
      FileOutputStream fOut = new FileOutputStream(file); 
      bmp.compress(Bitmap.CompressFormat.PNG, 90, fOut); 
      fOut.flush(); 
      fOut.close(); 
     } catch (Exception e) { 
      Log.e("error in saving image", e.getMessage()); 
     } 
    } 

    private boolean safeCameraOpen(int id) { 
     boolean qOpened = false; 
     try { 
      releaseCamera(); 
      camera = Camera.open(id); 
      qOpened = (camera != null); 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
     return qOpened; 
    } 

    private void releaseCamera() { 
     if (camera != null) { 
      camera.stopPreview(); 
      camera.release(); 
      camera = null; 
     } 
    } 

    private int findFrontFacingCamera() { 
     int cameraId = -1; 
     int numberOfCameras = Camera.getNumberOfCameras(); 
     for (int i = 0; i < numberOfCameras; i++) { 
      Camera.CameraInfo info = new Camera.CameraInfo(); 
      Camera.getCameraInfo(i, info); 
      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       cameraId = i; 
       break; 
      } 
     } 
     return cameraId; 
    } 


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

Вы обязательно должны использовать предварительный просмотр, но ... Вы можете использовать предварительный просмотр с '1x1px' – Aspicas

+0

Как использовать его можно добавить код в комментариях –

+0

вам еще нужен код? – Aspicas

ответ

1

Вам необходимо использовать SurfaceTexture для Lollipop.

Попробуйте добавить этот раз перед camera.startPreview(); -

SurfaceTexture st = new SurfaceTexture(MODE_PRIVATE); 
camera.setPreviewTexture(st); 
camera.startPreview(); 
+0

Огромное спасибо, теперь это нормально работает на всех устройствах. –

Смежные вопросы