2014-10-05 409 views
5

在我的应用程序中的一个需求中,我需要弹出一个包含前置摄像头预览的活动,同时我需要打开手电筒为well.However我观察,我能打开手电筒和相机背面上,但没有前置摄像头和闪光灯together.Following是我的代码:如何在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); 
      } 
     } 
    } 

清单

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

哪有我打开手电筒和前门同时?任何帮助,将不胜感激 !

+0

看看这个答案:http://stackoverflow.com/a/25020259/1116216 – 2014-11-09 10:43:02

+0

@MicheleLaFerla:在这里,我相信他们使用的“摄像头= Camera.open(); ',默认打开背部相机。我需要使用前部凸轮。另外,我观察到使用前部凸轮对象创建的参数不能帮助我打开/关闭编辑答案的手电筒 – Basher51 2014-11-09 14:32:31

+0

。 – 2014-11-09 14:35:35

回答

1

手电筒

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

摄像头:

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

对于代码行'final参数p = camera.getParameters();' ,你使用camera = Camera.open()吗? 。如果是这样,那打开背部相机,这个参数'p'不能帮助打开/关闭手电筒,因为它来自后凸轮的物体。请纠正我,如果我错了。 – Basher51 2014-11-09 12:22:45

1

尝试打开手电筒在后台打开您的前置摄像头。 实际上,您可以在后台打开前置摄像头和手电筒。

这里如何在背景打开手电筒:this

这里如何在背景打开相机:this

+0

在这两个共享的链接中,我都看到相机对象是使用'camera = Camera.open();'创建的,我相信这是默认打开后凸轮。使用这个后置相机对象创建的参数并没有帮助我打开/关闭手电筒。我试了一样,如我的问题所示。如果我错了,请纠正我。 – Basher51 2014-11-09 12:41:08

0

以下代码检查了前置摄像头的情况下:

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

然后在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" /> 

注意:此功能在姜饼(2.3)和Android版本中可用。

我推荐使用类似于this示例中的surfaceView来实现工作手电筒。

希望这有助于:)

+0

我的代码行 - 'cameraId = AppFunctions.findFrontFacingCamera();'函数获取前置摄像头的ID,并且其工作正常。我面临的问题是,当我创建一个参数'params = camera.getParameters();'这个使用了前置摄像头对象。当这个参数被用来打开/关闭手电筒时,它不起作用。这个参数是来自后置摄像头对象,然后手电筒正在工作。 – Basher51 2014-11-09 14:46:04

+0

它应该打开前置摄像头,因为您正在循环可用摄像头的数量。 – 2014-11-09 14:48:18

+0

Yes agree.All这是工作正常,我可以打开前摄像头。但在这个阶段,当我创建参数使用前摄像头对象(params = camera.getParameters();),然后当它用于手电筒(params.setFlashMode(Parameters.FLASH_MODE_TORCH);),我观察到我无法操作手电筒。 – Basher51 2014-11-09 14:50:49

相关问题