2017-10-09 10 views
1

J'ai un service qui prend l'image en arrière-plan ... Ce service fonctionne en trois modes:Prenez la photo avec flash ne fonctionne pas

  1. came avant
  2. Retour à came
  3. Retour à came avec fLASH

les deux premiers grand travail, mais lors de l'activation flash pour les paramètres de l'appareil photo, aucune image est retournée dans le « Camera.PictureCallback » ... en fait, le rappel est jamais déclenché.

Le flash se déclenche et tout semble OK, mais aucune image n'est reçue.

Ceci est mon 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; 
} 

Ceci est mon code d'initialisation de la caméra:

   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

Si c'est le cas, vous voudrez peut-être régler le mode flash sur: FLASH_MODE_ON au lieu de FLASH_MODE_AUTO. – Barns

+0

Oui, le code est appelé ... "FLASH_MODE" est un ensemble de variables à partir d'extras ... et il est réglé sur "FLASH_MODE_ON" lors de l'activation du flash – Abuzaid

+0

J'ai 3 cas: Caméra avant (FLASH_MODE_OFF) - Caméra principale (FLASH_MODE_AUTO) - Principal + Flash (FLASH_MODE_ON) – Abuzaid

Répondre

0

J'utilise le code suivant et il fonctionne sur Samsung Galaxy 6, 7; Moto G4, LG (je ne me souviens plus du modèle).

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; 
    } 

EDIT:

Depuis Camera est maintenant dépréciée que vous pouvez mettre en œuvre android.hardware.camera2.

Il semble que vous ayez un problème avec le type de paramètres pris en charge par votre appareil. Jetez un oeil sur les paramètres de flash disponibles:

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

vous pourriez avoir besoin pour régler le mode flash comme ceci:

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

En plus de cela, vous pouvez check-out la mise en œuvre par Karl Morrison dans ce post: Android camera: stopPreview vs releaseCamera

+0

J'ai utilisé ce code ... (même problème) ... Cela fonctionne très bien sur No_Flash_Mode ... Cependant, lors de l'activation de Flash, le périphérique se bloque après la méthode takePicture(). à l'arrêtPreview() .. et l'appareil photo se bloque .. Même l'application principale de la caméra ne peut pas démarrer et utiliser l'appareil photo. Il donne une erreur: "La ressource de la caméra n'est pas gratuite, veuillez fermer l'application .... etc" – Abuzaid

+0

Dans le code que j'ai posté il n'y a pas de méthode 'stopPreview()'. Malheureusement, je ne peux pas reproduire votre problème. J'utilise ce code dans une boucle et il prend une photo toutes les 3 secondes sans problèmes. Pourriez-vous poster votre logcat de l'erreur? – Barns