2014-10-05 13 views
5

In uno dei requisiti della mia app ho bisogno di far apparire un'attività contenente l'anteprima della fotocamera frontale, in questo stesso momento ho bisogno di accendere la torcia come well.However osservo che, sono in grado di accendere la fotocamera torcia elettrica e di nuovo, ma non fotocamera frontale e la torcia elettrica together.Following è il mio codice:Come accendere contemporaneamente torcia e fotocamera frontale in Android

public class Cam extends Activity { 

     private static int cameraId = 0; 
     private Camera camera; 

     //Adding for camera preview 
     public static FrameLayout preview; 
     public static CameraPreview mPreview; 
     Context context; 

     ImageButton btnSwitch; 
     private boolean isFlashOn; 
     private boolean hasFlash; 
     Parameters params; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      Log.e("Cam","Inside onCreate"); 
      setContentView(R.layout.cam); 
      context = getApplicationContext();  

      btnSwitch = (ImageButton) findViewById(R.id.btnSwitch); 

      hasFlash = getApplicationContext().getPackageManager() 
        .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

      startCamera(); 

      // displaying button image 
      toggleButtonImage();   

      btnSwitch.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if (isFlashOn) { 
         turnOffFlash(); 
        } else { 
         turnOnFlash(); 
        } 
       } 
      });  
     } 

     @Override 
     protected void onPause() { 
      super.onPause(); 

      turnOffFlash(); 

      Log.e("Cam","Inside onPause"); 
      try { 
       if (camera != null) { 
        camera.release(); 
        camera = null; 
        preview.removeView(mPreview); 
       } 

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

     @Override 
     protected void onResume() { 
      super.onResume(); 

      Log.e("Cam","Inside onResume"); 
      try { 
       if(camera ==null) { 
        Log.d("Cam","in resume,camera is null"); 
        try { 
         camera = android.hardware.Camera.open(cameraId); //opens front cam    
         // camera = Camera.open(); when I use this I can on/off the flashlight,since I am using the back camera. 
         mPreview = new CameraPreview(this, camera); 
         preview = (FrameLayout) findViewById(R.id.camera_preview); 
         preview.addView(mPreview); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     protected void onDestroy() { 
      super.onDestroy(); 
      Log.e("Cam","Inside onDestroy"); 
      if (camera != null) { 
       try { 
        camera.release(); 
        camera = null; 
        preview.removeView(mPreview); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     private void startCamera() { 

        Log.e("Cam","Inside doInBackground"); 
        String msg = ""; 
        // Do we have a camera? 
        try { 
         if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 

         } else { 
          cameraId = AppFunctions.findFrontFacingCamera();//A function that returns 0 for front camera 
          if (cameraId < 0) { 

          } else { 

           try { 
            camera = Camera.open(cameraId);//opens front cam 
            // camera = Camera.open(); when I use this I can on/off the flashlight,since I am calling the back camera. 
            params = camera.getParameters(); 
            Log.e("Cam","camera id" + cameraId); 
            Log.e("Cam","params" + params); 
           } catch (Exception e) { 
            e.printStackTrace(); 
           } 

           try { 
            mPreview = new CameraPreview(getApplicationContext(), camera); 
            preview = (FrameLayout) findViewById(R.id.camera_preview); 
            preview.addView(mPreview); 
           } catch (Exception e) { 
            e.printStackTrace(); 
           } 
          } 
         } 
        } catch (Exception e3) { 
         e3.printStackTrace(); 
        } 
     } 

     private void turnOnFlash() { 
      Log.v("Cam","Inside turnOnFlash"); 
      if (!isFlashOn) { 
       if (camera == null || params == null) { 
        Log.v("Cam","camera or param is null"); 
        return; 
       } 

       params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
       camera.setParameters(params); 
       camera.startPreview(); 
       isFlashOn = true; 

       // changing button/switch image 
       toggleButtonImage(); 
      } 

     } 

     /* 
     * Turning Off flash 
     */ 
     private void turnOffFlash() { 
      Log.v("Cam","Inside turnOffFlash"); 
      if (isFlashOn) { 
       if (camera == null || params == null) { 
        Log.v("Cam","camera or param is null"); 
        return; 
       } 
       params.setFlashMode(Parameters.FLASH_MODE_OFF); 
       camera.setParameters(params); 
       camera.stopPreview(); 
       isFlashOn = false; 

       // changing button/switch image 
       toggleButtonImage(); 
      } 
     } 

     private void toggleButtonImage(){ 
      if(isFlashOn){ 
       btnSwitch.setImageResource(R.drawable.btn_switch_on); 
      }else{ 
       btnSwitch.setImageResource(R.drawable.btn_switch_off); 
      } 
     } 
    } 

manifesto

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.front" /> 
<permission android:name="android.permission.FLASHLIGHT" /> 

Come può Accendo la torcia e la parte anteriore ca m simultaneamente? Qualsiasi aiuto sarebbe apprezzato !

+0

un'occhiata a questa risposta: http://stackoverflow.com/a/25020259/1116216 –

+0

@MicheleLaFerla: Ecco io credo che usano 'fotocamera = Camera.open(); ', che apre di default la fotocamera posteriore. Ho bisogno di utilizzare la camma anteriore invece. Inoltre, osservo che un parametro creato utilizzando l'oggetto cam anteriore non mi aiuta a on/off la torcia elettrica – Basher51

+0

modificato la risposta. –

risposta

1

Torcia

public void onToggleClicked(View view) { 
    PackageManager pm = context.getPackageManager(); 
    final Parameters p = camera.getParameters(); 
    if (isFlashSupported(pm)) { 
     boolean on = ((ToggleButton) view).isChecked(); 
     if (on) { 
      Log.i("info", "torch is turn on!"); 
      p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(p); 
      camera.startPreview(); 
     } else { 
      Log.i("info", "torch is turn off!"); 
      p.setFlashMode(Parameters.FLASH_MODE_OFF); 
      camera.setParameters(p); 
      camera.stopPreview(); 
     } 

fotocamera:

ImageButton ib = (ImageButton) findViewById(R.id.buttonToast); 
    ib.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(i, CAPTURE_IMAGE_CAPTURE_CODE); 
     } 
    }); 
+0

Per la riga di codice 'Parametri finali p = camera.getParameters();' , stai usando camera = Camera.open()? . Se è così, questo apre la fotocamera posteriore e questo parametro 'p' non aiuta a accendere/spegnere la torcia dal suo arrivo dall'oggetto di back cam. Per favore correggimi se sbaglio. – Basher51

1

cerca di accendere la torcia in background quindi aprire la fotocamera anteriore. in realtà è possibile attivare la fotocamera frontale e torcia in background.

Ecco come aprire torcia in background: this

Ecco come accendere fotocamera in background: this

+0

In entrambi i link che hai condiviso vedo che l'oggetto camera è stato creato usando 'camera = Camera.open();'. Questo credo apra la back cam di default. Un parametro creato usando questo oggetto per telecamere non ha aiutato ho acceso e spento la torcia. Ho provato la stessa cosa, come mostrato nella mia domanda.Pls correggimi se sbaglio. – Basher51

0

Il seguente codice controlla per la disponibilità di una fotocamera frontale:

private Camera openFrontFacingCameraGingerbread() { 
    int cameraCount = 0; 
    Camera cam = null; 
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
    cameraCount = Camera.getNumberOfCameras(); 
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
     Camera.getCameraInfo(camIdx, cameraInfo); 
     if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      try { 
       cam = Camera.open(camIdx); 
      } catch (RuntimeException e) { 
       Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); 
      } 
     } 
    } 

    return cam; 
} 

Quindi aggiungere le seguenti autorizzazioni nel file AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" android:required="false" /> 
<uses-feature android:name="android.hardware.camera.front" android:required="false" /> 

Nota: questa funzione è disponibile in Gingerbread (2.3) e nella versione Up di Android.

Si consiglia di utilizzare surfaceView come nell'esempio this per implementare una torcia funzionante.

Spero che questo aiuti :)

+0

La riga nel mio codice - 'cameraId = AppFunctions.findFrontFacingCamera();' fa la funzione di recuperare l'id della telecamera anteriore, e funziona bene. Il problema che sto affrontando è che quando creo un parametro, 'params = camera.getParameters();' questo utilizza l'oggetto della fotocamera frontale. Quando questo parametro viene utilizzato per accendere/spegnere la torcia non funziona. Questo parametro è stato dall'oggetto della fotocamera posteriore, quindi la torcia funziona. – Basher51

+0

si suppone di aprire la fotocamera anteriore mentre si sta eseguendo il ciclo sul numero di telecamere disponibili. –

+0

Sì concordato.Tutto ciò funziona bene e sono in grado di aprire la fotocamera frontale.Ma a questo punto in cui sto creando il parametro utilizzando l'oggetto della fotocamera frontale (params = camera.getParameters();) e quindi quando lo si utilizza per torcia (params.setFlashMode (Parameters.FLASH_MODE_TORCH);), osservo che non sono in grado di far funzionare la torcia. – Basher51

Problemi correlati