2014-10-05 17 views
5

einschalten In einer der Voraussetzung in meiner App muss ich eine Aktivität mit der Frontkamera Vorschau Pop-up, zu dieser Zeit muss ich die Taschenlampe als einschalten well.However ich beobachten, dass, ich bin auf der Taschenlampe und Kamera zurück drehen können, aber nicht Front-Kamera und Taschenlampe together.Following ist mein Code:Wie Taschenlampe und Frontkamera zur gleichen Zeit 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); 
      } 
     } 
    } 

Manifest

<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" /> 

Wie kann Ich schalte die Taschenlampe und die Front ca m gleichzeitig? Jede Hilfe wäre willkommen!

+0

bei dieser Antwort einen Blick: http://stackoverflow.com/a/25020259/1116216 –

+0

@MicheleLaFerla: Hier Ich glaube, sie verwenden ‚Kamera = Camera.open(); ', die standardmäßig die hintere Kamera öffnet. Ich muss stattdessen die Front-Cam verwenden. Darüber hinaus beobachte ich, dass ein Parameter, der mit der Front-Cam-Objekt erstellt nicht hilft mir, auf/aus der Taschenlampe – Basher51

+0

bearbeitet die Antwort. –

Antwort

1

Taschenlampe

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

Kamera:

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

Für die Codezeile 'final Parameter p = camera.getParameters();' , verwenden Sie camera = Camera.open()? . Wenn ja, öffnet das die hintere Kamera und dieser Parameter 'p' hilft nicht beim Ein-/Ausschalten der Taschenlampe, da sie vom Objekt der hinteren Kamera kommt. Bitte korrigieren Sie mich, wenn ich falsch liege. – Basher51

1

Versuchen Sie, auf die Taschenlampe im Hintergrund drehen dann öffnen Sie Ihre Frontkamera. tatsächlich können Sie Frontkamera und Taschenlampe im Hintergrund drehen.

Hier wie Taschenlampe im Hintergrund zu öffnen: this

Hier wie auf Kamera im Hintergrund drehen: this

+0

In beiden Links, die Sie freigegeben haben, sehe ich, dass das Kameraobjekt mit 'camera = Camera.open();' erstellt wird. Dies ist, glaube ich, die Back-Cam standardmäßig geöffnet.Ein Parameter, der mit dieser Kamera zurück Objekt zu erstellen, hat nicht geholfen Ich habe die Taschenlampe ein- und ausgeschaltet.Ich habe das gleiche versucht, wie in meiner Frage gezeigt. Bitte korrigiere mich, wenn ich falsch liege. – Basher51

0

Der folgende Code überprüft die Verfügbarkeit einer Frontkamera:

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

Fügen Sie dann die folgenden Berechtigungen in der Datei AndroidManifest.xml hinzu:

<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" /> 

Hinweis: Diese Funktion ist in Gingerbread (2.3) und Up Android Version verfügbar.

Ich empfehle die Verwendung von SurfaceView wie in this Beispiel, um eine funktionierende Taschenlampe zu implementieren.

this helps :)

+0

Die Zeile in meinem Code - 'cameraId = AppFunctions.findFrontFacingCamera();' Funktioniert, um die ID der Frontkamera zu holen, und es funktioniert gut. Das Problem, das ich gegenüberstelle, ist, dass, wenn ich einen Parameter erstelle, 'params = camera.getParameters();' Dies verwendet das Front-Kamera-Objekt. Wenn dieser Parameter zum Ein-/Ausschalten der Taschenlampe verwendet wird, funktioniert es nicht. Wenn dieser Parameter vom Objekt der Rückkamera stammt, dann funktioniert die Taschenlampe. – Basher51

+0

Es soll die Frontkamera öffnen, während Sie die Anzahl der verfügbaren Kameras durchlaufen. –

+0

Ja einverstanden.Alles, das gut funktioniert und ich bin in der Lage, die Frontkamera zu öffnen. Aber in diesem Stadium, wenn ich den Parameter mit dem Frontkamera-Objekt (params = camera.getParameters();) und dann bei der Verwendung für erstellen Taschenlampe (params.setFlashMode (Parameters.FLASH_MODE_TORCH);), beobachte, dass ich die Taschenlampe nicht bedienen kann. – Basher51

Verwandte Themen