2017-10-09 273 views
1

我有一個畫面需要在後臺服務......該服務在三種模式下工作:拍攝照片不起作用

  1. 前凸輪
  2. 返回凸輪
  3. 回凸輪與閃

前兩個工作很大,但使閃光燈相機參數時,沒有像在「Camera.PictureCallback」返回...... 事實上回調永遠不會觸發。

閃光燈閃光,一切似乎沒問題,但沒有收到圖像。

這是我onStartCommand:

public int onStartCommand(Intent intent, int flags, int startId) { 

    try { 
     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.TYPE_TOAST, 
       WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
         | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
         | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
       PixelFormat.TRANSLUCENT 
     ); 

     params.gravity = Gravity.TOP | Gravity.START; 
     params.width = 1; 
     params.height = 1; 
     params.x = 0; 
     params.y = 0; 
     sv = new SurfaceView(getApplicationContext()); 

     windowManager.addView(sv, params); 
     SurfaceHolder sHolder = sv.getHolder(); 
     sHolder.addCallback(this); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return START_NOT_STICKY; 
} 

這是我的相機初始化代碼:

   myCamera = Camera.open(); 

       if (myCamera != null) { 
        myCamera.setPreviewDisplay(sv.getHolder()); 
        Camera.Parameters parameters = myCamera.getParameters(); 

        parameters.setFlashMode(FLASH_MODE_ON); 
        parameters.setPictureFormat(ImageFormat.JPEG); 
        parameters.setJpegQuality(70); 

        // set camera parameters 
        myCamera.setParameters(parameters); 

        myCamera.startPreview(); 
        myCamera.setErrorCallback(errorCallBack); 
        myCamera.takePicture(mShutter, null, mCall); 
       } 
+0

如果是這樣,那麼你可能想要設置閃光模式爲:FLASH_MODE_ON而不是FLASH_MODE_AUTO。 – Barns

+0

是的,代碼被稱爲... 「FLASH_MODE」是一個變量集從捆綁額外...並設置爲「FLASH_MODE_ON」當啓用閃光燈 – Abuzaid

+0

我有3個案例: 前凸輪(FLASH_MODE_OFF) - 主凸輪(FLASH_MODE_AUTO) - Main + Flash(FLASH_MODE_ON) – Abuzaid

回答

0

我用下面的代碼,它正在三星Galaxy 6,7; Moto G4,LG(我不記得模型)。

public void onMyClick(View v){ 
     startTakingPictures(); 
    } 


    private void startTakingPictures() { 
     try { 
      android.hardware.Camera cam = android.hardware.Camera.open(); 
      if (cam != null) { 

       int presentOrientation = getResources().getConfiguration().orientation; 

       SurfaceView sv = new SurfaceView(getBaseContext()); 
       cam.setPreviewDisplay(sv.getHolder()); 
       Camera.Parameters para = cam.getParameters(); 

       para.setRotation(ORIENTATIONS.get(presentOrientation)); 
       para.setFlashMode(Camera.Parameters.FLASH_MODE_ON); 
//    Log.e(TAG, "lat lng == " + loc.getLatitude()); 
//    para.setGpsLatitude(loc.getLatitude()); 
//    para.setGpsLongitude(loc.getLongitude()); 
       cam.setParameters(para); 

       cam.startPreview(); 
       cam.takePicture(null, null, getJpegCallBack()); 
      } 

     } 
     catch (Exception ex){ 
      Log.e(TAG, ex.getMessage()); 
     } 
    } 

    private Camera.PictureCallback getJpegCallBack() { 
     Camera.PictureCallback jpg = new Camera.PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       FileOutputStream fos; 

       String path = getPathBaseName(); 
       if(path.isEmpty()){ 
        return; 
       } 

       path = "image.jpg"; 
       Log.e(TAG, "Image path == " + path); 

       try { 
        fos = new FileOutputStream(path); 
        fos.write(data); 
        fos.close(); 
       } 
       catch (Exception ex) { 
        Log.e(TAG, ex.getMessage()); 
       } 
      } 
     }; 
     return jpg; 
    } 

編輯:

由於Camera現在貶值了你可能要實現android.hardware.camera2

看起來您的設備可以支持的參數類型有問題。看看閃光燈的有效參數:

Camera.Parameters para = cam.getParameters();  
    for(String s : para.getSupportedFlashModes()){ 
     Log.e(TAG, "Supported Flash Mode = " + s); 
    } 

您可能需要設定閃光模式是這樣的:

param.set("flash-mode", "on"); 
cam.setParameters(param); 

除此之外,你可能要退房卡爾·實施莫里森在這篇文章中: Android camera: stopPreview vs releaseCamera

+0

我用這個代碼...(同樣的問題)...它在No_Flash_Mode上工作正常... 但是,當啓用閃存時,設備在takePicture()方法後掛起。 在stopPreview()..和相機設備凍結..即使主相機應用程序無法啓動和使用相機。 它給出了一個錯誤:「相機資源不是免費的,請關閉應用程序....等」 – Abuzaid

+0

在我發佈的代碼中沒有'stopPreview()'方法。可悲的是我無法複製你的問題。我在循環中使用此代碼,並且每3秒鐘拍攝一張照片,而沒有任何問題。你可以發佈你的logcat的錯誤? – Barns